А-закон — алгоритм стиснення зі втратою інформації, застосовується для стиснення звукових даних.
Реалізації для 16-бітових знакових цілих
Принцип кодування схожий на кодування чисел з рухомою комою. Кожен семпл кодується у 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
Див. також
Посилання