5.6.3 Арифметичне кодування

При арифметичному стисненні повідомлень алфавіту джерела ставиться у відповідність числовий, відкритий справа, інтервал [0,1), а кожен символ алфавіту зіставляється з різними ділянками цієї числової осі. Ширина інтервалу (діапазон) кожної ділянки залежить від імовірності (частоти) появи символу в повідомленні.

Розглянемо, як приклад, алфавіт, що складається із шести символів A, B, С, D, E, ! з імовірностями появи відповідно 0,1; 0,1; 0,3; 0,2; 0,2 та 0,1. Тоді інтервал [0,1) може бути розділений на ділянки таким чином:

A: [0, 0,1), B: [0,1, 0,2), С: [0,2, 0,5),

D: [0,5, 0,7), E: [0,7, 0,9), !: [0,9, 1,0).

Розподіл числової осі ілюструється рис. 5.18. Як видно з прикладу, поділ одиничного інтервалу зручно здійснюється підсумовуванням імовірності кожного з границею попереднього.

Рисунок 5.18 – Розподіл відрізків числової осі між символами при арифметичному кодуванні

У процесі стиснення рядок текстового повідомлення подається двома дробовими числами, що відображають деякий інтервал числової осі [0, 1). До початку кодування допустимою областю для повідомлення є інтервал [0, 1). При надходженні від джерела першого символу йому виділяється інтервал, що відповідає розташуванню цього символу на осі [0, 1) відповідно до імовірності появи його в повідомленні. Надходження наступного символу звужує виділений інтервал. При цьому границі нового інтервалу визначаються числовим діапазоном, що відповідає черговому символу, тобто ширина діапазону пропорційна імовірності символу. З приходом наступного символу відбувається подальше звуження інтервалу. Таким чином, із збільшенням довжини рядка, що кодується, відбувається постійне звуження інтервалу. Теоретично його можна звужувати як завгодно довго, а на практиці цей інтервал обмежується технічними можливостями кодувальних пристроїв (розрядністю слова).

Число бітів, необхідне для подання інтервалу шириною s, дорівнює . Основа логарифму тут і в наступних виразах дорівнює 2. Ширина s останнього інтервалу рядка повідомлення, що складається з символів визначається добутком ймовірностей символів повідомлення

.

В зв’язку з цим можна записати, що

,

де m – кількість різних символів повідомлення .

Таким чином, число бітів, затрачуване на кодування повідомлення, при арифметичному кодуванні в точності дорівнює ентропії джерела.

Розглянемо процедуру арифметичного стиснення на прикладі кодування рядка повідомлення (CADA!).

Тут символ ! є ознакою закінчення рядка. Імовірності появи символів і відповідні їм числові діапазони візьмемо з попереднього прикладу. Початковий числовий діапазон, який виділяється для кодера, дорівнює одиниці [0,1). Після надходження від джерела першого символу С числовий інтервал звужується до величини [0,2, 0,3). З приходом наступної букви А границі діапазону стають рівними [0,2, 0,23).

Процедура кодування наочно ілюструється на рис. 5.19. Вертикальні лінії відображають початкову числову вісь [0, 1) і її наступні ділянки в збільшеному розмірі (промасштабовані на одиничну вісь) на різних етапах кодування. Який би не був довгий рядок, кінцевий діапазон завжди буде розташований в інтервалі першого кодованого символу. Підрахунок інтервалів здійснюється за рекурентною формулою

де – нижня і верхня границі для попередньої ітерації;

– границі інтервалу нового символу.

Рисунок 5.19 – Ілюстрація процедури арифметичного кодування

Межі інтервалів для всіх етапів кодування наведені в табл.5.7. Таким чином, числовий інтервал з межами [0,21554-0,2156) відображає рядок повідомлення CADA! Для кодування цього рядка може бути використано будь-яке число з отриманого діапазону. Нехай таким числом є нижня межа інтервалу, тобто X = = 0,21554.

Таблиця 5.7 – Результати арифметичного кодування

Символи

Нижня межа інтервалу

Верхня межа інтервалу

Вихідний стан

0,0

1.0

С

0,2

0.5

А

0.2

0,23

D

0,215

0.221

А

0,215

0,2156

!

0,21554

0,2156

У процесі декодування здійснюється зворотна процедура ототожнення прийнятого числа (інтервалу) із закодованим рядком символів. Очевидно, що на приймальній стороні повинні бути відомі ймовірності декодованих символів і відповідні їм інтервали числової осі [0,1). Нехай на вхід декодера надійшло число X = 0,21554. Оскільки воно перебуває в діапазоні 0,2 - 0,5, тобто 0,2X<0,5, то на вихід декомпресора видається символ С. Потім декодер визначає, в яку відносну частку відрізка [0,2 – 0,5) потрапляє число 0,21554, для цього він робить обчислення за формулою

, (5.7)

де – відносне значення числа X на черговій ділянці числової осі.

У нашому випадку = (0.21554 - 0,2) / 0,3 = = 0,0518. Оскыльки 0 < X < 0,1, то на вихід декомпресора надходить символ А. Неважко помітити, що процедура визначення вихідного символу рекурентна, при якій після знаходження першого діапазону для заданого числа X на одиничній числовій осі визначається відносна частка (діапазон) цієї частини відрізка, куди потрапляє декодоване повідомлення.

Обчислення на наступному кроці проводиться за формулою (5.7) з припущенням, що X= де  – відносне значення числа, знайденого в попередній ітерації. Нові значення Xmin і Xmax визначаються межами інтервалу, ідентифікованого на попередній ітерації. На цьому кроці X = 0,0518, Xmin = 0, Xmax = 0,1, а = 0,0518/0,1 = 0,518. Нове відповідає символу D, оскільки 0,5 < < 0,7.

Далі, вважаючи, , , , знайдемо аналогічно , що відповідає символу А. Оскільки на наступній ітерації , то декодер виводить символ !.

У зв'язку з тим, що символ ! є ознакою закінчення рядка повідомлення, то декодування на цьому закінчується.

Провести компресію і декомпресію повідомлення ”ІНФОРМАЦІЯ”, використовуючи метод арифметичного кодування.

Визначимо ймовірності появи символів у заданому повідомленні і розподілимо символи на одиничному відрізку (табл. 5.8). На підставі алгоритму кодування розрахуємо нижні і верхні границі кодового числа, що відображає стисле повідомлення, в залежності від кількості закодованих символів.

Таблиця 5.8 – Розподіл символів на одиничному відрізку

Символи

Вірогідність появи

Розташування на відрізку

А

0,1

0,0Х<0,1

І

0,2

0,1 Х<0,3

М

0,1

0,3Х<0,4

Н

0,1

0,4Х<0,5

О

0,1

0,5 Х< 0,6

Р

0,1

0,6Х<0,7

Ф

0,1

0,7 X < 0,8

Ц

0,1

0,8 X < 0,9

Я

0,1

0,9Х<1,0

Дані розрахунку зведемо в табл. 5.9. Як кодове число, що відображає стисле повідомлення, приймемо нижню межу цього числа: 0.1951261656.

Таблиця 5.9 – Дані розрахунку

Символи

Нижня границя інтервалу

Верхня границя інтервалу

Початковий стан

0,0

1,0

І

0,1

0,3

Н

0,18

0,2

Ф

0,194

0,196

О

0,1950

0,1952

Р

0,19512

0,19514

М

0,195126

0,195128

А

0,195126

0,1951262

Ц

0.19512616

0,19512618

І

0,195126162

0,195126166

Я

0,1951261656

0,195126166

Використовуючи алгоритм декодування, зробимо процедуру декомпресії, етапи якої наведено в табл. 5.10.

Таблиця 5.10 – Результати процедури декомпресії

Кодове число

Вихідний символ

Нижня границя

Верхня границя

Інтервал

0,1951261656

І

0,1

0,3

0,2

0,4756300828

Н

0,4

0,5

0,1

0.75630828

Ф

0,7

0,8

0,1

0,5630828

О

0,5

0,6

0,1

0 630828

Р

0,6

0,7

0,1

0,30828

М

0,3

0,4

0,1

0,0828

А

0,0

0,1

0,1

0,828

Ц

0,8

0,9

0,1

0.28

І

0,1

0,3

0.2

0.9

Я

0,9

1,0

0,1

0,0 – кінець декодування