Алгоритм на псевдокоде

Арифметическое кодирование

Обозначим:

li - нижняя граница отрезка, соответствующего i- той букве исходного      

сообщения;

hi - верхняя граница этого отрезка;

ri - длина отрезка [li, hi);

m - порядковый номер кодируемой буквы в алфавите источника;

Q – массив для величин Qi.

 

    l0:=0; h0:=1; r0:=1; i:=0

    DO (not EOF)

    C:=Read() (читаем следующий символ из файла)

    i:=i+1

    DO (j=1,…,n)

              IF (C=aj) m:=j FI

    OD

    li = li-1 + ri-1·Q [m-1]

    hi = li-1 + ri-1·Q [m]

    ri = hi - li

    OD

 

В начале декодирования известен конечный интервал, например, [0.56112; 0.5616) или любое число из этого интервала, например, 0.56112. Сразу можно определить, что первым закодированным символом был а 3, так как число 0.56112 лежит в интервале [0.5; 0.7), выделенном символу а 3. Затем в качестве интервала берется [0.5; 0.7) и в нем определяется диапазон, соответствующий числу 0.56112. Это интервал [0.52, 0.6), выделенный символу а 2 и т.д. Для декодирования необходимо знать количество закодированных символов и исходные вероятности символов.

Арифметическое декодирование

Обозначим:

li - нижняя граница отрезка, соответствующего i- той букве исходного

сообщения;

hi - верхняя граница этого отрезка;

ri - длина отрезка [li, hi);

Q – массив для величин Qi;

length – количество закодированных символов;

value – значение из входного файла.

 

    l0:=0; h0:=1; r0:=1;

    value:=ReadCode();  (читаем код из файла)

    DO (i=1,…,length)

    DO (j=1,…,n)

              li = li-1 + ri-1·Q [j-1]

              hi = li-1 + ri-1·Q [j]

              ri = hi - li

                       IF ((li <= value) и (value< hi ) OD FI

              OD

              Write(a[i])  (пишем символ в выходной файл)

    OD

 

При реализации арифметического кодирования возникают две проблемы:

− необходима арифметика с плавающей точкой теоретически неограниченной точности;

− результат кодирования становится известен только после окончания входного потока.

Для решения этих проблем реальные алгоритмы работают с целыми числами и оперируют с дробями, числитель и знаменатель которых являются целыми числами (например, знаменатель равен 10000h = 65536, l 0 = 0, h 0=65535). При этом с потерей точности можно бороться, отслеживая сближение li и hi и умножая числитель и знаменатель представляющей их дроби на одно и то же число, например на 2. С переполнением сверху можно бороться, записывая старшие биты li и hi в файл только тогда, когда они перестают меняться (т.е. уже не участвуют в дальнейшем уточнении интервала), когда li и hi одновременно находятся в верхней или нижней половине интервала.

Порядок выполнения работы

1. Изучить теоретический материал.

2. Закодировать арифметическим кодом текст на английском языке, использовать файл не менее 1 Кб.

3. Вычислить коэффициент сжатия данных как процентное отношение длины закодированного файла к длине исходного файла.

4. Определить зависимость коэффициента сжатия данных от длины блока при арифметическом кодировании.

5. Декодировать файл, закодированный арифметическим кодом, и сравнить полученный файл с исходным текстом на английском языке.

Контрольные вопросы

1. Как зависит средняя длина кодового слова от длины блока при арифметическом кодировании?

2. Как формируется кодовое слово для последовательности символов при арифметическом кодировании?

3. Сколько двоичных разрядов необходимо взять для арифметического кодирования k исходных символов, чтобы декодирование было возможным?

4. Как осуществляется арифметическое декодирование?

5. Какие проблемы возникают при реализации арифметического кодирования?

 

 

Лабораторная работа № 3

Тема: Код Шеннона.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: