Примеры характерных шагов алгоритма арифметического кодирования
Рассмотрим такой пример.
1. Задать «текущий интервал» [0,1].
2. Повторить следующие действия для каждого символа s входного файла.
2.1. Разделить текущий интервал на части пропорционально вероятностям каждого символа.
2.2. Выбрать подинтервал, соответствующий символу 5, и назначить его новым текущим интервалом.
3. Когда весь входной файл будет обработан, выходом алгоритма объявляется любая точка, которая однозначно определяет текущий интервал (то есть, любая точка внутри этого интервала).
После каждого обработанного символа текущий интервал становится все меньше, поэтому требуется все больше бит, чтобы выразить его, однако окончательным выходом алгоритма является единственное число, которое не является объединением индивидуальных кодов последовательности входных символов. Среднюю длину кода можно найти, разделив размер выхода (в битах) на размер входа (в символах). Отметим, что вероятности, которые использовались на шаге 2.1, могут каждый раз меняться, и это можно использовать в адаптивной вероятностной модели. Следующий пример будет немного более запутанным.
Мы продемонстрируем шаги сжатия для строки «SWISS-MISS». Пять символов на входе можно упорядочить любым способом. Для каждого символа сначала вычислена его частота, затем найдена вероятность ее появления (частота, деленная на длину строки, 10). Область [0,1] делится между символами в любом порядке. Каждый символ получает кусочек или подобласть, равную его вероятности. Таким образом, символ «S» получает интервал [0.5,1.0] длины 0.5, а символу «I» достается интервал [0.2,0.4] длины 0.2. Столбец CumPreq (накопленные частоты) будет использоваться алгоритмом декодирования. CumPreq равно сумме частот всех предыдуш;их символов, например, для «W», CumFreq=l+l+2. Символы и частоты записываются в начало выходного файла до битов кода сжатия.
Процесс кодирования начинается инициализацией двух переменных Low и High и присвоением им О и 1, соответственно. Они определяют интервал [Low,High]. По мере поступления и обработки символов, переменные Low и High начинают сближаться, уменьшая интервал. После обработки первого символа «S», переменные Low и High равны 0.5 и 1, соответственно. Окончательным сжатым кодом всего входного файла будет число из этого интервала (0.5 < Code < < 1.0). Для лучшего понимания процесса кодирования хорошо представить себе, что новый интервал [0.5,1] делится между пятью символами нашего алфавита в той же пропорции, что и начальный интервал [0,1]. Результатом будет пять подынтервалов [0.50,0.55], [0.55,0.60], [0.60,0.70], [0.70,0.75] и [0.75,1.0].
Декодер работает в обратном порядке. Сначала он узнаёт символы алфавита и считывает. Затем он читает цифру «7» и узнаёт, что весь код имеет вид 0.7... Это число лежит внутри интервала [0.5,1] символа «S». Значит, первый символ был S. Далее декодер удаляет эффект символа S из кода с помощью вычитания нижнего конца интервала S и деления на длину этого интервала, равную 0.5. Результатом будет число 0.4350675, которое говорит декодеру, что второй символ был «W» (поскольку область «W» - [0.4,0.5]). Чтобы удалить влияние символа X, декодер делает следующее преобразование над кодом: Code:=(Code-LowRange(X))/Range, где Range обозначает длину интервала символа X.
- RSS
Наши услуги: