A-закон
А-закон — алгоритм стиснення зі втратою інформації, застосовується для стиснення звукових даних.
Принцип кодування схожий на кодування чисел з рухомою комою. Кожен семпл кодується у 8-бітове поле. Старший біт — біт знака, наступні 3 біти — беззнакова експонента, останні 4 — мантиса. Таким чином з використовуваних 16 біт, тільки 12 біт містять значущу інформацію, а 4 біти з 16 іноді відкидаються.
- Крок 1
Якщо число від'ємне, його обертають, при цьому приймається, що s = 0, інакше s = 1.
- Крок 2
16-бітове число перетворюється на 8-бітове відповідно до такої таблиці (для наочності півбайти — нібли — розділено знаком зворотного апострофа (`); s — знаковий біт; зірочками показано біти, що губляться при стисканні):
Початкове число | Стиснене |
---|---|
s000`0000`wxyz`**** | s000`wxyz |
s000`0001`wxyz`**** | s001`wxyz |
s000`001w`xyz*`**** | s010`wxyz |
s000`01wx`yz**`**** | s011`wxyz |
s000`1wxy`z***`**** | s100`wxyz |
s001`wxyz`****`**** | s101`wxyz |
s01w`xyz*`****`**** | s110`wxyz |
s1wx`yz**`****`**** | s111`wxyz |
- Крок 3
Біти інвертуються через один, починаючи від правого (тобто з 8-бітовим числом виконується операція XOR 0x55).
У прикладах нижче підрядковий індекс позначає розрядність (десяткове чи двійкове); на 1 кроці підкреслено мантису (частину цифр, що переходить у wxyz на 2 кроці).
- Приклад 1
- 66610 = 0000 `0010'1001'10102
- Крок 1. Знаковий біт s = 1: 0000'0010'1001'10102
- Крок 2. Власне стискання (відповідає s001'wxyz): 1010'01002
- Крок 3. Інвертування: 1111'00012 = F116 = 24110 .
- Приклад 2
- —666610 = 1110'0101'1111'01102
- Крок 1. Число обертаємо, знаковий біт s = 0: 0001`1010`0000'10012
- Крок 2. Власне стискання (відповідає s011'wxyz): 0101'10102
- Крок 3. Інвертування: 0000'11112 = 1510
- Waveform Coding Techniques — подробиці реалізації (проте рівняння A-закону помилкове)
- Реалізація A-закону мовою C зі зразком коду