Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-1 Теория информации и кодирования / ЛБ / ЛБ2 / Release / 2_ИССЛЕДОВАННИЕ МЕТОДОВ ПОСИМВОЛЬНОГО ЭФФЕКТИВНОГО КОДИРОВАНИЯ.doc
Скачиваний:
81
Добавлен:
31.01.2021
Размер:
563.2 Кб
Скачать

Неравномерное кодирование для последовательности сообщений

В этом параграфе мы перейдем к решению задачи кодирования последовательностей сообщений. Разумеется, если мы рассматриваем стационарный источник и его распределение вероятностей на буквах не меняется от буквы к букве, то любой из описанных выше способов кодирования может быть использован для кодирования отдельных сообщений источника. Во многих случаях именно такой подход используется на практике как самый простой и достаточно эффективный.

В то же время, можно выделить класс ситуаций, когда побуквенное кодирование заведомо неоптимально. Во-первых, из теоремы об энтропии на сообщение стационарного источника следует, что учет памяти источника потенциально может значительно повысить эффективность кодирования. Во-вторых, побуквенные методы затрачивают как минимум 1 бит на сообщение, тогда как энтропия на сообщения может быть значительно меньше 1.

Итак, рассмотрим последовательность x1, x2, …, xi X = {xi}, наблюдаемую на выходе дискретного стационарного источника, для которого известно вероятностное описание, т.е. можно вычислить все многомерные распределения вероятностей и по ним – энтропию H(x) = H(X).

Пусть указан некоторый способ кодирования, который для любых n для каждой последовательности на выходе источника строит кодовое слово длины . Тогда средняя длина кода на сообщение, для блоков длины n определяется как

бит/сообщение источника.

Подбирая длину блоков, при которой средняя длина кода будет наименьшей, получаем следующее определение для средней длины кода на сообщение

.

(Мы пишем нижнюю грань inf вместо минимума, поскольку наименьшее значение скорости может достигаться в пределе при n  ).

Рассматриваемое кодирование называется FV-кодированием (fixed-to-variable), поскольку блоки из фиксированного числа сообщений n кодируются кодовыми словами переменной длины. Наша задача – связать достижимые значения средней скорости FV-кодирования с характеристиками источника, в частности, с его энтропией H(x) . Начнем с обратной теоремы кодирования.

Теорема 2.6. Для дискретного стационарного источника с энтропией H(x) для любого FV-кодирования имеет место неравенство

.

Прямая теорема кодирования.

Теорема 2.7. Для дискретного стационарного источника с энтропией H(x) и для любого > 0. существует способ неравномерного FV-кодирования такой, для которого

.

Итак, выбрав достаточно большую длину блоков n и применив к блокам побуквенное кодирование, мы получим кодирование со средней скоростью

,

где o(n)  0 при n  .

К сожалению, этот внешне оптимистический результат оказывается почти бесполезным при решении практических задач. Основное препятствие на пути его применения – это экспоненциальный рост сложности при увеличении длины блоков n. Поясним эту проблему следующим простым примером.

Предположим, что кодированию подлежат файлы, хранящиеся в памяти компьютера. Символы источника – байты и, значит, объем алфавита |X| = 28 = 256. При кодировании последовательностей длины n = 2 объем алфавита вырастает до |X2| = 216 = 65536. Далее при n = 3, 4, … объемы алфавита будут 224 = 16777216, 232 = 4294967296, …. Понятно, что работать с кодами таких размеров невозможно.

Описываемый в следующем параграфе метод арифметического кодирования позволяет эффективно кодировать блоки длины n с избыточностью порядка 2/n и со сложностью растущей только пропорционально квадрату длины блока n. За счет пренебрежимо малого проигрыша в средней длине кода на сообщение сложность может быть сделана даже линейной по длине кода. Неудивительно, что арифметическое кодирование все шире применяется в разнообразных системах обработки информации.

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

При кодировании кодом Шеннона-Фано и Хаффмана оптимальность будет обеспечена только в том случае, если вероятность появления кодируемых символов кратна 2n, n = -1, -2, … При произвольном значении вероятности появления символа условие оптимальности не выполняется.

Арифметическое кодирование обеспечивает более точное выполнение этого равенства при произвольной величине .

Рассмотрим для простоты дискретный постоянный источник, выбирающий сообщения из множества X = {1, …, N}, с вероятностями {P1, …, PN}. Наша задача состоит в кодировании последовательностей множества .

Мы хотели бы применить к ансамблю достаточно простой и эффективной побуквенный код. Упрощение состоит в том, ни кодер ни декодер не хранят и не строят всего множества из |Xn| кодовых слов. Вместо этого при передаче конкретной последовательности кодером вычисляется кодовое слово только для данной последовательности . Правило кодирования, конечно, известно декодеру и он восстанавливает по , не имея полного списка кодовых слов.

Идея арифметического кодирования заключается в следующем. Сообщения буквы в тексте встречаются с определенными вероятностями при этом справедливо равенство .

Интервал 0…1 разбивается на подинтервалы с длинами, равными вероятностям появления символов в потоке, которые называются диапазонами соответствующих символов. Выбирается диапазон для первого символа (буквы), определяется его начало и конец. Появление следующих символов уменьшает ширину этого диапазона. В конце текста образуется достаточно узкий диапазон и число, выбранное из этого диапазона в двоичном коде будет определять передаваемую кодовую комбинацию.

Например, символы “a”, “b”, “c” в потоке встречаются с вероятностями ; ; . Составим таблицу

Символ

Диапазон символа

“b”

0,6

0,0…0,6

“c”

0,3

0,6…0,9

“a”

0,1

0,9…1,0

Допустим, что необходимо закодировать текст “bcbab”. Для первого символа рабочий диапазон выбирается 0,0…0,6. Диапазон следующего символа “c” равен 0,6…0,9. В результате исходный диапазон 0,0…0,6 сужается по следующему правилу: начало нового диапазона равно началу исходного диапазона плюс начало диапазона следующей буквы , умноженное на разность конец исходного диапазона минус начало исходного диапазона

.

Конец нового диапазона определяется по правилу

Здесь - конец диапазона буквы “c”.

С поступлением каждой последующей i-ой буквы начало и конец диапазона определяется по правилу

;

.

В этом выражении и соответственно начало и конец диапазона передаваемой буквы “x”.

Для приведенного примера после буквы “c” педается буква “b”.

Начало и конец следующего диапазона будут равны

;

.

При передаче буквы “a” начало и конец диапазона равны

;

.

Последняя буква текста “b” имеет начало и конец диапазона текста равные

;

.

В этом диапазоне выбирается точка, значение которой определяется по формуле

.

Графически процесс кодирования показан на рис. 2.3

Рис.2.3 Графическая интерпретация арифметического кодирования

Двоичный код этого числа является кодовой комбинацией, обозначающей передаваемый текст.

Дробное число в двоичном коде записывается следующим образом:

.

Количество разрядов определяется необходимой точностью записи числа и чтобы это число попадало в интервал закодированного слова.

Для приведенного примера кодовая комбинация имеет вид 01110110. Этой кодовой комбинации соответствует число 0,4609375.

При таком кодировании длина полученного интервала равна произведению вероятностей всех встретившихся символов, а его начало зависит от порядка следования символов.

Определим алгоритм восстановления текста. При кодировании каждый следующий интервал вложен в предыдущий. Это означает, что если принято число 0,4609375, то первым символом в цепочке текста может быть только буква “b”, так как ее диапазон (0,0…0,6) включает это число. Перебором всех возможных символов по приведенной выше методике расчета определяем, что следующая буква “c” и т.д.

Обсудим кратко вопрос о сложности кодирования.

Из описания алгоритма следует, что на каждом шаге кодирования выполняется одно сложение и 2 умножения. Отсюда легко сделать неправильный вывод о том, что сложность кодирования последовательности из n сообщений пропорциональна n. Это неверно, поскольку на каждом шаге линейно растет сложность выполнения самих операций сложения и умножения, т.к. нарастает число двоичных разрядов, необходимых для записи операндов.

Предположим, что для представления вероятностей P1, …, PN использованы числа разрядности d. После первого шага кодирования точное представление Н и K потребует 2d разрядов, после n шагов кодирования кодер и декодер будут работать (в худшем случае) с числами разрядности nd, и, следовательно, суммарная сложность имеет порядок

.

Таким образом, можно говорить о том, что сложность арифметического кодирования пропорциональна n2. На самом деле, возможна практическая реализация арифметического кодирования со сложностью пропорциональной n.

Отметим еще одну чрезвычайно важную особенность арифметического кодирования. Его легко адаптировать к случаю источников с памятью. Если, например, в качестве модели источника рассматривается простая цепь Маркова, то алгоритм кодирования остается прежним за тем исключением, что вместо одномерных вероятностей P(xi) нужно использовать условные вероятности P(xi|xi-1).

Соседние файлы в папке Release