132
Информатика и технологии информатики
6. Автоматическая классификация документов на основе латентно-семантического анализа / И. Е. Кураленок, И. С. Некрестьянов // ТРУды Первой Всероссийской научно-методической конференции «Электронные библиотеки: перспективные методы и технологии, электронные коллекции». - СПб., 1999. - C. 89-96.
7. Latent semantic indexing / S. Dumais // TREC-3 report. In Proc. of the Third Text REtrieval Conference, 1995. - PP. 219-230.
8. Using latent semantic indexing for information filtering / P. Foltz // In ACM Conference on Office Information Systems (COIS), 1990. -PP, 40-47.
УДК 681.3
В. В. Яковлев, В. А. Ходаковский, В. А. Кудряшов
Петербургский государственный университет путей сообщения
МОДЕЛИРОВАНИЕ АРИФМЕТИЧЕСКОГО КОДЕКА В СРЕДЕ MATHCAD
Широко известны методы оптимального кодирования и оптимальные коды, например коды Шеннона - Фано, Хаффмена и др. Вместе с тем в последние годы в различных системах передачи данных стало широко применяться арифметическое кодирование.
Предпринята попытка рассмотрения простого кодека и моделирование его алгоритмов в среде MathCAD.
кодер, декодер, кодек, кодирование, оптимальное кодирование.
Введение
Одной из основных характеристик эффективности метода кодирования является среднее число битов, которое используется для передачи одного символа сообщения. Если используемый алфавит включает 256 символов, то при равномерном кодировании каждый символ требует для передачи 8 битов. Если используются неравномерные оптимальные коды, то количество битов, необходимых для его передачи, стараются сделать обратно пропорциональным вероятности, с которой данный символ встречается в сообщении, тогда частые символы
будут иметь короткие кодовые комбинации. Оптимальные коды, подобные кодам Шеннона - Фано и Хаффмена [2] позволяют использовать до одного бита на символ сообщения, но для получения такого показателя необходимо иметь таблицу вероятностей символов используемого алфавита, а сами вероятности должны быть кратны степеням двойки: 1/2, 1/4, 1/8 и т. д. На рис. 1 приведен график эффективности оптимального кодирования и кодирования по Хаффмену.
Из рисунка видно, что при кодировании по Хаффмену и при передаче всего двух символов (например, «0» и «1»), следующих
2012/2
Proceedings of Petersburg Transport University
Информатика и технологии информатики
133
п
о
и
К
о
сЗ
д
ОЭ
g
к
ю
о
и
н
о
<а
£
Рис. 1. Сравнение методов кодирования
с равными вероятностями Р0 = Р1 = 0,5, достаточно одного бита на символ.
1 Арифметический кодек
Понятие «кодек» основано на слиянии двух частей слов: «код» - кодер или коди -ровщик и «дек» - декодер [1], [2].
1.1 Основная идея метода
арифметического кодирования
Результатом кодирования является десятичная или двоичная дробь, знаки которой формируются по кодовой таблице и по последовательности передаваемых символов.
Пусть дан некий интервал, заданный границами: левой а и правой b. Пусть а = 0, b = 1.
Имеется кодовая таблица символов (табл. 1).
Необходимо передать сообщение bade-fac.
Результатом кодирования будет десятичная дробь, цифры которой вычисляются по вероятностям передаваемых символов и интервалам. Первая цифра кодовой дроби должна попасть в интервал, который задан для первого передаваемого символа в кодо -вой таблице (табл. 1).
Для первого символа «Ь» интервалы по кодовой таблице: а1 = 0,3, b1 = 0,5. Значит, полученная десятичная дробь находится в интервале [0,3-0,5].
Далее, десятичная дробь, состоящая из первой и второй цифр, должна попасть в интервал с границами, вычисляемыми по формулам
а- = а-1+*,..3 • (bi-1 - a-1);
bi = а-1+s,.a • (b-1 - аЛ (1)
где s. 3, s. 4 - левая и правая границы интервала текущего символа.
Для нашего сообщения второй символ -«а», поэтому
«2 = а1 + S1...3 ^ (b1 - а1) =
= 0,3 + 0 • (0,5 - 0,3) = 0,3;
b2 = а1 + s1,4 • (b1 - а1) =
= 0,3 + 0,3 • (0,5 - 0,3) = 0,36, (2)
где s ; s - левая и правая границы интервала из кодовой таблицы для символа «а», здесь первый индекс равен 1, поскольку символ «а» имеет первый номер в кодовой таблице.
Все этапы кодирования сведены в табл. 2.
Итоговой кодовой десятичной дробью будет левая граница последнего интервала
ISSN 1815-588Х. Известия ПГУПС
2012/2
134
Информатика и технологии информатики
ТАБЛИЦА 1. Вероятности символов и их интервалы
Номер i Символ Вероятность P Границы интервала
a. i b l
0 1 2 3 4
1 a 0,3 0 0,3
2 b 0,2 0,3 0,5
3 c 0,2 0,5 0,7
4 d 0,1 0,7 0,8
5 e 0,1 0,8 0,9
6 f 0,1 0,9 1,0
ТАБЛИЦА 2. Кодирование сообщения badefac
№ п/п Сим- вол Формула Границы
левая правая
0 a0 = 0 b0 = 1 0 1
1 b a1 = 0,3 b1 = 0,5 0,3 0,5
2 a a2 = a1 + s13 • (b1 - a1) = 0,3 + 0 • (0,5 - 0,3) b2 = a1 + s14 • (b1 - a1) = 0,3 + 0,3 • (0,5 - 0,3) 0,3 0,36
3 d a3 = a2 + T,3 • (b2 - a2) = 0,3 + 0,7 • (0,36 - 0,3) b3 = a2 + s4,4 • (b2 - a2) = 0,3 + 0,8 • (0,36 - 0,3) 0,342 0,348
4 e a4 = a3 + s53 • (b3 - a3) = 0,342 + 0,8 • (0,348 - 0,342) b4 = a3 + s5,4 • (b3 - a3) = 0,342 + 0,9 • (0,348 - 0,342) 0,3468 0,3474
5 f a5 = a4 + s63 • (b4 - a4) = 0,3468 + 0,9 • (0,3474 - 0,3468) b5 = a4 + s6,4 • (b4 - a4) = 0,3468 + 1,0 • (0,3474 - 0,3468) 0,34734 0,3474
6 a a6 = a5 + s1 3 • (b5 - a5) = 0,34734 + 0,0 • (0,3474 - 0,34734) b6 = a5 + s14 • (b5 - a5) = 0,34734 + 0,3 • (0,3474 - 0,34734) 0,34734 0,347358
7 c a7 = a6 + • (b6 - a6) = 0,34734 + 0,5 • (0,347358 - 0,34734) b7 = a6 + s3’4 • (b6 - a6) = 0,34734 + 0,7 • (0,347358 - 0,34734) 0,347349 0,3473526
2012/2
Proceedings of Petersburg Transport University
Информатика и технологии информатики
135
(строка 7 таблицы), т е. кодом сообщения badefac будет 0,347349.
Часть процесса получения кодового слова (кодирование первых трех символов сообщения, т е. bad) можно изобразить графически (рис. 2).
На рис. 2 показано, что основной интервал [0-1] разбивается на части, соответствующие вероятностям символов в сообщении.
Фактически передавать необходимо только цифры после запятой.
Переданная дробь больше чем 0,3, а по кодовой таблице это соответствует первому символу - «Ь», интервал которого [0,3-0,5], поэтому декодер выдает первый дешифрованный символ - «Ь».
Далее устраняется влияние первого символа путем вычитания из полученной дроби
0 a . 0 b c . d . e . f
1 м iii! , ■]■ -i' у ' 1 1 1 1 1 1 1
0 0, 3 0,5 0,7 0,9 1
cn o' 1 42
1 a - 0,30
J d 0,306
Рис. 2. Принцип арифметического кодирования сообщения badefac
Наибольший интервал отведен для символа «а», он равен 0,3. Границы интервала первого из передаваемых символов соответствуют [0,3-0,5], поэтому для кодирования первого символа достаточно передать любую дробь из этого интервала, которая впоследствии уточняется (на рисунке поставлен код -0,3). Из полученного интервала выделяется часть, которая соответствует вероятности и интервалу второго из передаваемых символов. Границы интервала второго символа «а» по кодовой таблице [0-0,3], поэтому от первого интервала [0,3-0,5] берется доля 0,3, и т. д. После передачи трех символов код - 0,306.
1.2 Арифметическое декодирование сообщения
Итак, что касается приемной стороны, то нам известно, что сообщение имеет длину 7 символов, известна кодовая таблица (табл. 1) и мы получили дробь - 0,347349.
левой границы символа «Ь» и деления результата на длину интервала этого символа: (0,347349 - 0,3)/0,2 = 0,236745. Полученное число попадает в интервал символа «а» [0-0,3], поэтому декодер выдает второй символ - «а».
Устраняется влияние символа «а»: (0,236745 - 0,0)/0,3 = 0,78915, это число находится в интервале [0,7-0,8] символа «d».
Устраняется влияние символа «d»: (0,78915 - 0,7)/0,1 = 0,8915, это в интервале [0,8-0,9] символа «е».
Устраняется влияние символа «е»: (0,8915 - 0,8)/0,1 = 0,915, это в интервале [0,9-1,0] символа «f».
Устраняется влияние символа «f>: (0,915 - 0,9)/0,1 = 0,15, это в интервале [0,00,3] символа «а».
Устраняется влияние символа «a»: (0,15 - 0)/0,3 = 0,5, это в интервале [0,5-0,7] символа «с».
При практической реализации алгоритма кодирования интервалы существен-
ISSN 1815-588Х. Известия ПГУПС
2012/2
136
Информатика и технологии информатики
но сближаются, и при длинном сообщении может не хватить разрядной сетки ЭВМ, поэтому, по мере того как старшие цифры дроби начинают повторяться, эти повторяющиеся цифры передаются и интервал расширяется до начального.
2 Моделирование арифметического кодека в среде MathCAD
2.1 Алгоритм построения кодовой таблицы
Кодовая таблица в передаваемом сообщении может быть либо задана, либо построена по тому сообщению, которое будет передаваться по каналу связи. Во втором случае необходимо использовать соответствующий алгоритм.
Ниже приведены тексты двух программ для системы MathCAD, первая из которых -P( f ) - вычисляет частоты символов в сообщении, а вторая - T(C, f ) - формирует кодовую таблицу:
T(C,f) :=
n ^ length(f) n1 ^ rows(C) m ^ 0
for i e 0..n1 - 2
m ^ 1 if Ci,0 = Cn1-1,0
continue otherwise for i e 0..n1 -1 - m
Di,0 ^ Ci,0 Di,1 ^ Ci,1
Q ^ reverse (csort(D,1))
C0,2
f
(
V
0
Q0,1
Л
40,4
n
Q0,3
for i e1..rows(Q) -1
Qi,2 ^ Qi1
n
Qi,3 ^ Qi-1,4 Qi,4 ^ Qi,3 + Qi,2
Q
P(f):
n ^ rows(f)
i ^ 0
Результат вызова приведенных программ для построения кодовой таблицы сообщения:
C0,1 ^ 0 C0,0 ^ f0 for j e 0..n -1
Ci+1,0 ^ fj
sov ^ 0 for k e 0..i
if Ck,0 = fj
Ck,1 ^ Ck,1 +1 i ^ i -1
sov ^ sov +1 i ^ i +1 if sov < 1
data := str 2 vec("'Welcome")
T(P(data),data) =
f 101 2 0.286 0 0 286
109 1 0.143 0.286 0 429
111 1 0.143 0.429 0 .571
99 1 0.143 0.571 0 714
108 1 0.143 0.714 0. 857
V 87 1 0.143 0.857 1
В первом столбце приведены ASC II коды символов сообщения Welcome.
2.2 Алгоритм кодирования
Ci,0 ^ fj
Cy ^ 1 C
Ниже представлена программа для системы MathCAD, моделирующая арифметический алгоритм кодирования. Справа представлен короткий комментарий.
2012/2
Proceedings of Petersburg Transport University
Информатика и технологии информатики
137
data := str2vec("badefac")
' 97 3 0.3 0 0 3 N
98 2 0.2 0.3 0 5
99 2 0.2 0.5 0. 7
100 1 0.1 0.7 0 8
101 1 0.1 0.8 0 9
v102 1 0.1 0.9 1 J
Исходные данные:
ввод текстовой строки сообщения
ввод матрицы кодирования с вероятностями
Текст программы kod с аргументами:
f — сообщение, X- матрица кодирования
kod(f, X)
n ^ length(f) m ^ rows(X)
a0 ^ (D0,3 ^ 0) b0 ^ (D0,4 ^1)
for i £ 1..n
считываем длину сообщения и число сток в кодовой таблице
цикл по длине сообщения
цикл по строкам кодовой таблицы
for j £ 0..m -1
k ^ j if fi-1 = Xj,0 ai ^ ai-1 + Xk,3 ' (bi-1 - ai-1) bi ^ ai-1 + Xk,4 ' (bi-1 - ai-1) Di,0 ^ Xk,0 Di,1 ^ Xk,1 Di,2 ^ Xk,2 Di,3 ^ ai Di,4 ^ bi
D
определяем номер строки считанного символа в кодовой таблице
находим левую границу правую границу
выводим код текущего символа сообщения
выводим вероятность текущего символа запоминаем левую границу
запоминаем правую границу выводим код
Результатом работы программы является кодовая таблица:
kod(data, A) =
0 0 0 0
98 0.2 0.3 0.5
97 0.3 0.3 0.36
100 0.1 0.342 0.348
101 0.1 0.3468 0.3474
102 0.1 0.34734 0.3474
97 0.3 0.34734 0.347358
99 0.2 0.347349 0.3473526
Выходным кодом, т. е. результатом арифметического кодирования, является левая граница в последней строке: 0,347349.
2.3 Алгоритм декодирования
Ниже представлена программа для системы MathCAD, моделирующая арифметический алгоритм декодирования. Справа, как и для кодера, представлен короткий комментарий:
ISSN 1815-588Х. Известия ПГУПС
2012/2
138
Информатика и технологии информатики
decod(n, s, X)
m ^ rows(X) for i e 0..n -1
аргументы: n - длина сообщения s - кодовая дробь, Х - кодовая таблица
for j e 0..m -1 k ^ j if Xj,3 < s < Xj,4
s - X
s ^
k,3
D-
X
X
k,2
k,0
D
цикл по длине сообщения
цикл по строкам таблицы кодирования
найден текущий символ
устраняем влияние текущего символа
запоминаем расшифрованный символ
( 98 ^
decod(7,0.347349, A)
97
100
101
102
97
результат вызова декодера приведены ASCII коды символов передаваемого сообщения
выдача расшифрованной строки
3 Сравнение арифметического кода и кода Хаффмена
Двоичным представлением числа 347349 является 101 0100 1100 1101 0101; таким образом, на передачу сообщения badefac (7 символов) арифметическому кодеку требуется 19 битов, т. е. 2,71 бит/символ.
Если при заданной кодовой таблице то же сообщение закодировать по методу Хаффмена, мы получим кодовое дерево (рис. 3).
Результат кодирования: 01 00 110 1110 1111 00 10 - те же 19 бит и та же эффективность
0i-------------------11
0 0 1
1 0 0
0,3 0,2 0,2 0,1 0,1 0,1
a b c d e f
00 01 10 110 1110 1111
Рис. 3. Кодовое дерево по методу Хаффмена
2,71 бит/символ. Итак, при коротких сообщениях без повторов символов арифметический код не уступает коду Хаффмена.
Заметный выигрыш арифметический метод дает в тех случаях, когда в сообщении встречаются частые повторы символов.
Заключение
Рассмотрены простейшие алгоритмы арифметического кодирования. Основными достоинствами арифметического кодера являются относительная простота алгоритма и то, что значительные повторы символов в сообщении не приводят к пропорциональному росту вырабатываемого кода.
Недостаток простейших алгоритмов арифметического кодирования состоит в том, что для передачи длинных сообщений требуется весьма высокая точность вычисления границ. Так, уже 16 символов в сообщении требуют, чтобы 16-й знак после запятой был правильным.
2012/2
Proceedings of Petersburg Transport University
Информатика и технологии информатики
139
Вместе с тем этот недостаток относительно легко устраняется. Если посмотреть на границы сформированного кода для сообщения badefac, то можно заметить повторы старших разрядов в формируемом кодовом слове. Учитывая этот факт, можно следить за кодовым словом и, при повторении, допустим, четырех старших разрядов, из сформированного слова вычесть дробь, составленную только из этих разрядов, а затем пересчитать левую и правую границы в таблице кодирования. Этот простой прием позволяет исключить влияние разрядной сетки ЭВМ на длину кодируемого сообщения.
Библиографический список
1. Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео / Д. Ватолин, А. Ратушняк, М. Смирнов, В. Юкин. - М. : Диалог-МИФИ, 2003. - 384 с. - ISBN 5-86404-170-х.
2. Anoverview of the basic principles of the Q-coder adaptive binary arithmetic coder / W. B. Penne-baker, J. L. Mitchell, G. G. Langdon, R. B. Arps // IBM Journal of research and development. - November 1988. - Vol. 32, No. 6. - PP. 771-726.
3. A method for the construction of minimum redundancy codes / D.A. Huffman // Proc. of IRE. -1952. - Vol. 40. - PP. 1098-1101.
ISSN 1815-588Х. Известия ПГУПС
2012/2