Вы находитесь на странице: 1из 31

Лекция 9

Тема 6. Кодирование информации (продолжение)


6.3. Оптимальное кодирование
Задача построения оптимального кода заключается в отыскании целых
положительных чисел n1, n2, …, nN, минимизирующих среднюю длину
кодового слова при условии выполнения неравенства Крафта:
N
n = ∑ pi ni → min,
i =1
N
∑ D −n i
≤ 1.
i =1

При построении кодов в случае алфавита A = {ai, i = 1, 2, …, N} с


известным распределением вероятностей P = {pi, i = 1, 2, …, N} без
ограничения общности можно считать, что буквы алфавита A занумерованы
в порядке убывания их вероятностей, т.е. p1 ≥ p2 ≥ … ≥ pN . Кроме того,
будем рассматривать только двоичные коды.
Известны два метода (Фано и Шеннона) построения кодов, близких к
оптимальным. Метод Фано заключается в следующем. Упорядоченный в
порядке убывания вероятностей список букв делится на две
последовательные части так, чтобы суммы вероятностей входящих в них
букв как можно меньше отличались друг от друга. Буквам из первой части
приписывается символ 0, а буквам из второй части – символ 1. Далее точно
также поступают с каждой из полученных частей, если она содержит, по
крайней мере, две буквы. Процесс продолжается до тех пор, пока весь список
не разобьется на части, содержащие по одной букве. Каждой букве ставится в
соответствие последовательность символов, приписанных в результате этого
процесса данной букве. Легко видеть, что полученный код является
префиксным.
Метод Шеннона применим лишь в том случае, когда все вероятности
положительны. Он состоит в том, что букве ai, имеющей вероятность pi > 0,
ставится в соответствие последовательность из ni = ]log(1/pi)[ первых после

62
i −1
дробной точки цифр разложения числа qi = ∑ p j в бесконечную дробь (для a1
j =1

полагаем, что q1 = 0). Поскольку при l > k (в силу того, что pl ≤ pk) nl ≥ nk и
1 > ql ≥ qk + pk ≥ qk + 2 − nk , то полученный таким образом код является
префиксным. На основе полученного префиксного кода строится усеченный
префиксный код, который и является результатом кодирования по методу
Шеннона.
Пусть, например, имеется множество букв A = {a1, a2, a3, a4, a5, a6, a7} с
распределением вероятностей P = {0.2, 0.2, 0.19, 0.12, 0.11, 0.09, 0.09}.
Выполним кодирование букв по методу Фано.
1. Разобьем список на две части, так чтобы суммы вероятностей,
входящих в них букв как можно меньше отличались друг от друга:
A1 = {a1, a2, a3}, P1 = {0.2, 0.2, 0.19};
A2 = {a4, a5, a6, a7}, P2 = {0.12, 0.11, 0.09, 0.09}.
2. Припишем буквам из первой части символ 0, а буквам второй части
символ 1:
A1 = {a1/0, a2/0, a3/0};
A2 = {a4/1, a5/1, a6/1, a7/1}.
3. Повторим последовательно указанные действия для каждой из
частей по отдельности. В результате получим:
A11 = {a1/00};
A121 = {a2/010};
A122 = {a3/011};
A211 = {a4/100};
A212 = {a5/101};
A221 = {a6/110};
A222 = {a7/111}.
Кодовые слова, полученные в результате кодирования, приведены для
каждой буквы справа от наклонной черты. При этом порядок индексов

63
полученных однобуквенных списков показывает последовательность
разбиения исходного списка групп на части.
Процесс кодирования по методу Фано удобно оформлять в виде
таблицы. Для рассматриваемого примера он приведен в таблице 6.3.
Таблица 6.3
Кодирование по методу Фано
a1 0.20 0 0 00
a2 0.20 1 0 010
a3 0.19 1 011
a4 0.12 1 0 0 100
a5 0.11 1 101
a6 0.09 1 0 110
a7 0.09 1 111

Определим среднюю длину кодового слова:


N
n = ∑ pi ni ≈ 2.8 .
i =1

Теперь выполним кодирование по методу Шеннона. Процесс


кодирование приведено в таблице 6.4.
Таблица 6.4
Кодирование по методу Шеннона
ai ni qi Код ai Усеченный код ai
a1 ]2.321…[ = 3 0 000 000
a2 ]2.321…[ = 3 0.2 001 001
a3 ]2.395…[ = 3 0.4 011 01
a4 ]3.058…[ = 4 0.59 1001 100
a5 ]3.183…[ = 4 0.71 1011 101
a6 ]3.472…[ = 4 0.82 1101 110
a7 ]3.472…[ = 4 0.91 1110 111

Как и предыдущего случая найдем среднюю длину кодового слова:


N
n = ∑ pi ni ≈ 2.81 .
i =1

Как можно видеть результаты кодирования по методам Фано и


Шеннона с точки зрения минимизации средней длины кода практически

64
совпали. Поэтому часто эти методы рассматривают как один (в
формулировке Фано) и называют методом Шеннона-Фано.
В 1952 г. Давид Хаффмен предложил метод оптимального префиксного
кодирования для дискретных источников, который в отличие от методов
Шеннона и Фано до сих пор применяется на практике. Д.Хаффмен доказал,
что средняя длина кодового слова, полученная с помощью его метода, будет
минимальна. Кодирование Хаффмена производится за три шага.
1. Упорядочение: буквы располагаются в порядке убывания их
вероятностей.
2. Редукция: две буквы с наименьшими вероятностями объединяются в
одну с суммарной вероятностью; список букв переупорядочивается в
соответствии с шагом 1; процесс продолжается до тех пор, пока все буквы не
будут объединены в одну. При этом можно добиться выравнивания длин
кодовых слов с помощью следующей стратегии: если несколько букв имеют
одинаковые вероятности, то объединяют те две из них, которые до этого
имели наименьшее число объединений (правда на среднюю длину кода это
не повлияет).
3. Кодирование: начиная с последнего объединения, последовательно
приписываются одной компоненте составной буквы символ 0, а второй –
символ 1; процесс продолжается до тех пор, пока все исходные буквы не
будут закодированы.
Выполним кодирование по методу Хаффмена для множества,
рассматривавшегося в примерах применения методов Фано и Шеннона.
1. Исходный список букв A = {a1, a2, a3, a4, a5, a6, a7} уже упорядочен,
так как P = {0.2, 0.2, 0.19, 0.12, 0.11, 0.09, 0.09}.
2. Объединим буквы a6 и a7 в одну букву a1 с вероятностью 0.18 и
переупорядочим список:
P1 = {0.2, 0.2, 0.19, 0.18, 0.12, 0.11}, A1 = {a1, a2, a3, a1, a4, a5}.
3. Повторим шаг 2 до тех пор, пока не останется одна буква в списке:
P2 = {0.23, 0.2, 0.2, 0.19, 0.18}, A2 = {a2, a1, a2, a3, a1};

65
P3 = {0.37, 0.23, 0.2, 0.2}, A3 = {a3, a2, a1, a2};
P4 = {0.4, 0.37, 0.23}, A4 = {a4, a3, a2};
P5 = {0.6, 0.4}, A5 = {a5, a4};
P6 = {1}, A6 = {a6}.
4. Присвоим двоичные коды символам:
a6: a5 = 0, a4 = 1;
a5: a3 = 00, a2 = 01;
a4: a1 = 10, a2 = 11;
a3: a3 = 000, a1 = 001;
a2: a4 = 010, a5 = 011;
a1: a6 = 0010, a7 = 0011.
Таким образом, исходным буквам присвоены следующие двоичные
коды: a1 = 10, a2 = 11, a3 = 000, a4 = 010, a5 = 011, a6 = 0010, a7 = 0011, что дает

N
среднюю длину кода n = ∑ pi ni ≈ 2.78 , меньшую, чем в случае кодирования
i =1

Фано и Шеннона.
Определим избыточность полученных кодов. Для этого найдем
энтропию источника сообщений:
N
1
H ( X ) = ∑ pi log ≈ 2.73 .
i =1 pi

Тогда коды имеют следующую избыточность:


H 2.73
код Фано: 1− ≈1 − ≈ 0.025 ;
n 2.8
H 2.73
код Шеннона: 1− ≈1 − ≈ 0.028 ;
n 2.81
H 2.73
код Хаффмена: 1− ≈1 − ≈ 0.018 .
n 2.78

Таким образом, избыточность кода Хаффмена минимальна.


Для снижения избыточности, т.е. снижения средней длины кодового
слова на один символ, можно воспользоваться блочным кодированием,
обоснование которого дано в теореме кодирования источников II. В этом
случае необходимо получить всевозможные группы букв заданной длины,
66
найти вероятности групп, как вероятности совместного появления букв
группы одновременно, и выполнить кодирование, рассматривая группы как
символы нового алфавита.

Вопросы
1. Постановка задачи оптимального кодирования.
2. Метод Фано.
3. Метод Шеннона.
4. Метод Шеннона-Фано.
5. Метод Хаффмена.
6. Стратегия выравнивания длин кодовых слов для метода Хаффмена.
7. Соотношение между методами Фано, Шеннона и Хаффмена по средней
длине кодового слова и избыточности.
8. Блочное кодирование.

Лекция 10
Тема 7. Сжатие дискретной информации
7.1. Основные понятия
При проектировании информационных систем часто необходимо
минимизировать затраты на передачу и хранение информации. Добиться
этого можно с помощью кодирования, устраняющего избыточность
информации. При решении практических задач такое кодирование называют
сжатием информации. При сжатии информации, изначально представленной
в дискретном виде, говорят о сжатии данных. При этом часто говорят, что
сжимается файл или поток данных. Для описания методов сжатия данных
используются следующие основные понятия и характеристики.
Компрессор или кодер – программа (устройство), которая сжимает
исходные данные, т.е. преобразует входной несжатый файл в выходной
сжатый файл. Программа (устройство), выполняющая обратное
преобразование (восстановление исходных данных из сжатого файла),

67
называется декомпрессором или декодером. Компрессор и декомпрессор
вместе образуют кодек.
Методы сжатия данных делятся на неадаптивные, адаптивные,
полуадаптивные и локально адаптивные методы. Неадаптивный метод
сжатия данных (метод неадаптивного сжатия данных) – метод сжатия
данных, в котором не предусмотрена возможность изменения операций,
параметров и настроек в зависимости от характера сжимаемой информации.
Метод, в котором предусмотрена возможность изменения операций,
параметров и настроек в зависимости от характера сжимаемых данных,
называется адаптивным методом. Если для изменения операций, параметров
и настроек предварительно собирается некоторая статистика сжимаемой
информации, то метод сжатия называется полуадаптивным (говорят, что
реализуется двухпроходное сжатие: на первом проходе выполняется анализ
информации, а на втором – собственно сжатие). Метод сжатия называется
локально адаптивным, если в нем предусмотрена возможность изменения
параметров в зависимости от локальных особенностей входного файла.
Методы сжатия данных делятся также на методы сжатия без потерь и с
потерями информации. Метод сжатия без потерь (метод неискажающего
сжатия) позволяет восстановить сжатую информацию без искажений. Метод
сжатия с потерями (метод искажающего сжатия) предусматривает искажение
сжимаемой информации для получения требуемых характеристик сжатия
(скорости, качества, простоты и т.д.).
Симметричный метод сжатия – это метод, при использовании которого
кодер и декодер выполняют одни и те же действия, но в противоположных
направлениях. Если либо кодер, либо декодер выполняет значительно
большую работу, то соответствующий метод сжатия называется
асимметричным.
Для определения производительности метода сжатия данных часто
используют коэффициент сжатия, фактор сжатия, качество сжатия, время
сжатия и время восстановления. Коэффициент сжатия – величина,

68
получающаяся в результате деления размера выходного (сжатого) файла на
размер входного (несжатого) файла. Фактор сжатия – величина, обратная
коэффициенту сжатия. Качество сжатия определяется по формуле
100 × (1 − K )

выражается в процентах и показывает на сколько процентов уменьшается


размер исходного файла после сжатия. Время сжатия – это время,
затрачиваемое на сжатие данных. Время восстановления – это время,
необходимое для восстановления данных из сжатого файла.

7.2. Сжатие по Хаффмену


Методы сжатия по Хаффмену основаны на методе оптимального
кодирования Хаффмена. Непосредственная реализация метода Хаффмена
приводит к неадаптивному сжатию, так как вероятности символов должны
быть известны заранее (неадаптивный метод далее рассматриваться не
будет). Полуадаптивный метод сжатия по Хаффмену заключается в том, что
сначала весь исходный файл просматривается, определяются частоты
символов в файле, а затем производится кодирование на основании
полученных частот, которые используются как оценки вероятностей
символов. При этом в выходной файл со сжатыми данными заносятся
значения частот символов и/или коды символов, например в виде кодовой
таблицы. Адаптивный метод сжатия по Хаффмену основан на использовании
некоторой вероятностной модели источника исходных данных,
корректируемой после кодирования каждого символа. В этом случае хранить
информацию о частотах символов не нужно, поскольку декодер будет
использовать точно такую же модель и точно также ее корректировать после
восстановления каждого символа.
Рассмотрим два адаптивных метода сжатия по Хаффмену. Первый из
них заключается в использовании модели, которая изначально является
равномерной, содержащей все возможные символы (в том числе и символ
конца файла EOF) с частотами, равными 1. После кодирования очередного

69
символа его частота увеличивается на единицу. При этом подсчитывается
суммарная частота и если она достигает заранее заданного, максимального,
значения, то производится нормализация – уменьшение частот всех
символов. Как правило, при нормализации все частоты делят на 2. При этом
частотам, получившимся равными 0, присваивают значение 1. Процесс
продолжается до тех пор, пока не будет достигнут конец файла (считан
символ EOF).
Второй метод адаптивного сжатия по Хаффмену основан на
использовании дополнительного символа ESC, частота которого всегда равна
1. Исходная модель в этом случае содержит только два символа – ESC и EOF
с единичными частотами. При появлении очередного символа проверяется
его наличие в текущей модели. Если символ имеется в модели (его частота не
равна 0), то ему присваивается код по методу Хаффмена. Если же символ в
модели отсутствует (его частота равна 0), то ему присваивается код,
состоящий из кода Хаффмена символа ESC, к которому приписывается
справа исходный код символа (код, считанный из файла). Если символ при
кодировании уже присутствовал в модели, то после кодирования его частота
увеличивается на 1, иначе – он добавляется в модель с частотой 1. Так же как
и в предыдущем случае подсчитывается суммарная частота и производится
нормализация, когда суммарная частота достигает заданного, максимального,
значения. При этом можно модифицировать нормализацию: после
уменьшения значений частот все символы (кроме ESC и EOF), у которых
частоты стали меньше 1, удаляются из модели. Отметим, что кодирование
выполняется таким образом, что бы коды символов ESC и EOF имели не
меньшую длину, чем другие символы.
Восстановление данных, сжатых с помощью первого адаптивного
метода, выполняется следующим образом: побитно считывается код из
сжатого файла, производится попытка его декодировать и если это удается,
то соответствующий символ записывается в выходной файл, его частота
увеличивается на 1, определяется суммарная частота и при необходимости

70
выполняется нормализация. Процесс продолжается до тех пор, пока не будет
декодирован символ EOF. Восстановление по второму методу отличается
только тем, что если декодирован символ ESC, то далее считывается
известное количество бит несжатого символа, который затем добавляется в
модель с частотой 1. При использовании обоих методов исходная модель
должна быть точно такой же, что и при сжатии данных.
Проиллюстрируем описание методов сжатия по Хаффмену на
примерах. Пусть файл данных, который нужно сжать, имеет вид
s1s2s2s2 s1s3s3EOF.
При сжатии файла полуадаптивным методом, частоты символов и их коды
будут найдены после первого прохода (таблица 7.1), а затем использованы на
втором проходе. В результате будет получена двоичная последовательность:
01111000000001.
При этом в результирующий файл необходимо поместить также частоты
символов и/или их коды.
Таблица 7.1
Полуадаптивные коды Хаффмена
Символ s1 s2 s3 EOF
Частота 2 3 2 1
Код 01 1 000 001
Теперь выполним сжатие того же файла, но с помощью адаптивных
методов. При этом будем полагать, что максимальное значение суммарной
частоты, при которой необходимо проводить нормализацию, равно 8. Коды,
получаемые при сжатии первым адаптивным методом, приведены в таблице
7.2. На выходе в результате будет получена последовательность
1001001010101001.
Таблица 7.2
Кодирование первым адаптивным методом Хаффмена
№ Символ Модель № Символ Модель
Символ Частота Код Символ Частота Код
s1 1 10 s1 1 01
1 s1 s2 1 11 5 s1 s2 2 1
s3 1 00 s3 1 000
EOF 1 01 EOF 1 001
2 s2 Символ Частота Код 6 s3 Символ Частота Код

71
s1 2 1 s1 2 1
s2 1 01 s2 2 00
s3 1 000 s3 1 010
EOF 1 001 EOF 1 011
Символ Частота Код Символ Частота Код
s1 2 1 s1 2 00
3 s2 s2 2 00 7 s3 s2 2 01
s3 1 010 s3 2 10
EOF 1 011 EOF 1 11
Символ Частота Код Символ Частота Код
s1 2 00 s1 1 10
4 s2 s2 3 1 8 EOF s2 1 11
s3 1 010 s3 1 00
EOF 1 011 EOF 1 01

Отметим, что после выполнения четвертого и седьмого (перед


выполнением пятого и восьмого) шагов была проведена нормализация,
заключавшаяся в делении значений всех частот на два и замене нулей на
единицы.
Для сжатия вторым адаптивным методом необходимо определить
исходные коды символов в несжатом виде. Пусть они будут следующими:
s1 – 00, s2 – 01, s3 – 10, EOF – 11.
Тогда в результате на выходе получим
0000001110001101001011.
Процесс получения соответствующих кодов показан в таблице 7.3. Здесь
также после шестого (перед седьмым) шагом выполнялась нормализация
модели.
Таблица 7.3
Кодирование вторым адаптивным методом Хаффмена
№ Символ Модель № Символ Модель
Символ Частота Код Символ Частота Код
s1 0 - s1 1 01
s2 0 - s2 3 00
1 s1 5 s1
s3 0 - s3 0 -
ESC 1 0 ESC 1 10
EOF 1 1 EOF 1 11
Символ Частота Код Символ Частота Код
s1 1 1 s1 2 01
s2 0 - s2 3 00
2 s2 6 s3
s3 0 - s3 0 -
ESC 1 00 ESC 1 10
EOF 1 01 EOF 1 11
3 s2 Символ Частота Код 7 s3 Символ Частота Код

72
s1 1 10 s1 1 11
s2 1 11 s2 1 10
s3 0 - s3 1 01
ESC 1 00 ESC 1 000
EOF 1 01 EOF 1 001
Символ Частота Код Символ Частота Код
s1 1 01 s1 1 11
s2 2 00 s2 1 10
4 s2 8 EOF
s3 0 - s3 2 00
ESC 1 10 ESC 1 010
EOF 1 11 EOF 1 011
7.3. Арифметическое кодирование
Альтернативой методу сжатия по Хаффмену является арифметическое
кодирование. При его применении код присваивается всему передаваемому
файлу, вместо кодирования отдельных символов. Кодер читает входной файл
символ за символом и добавляет биты к сжатому файлу. Получающийся код
представляет собой дробную часть числа из полуинтервала [0, 1). В общем
виде алгоритм арифметического кодирования имеет следующие шаги.
1. Задать текущий интервал [0, 1).
2. Повторить следующие действия для каждого символа s входного
файла.
2.1. Разделить текущий интервал на части пропорционально
частотам каждого символа.
2.2. Выбрать подынтервал, соответствующий символу s, и назначить
его новым текущим интервалом.
3. Когда весь входной файл будет обработан, выходом алгоритма
объявляется любая внутренняя точка текущего интервала.
Для восстановления сжатых данных последовательно определяются
интервалы, в которые попадает анализируемое значение (входной код из
сжатого файла), и соответствующие им символы, которые и будут
выдаваться на выход декодера.
В качестве примера выполним сжатие той же последовательности, что
рассматривалась при изучении методов сжатия по Хаффмену. Процесс
образования интервалов показан в таблице 7.4. При этом используются

73
частоты из таблицы 7.1. На последнем (восьмом) шаге выбирается
подынтервал
[0.097481728, 0.097507477),
соответствующий символу EOF. В качестве результата можно взять любую
точку из этого подынтервала. Выберем такое значение, которое имеет
наименьшее число цифр в двоичной форме:
0.09748172810 = 0.000110001111010010012.

Таким образом, арифметическим кодом исходной последовательности будет


00011000111101001001.
Таблицы 7.4
Образование интервалов при арифметическом кодировании
№ Интервалы Символ
1 s1: [0, 0.25) s1
s2: [0.025, 0.625)
s3: [0.625, 0.875)
EOF: [0.875, 1)
2 s1: [0, 0.0625) s2
s2: [0.0625, 0.15625)
s3: [0.15625, 0.21875)
EOF: [0.21875, 0.25)
3 s1: [0.0625, 0.0859375) s2
s2: [0.0859375, 0.12109375)
s3: [0.12109375, 0.14453125)
EOF: [0.14453125, 0.15625)
4 s1: [0.0859375, 0.094726563) s2
s2: [0.094726563, 0.107910156)
s3: [0.107910156, 0.116699219)
EOF: [0.116699219, 0.12109375)
5 s1: [0.094726563, 0.098022461) s1
s2: [0.098022461, 0.102966309)
s3: [0.102966309, 0.106262207)
EOF: [0.106262207, 0.107910156)
6 s1: [0.094726563, 0.095550538) s3
s2: [0.095550538, 0.096786499)
s3: [0.096786499, 0.097610474)
EOF: [0.097610474, 0.098022461)
7 s1: [0.096786499, 0.096992493) s3
s2: [0.096992493, 0.097301483)
s3: [0.097301483, 0.097507477)
EOF: [0.097507477, 0.097610474)
8 s1: [0.097301483, 0.097352982) EOF
s2: [0.097352982, 0.097430229)
s3: [0.097430229, 0.097481728)

74
EOF: [0.097481728, 0.097507477)

Приведенный пример соответствует полуадаптивному методу.


Существует также адаптивное арифметическое кодирование, основанное на
модели, которая была рассмотрена при описании первого адаптивного
метода сжатия по Хаффмену.

Вопросы
1. Кодер, декодер, кодек.
2. Неадаптивные, адаптивные, полуадаптивные и локально адаптивные
методы сжатия.
3. Методы сжатия с потерями и без потерь.
4. Симметричные и асимметричные методы сжатия.
5. Коэффициент сжатия, фактор сжатия, качество сжатия, время сжатия и
время восстановления.
6. Методы сжатия по Хаффмену.
7. Арифметическое кодирование.
8. Моделирование при сжатии данных.
Лекция 11
Тема 7. Сжатие дискретной информации (продолжение)
7.4. Словарные методы
Словарные методы основаны на применении динамических словарей.
Эти методы базируются на алгоритмах LZ77 и LZ78, предложенных
Лемпелем Зивом. В основе словарных методов лежат следующие идеи:
1. каждая очередная закодированная последовательность символов
добавляется к ранее закодированным символам таким образом, что вместе с
ними она образует разложение всей переданной и принятой информации на
несовпадающие между собой слова;

75
2. слова хранятся в памяти и используются в дальнейшем в качестве
словаря;
3. кодирование осуществляется при помощи указателей на слова из
сформированного словаря;
4. кодирование является динамической процедурой, ориентированной на
блоки символов.
При реализации методов Лемпеля-Зива как правило используется
скользящее окно, состоящее из словаря и упреждающего буфера.
В результате сжатия файла с помощью метода LZ77 формируется
последовательность вида
〈A, L, S〉 ,
где A – относительный адрес в словаре, L – количество совпадающих
символов, S – символ из буфера, который отличается от продолжения слова в
словаре. При этом код 〈–1, 0, S〉 означает, что в словаре ничего не найдено.
Алгоритм LZ77 работает следующим образом. Сначала упреждающий
буфер заполняется символами из начала сжимаемого файла. Затем
осуществляется поиск в словаре слова, максимально совпадающего со
словом в начале упреждающего буфера. После этого формируется и выдается
код. После выдачи кода L + 1 символов из начала упреждающего буфера
переписываются в словарь, оставшиеся символы смещаются в начало, а на их
место записываются символы из файла. Так как размер словаря ограничен, то
из его начала часть символов может удаляться со смещением остальных на
соответствующее число позиций.
Пусть, например, необходимо закодировать последовательность
символов
aaaabaabbbEOF
методом LZ77 с использованием словаря и упреждающего буфера,
рассчитанных на 8 и 4 символов соответственно. Процесс кодирования
показан в таблице 7.5.
Таблица 7.5

76
Пример кодирования по методу LZ77
№ Словарь Упреждающий буфер Код
0 1 2 3 4 5 6 7 0 1 2 3
1 〈–1, 0, a〉
- - - - - - - - a a a a
0 1 2 3 4 5 6 7 0 1 2 3
2 〈0, 1, a〉
a - - - - - - - a a a b
0 1 2 3 4 5 6 7 0 1 2 3
3 〈0, 1, b〉
a a a - - - - - a b a a
0 1 2 3 4 5 6 7 0 1 2 3
4 〈0, 2, b〉
a a a a b - - - a a b b
0 1 2 3 4 5 6 7 0 1 2 3
5 〈4, 1, b〉
a a a a b a a b b b EOF -
0 1 2 3 4 5 6 7 0 1 2 3 〈–1, 0,
6
a a b a a b b b EOF - - - EOF〉
0 1 2 3 4 5 6 7 0 1 2 3
7 -
a b a a b b b EOF - - - -

Метод LZ78 отличается от LZ77 тем, что в каждой позиции словаря


хранятся слова. Поэтому в выходном коде количество совпадающих
символов L отсутствует, т.е. код имеет вид
〈A, S〉 ,
где A – адрес слова в словаре, совпадающего со словом в начале
упреждающего буфера, S – символ из буфера, который отличается от
продолжения слова в словаре. При этом код 〈–1, S〉 означает, что в словаре
ничего не найдено. После выдачи кода в словарь добавляется слово, начало
которого представляет собой слово из словаря по адресу A (A ≠ –1), а
окончание – символ S.
Процесс кодирования по методу LZ78 последовательности символов,
рассмотренной в примере применения метода LZ77, показан в таблице 7.6.
Таблица 7.6
Пример кодирования по методу LZ78
№ Словарь Упреждающий Код
(позиция: слово) буфер
1 - aaaa 〈–1, a〉
2 0: a aaab 〈0, a〉
0: a
3 abaa 〈0, b〉
1: aa
0: a
4 1: aa aabb 〈1, b〉
2: ab
5 0: a bbEOF 〈–1, b〉
1: aa
77
2: ab
3: aab
0: a
1: aa
〈4,
6 2: ab bEOF
3: aab EOF〉
4: b
0: a
1: aa
2: ab
7 - -
3: aab
4: b
5: bEOF

Словарные методы являются асимметричными методами, поскольку


при восстановлении данных не нужно выполнять поиск: ссылка на словарь
содержится непосредственно в коде. Декодер по адресу A (и количеству
совпадающих символов L – для метода LZ77) находит слово в словаре, к
которому добавляет символ S; полученное слово подается на выход декодера.

7.5. Методы кодирования длин серий


Методы кодирования длин серий, которые еще называют методами
RLE (Run Length Encoding), являются одними из наиболее старых методов
сжатия. Однако благодаря своей простоте и эффективности они до сих пор
используются либо непосредственно, либо в составе других методов. При
использовании простейшего метода RLE последовательность (серия)
одинаковых символов заменяется парой 〈C, S〉 , где C – длина серии, S –
символ, из которого состоит серия. Например, для файла
aaaaaaaaabbbbaaaaabbaaaaaabbbbaaaaaabbaaaacccccdddEOF
после применения данного метода будет получена следующая
последовательность кодов:
〈a, 9〉 〈b, 4〉 〈a, 5〉 〈b, 2〉 〈a, 6〉 〈b, 4〉 〈a, 6〉 〈b, 2〉 〈a, 4〉 〈c, 5〉 〈d,
3〉 〈EOF, 1〉 .
Недостатком простейшего метода RLE является увеличение размеров
информации (вместо сокращения) в том случае, если сжимаемая

78
последовательность содержит большое число одиночных символов. Поэтому
для устранения указанного недостатка на практике используют различные
модификации RLE-кодирования, например, можно использовать C
переменного размера:
при C = 0 – размер равен 1 биту;
при C > 0 – размер равен n бит, старший из которых содержит 1.
Процесс восстановления данных при помощи декодера RLE вполне
очевиден.

7.6. Методы сжатия с потерями


Все методы сжатия, описанные до этого, являются методами без
потерь. Методы сжатия с потерями применяются, как правило, для хранения
графических, звуковых и видеоданных. Рассмотрим принципы работы
данных методов на примере сжатия графики с использованием дискретного
косинусного преобразования (ДКП).
Пусть имеется непрерывный периодический сигнал a(t) с периодом T.
Его можно представить в виде:
N −1
a (t ) = α0ϕ0 (t ) + a1ϕ1 (t ) + ... + α N −1ϕN −1 (t ) = ∑a sϕs (t ) .
s =0

Можно подобрать систему функций {ϕs (t )} , s = 0, 1, …, N – 1, так, чтобы:


- ни одна из них не могла быть получена линейной комбинацией
других:
N −1
ϕl ( t ) ≠ ∑αsϕs (t ), s ≠ l ;
s =0

- за скалярное произведение принимается


(ϕs ,ϕl ) = ∫ϕs ( t )ϕl (t )dt ;
T

- они попарно ортогональны и нормированы:


1, при s = l
(ϕs ,ϕl ) =  .
0, при s ≠ l

79
Такой выбор системы функций {ϕs (t )} , s = 0, 1, …, N – 1, позволяет
представить сигнал a(t) в виде точки N-мерного функционального
пространства с координатами α s. Систему функций {ϕs (t )} , s = 0, 1, …, N –
1, называют базисом пространства сигналов, каждую из функций – базисной,
представление сигнала в форме композиции базисных функций –
разложением по заданному базису. Координаты точки, соответствующие
сигналу a(t), можно найти по формуле
αs = ( a (t ), ϕs (t )) = ∫ a (t )ϕs (t ) dt .
T

Существует множество систем функций, обладающих свойствами


базиса. В частности базис образует система функций вида:
1 i 2πst
ϕs (t ) = exp( ).
T T

Разложение сигнала по этому базису называют разложением Фурье, а


нахождение коэффициентов разложения – преобразованием Фурье.
Преобразование Фурье выполняется по формуле:
1 T st
α s = (a (t ), ϕs (t )) = ∫ a (t )ϕs (t )dt = ∫ a (t ) exp( i 2π ) .
T T 0 T

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


принимает значения в дискретные моменты времени
t = k∆t ,

где ∆t = T / N , N – количество разбиений интервала T. Тогда, непрерывный


сигнал a(t) заменяется на последовательность отсчетов
a((k + 0.5)∆ t) = ak, k = 0, 1, …, N – 1,
взятых посредине отрезков разбиения ∆ t, а формулы преобразования Фурье
приобретают вид
2 N −1 s (k + 0.5)
αs =
N
∑ak cs cos( π N
), s = 1, 2, ..., N − 1 . (7.1)
k =0

Формула (7.1) задает прямое ДКП, которое выполняется по базису


 2 s ( k + 0.5) 
{ϕsk } =  c s cos( π ), s =1, 2, ..., N −1, k =1, 2, ..., N −1 ,
 N N 

где cs – нормировочный множитель, определяемый как


80
1
 п р kи= 0 ,
cs =  2
 1 п р kи≠ 0 .
Данное преобразование обратимо, т.е. существует обратное ДКП. Оно
задается формулой
2 N −1 s (k + 0.5)
ak =
N
∑αs cs cos( π N
), k = 0, 1, ..., N − 1 . (7.2)
s =0

В выражении (7.2) элементы {ϕ sk } есть дискретные отсчеты базисных


функций, где s – номер базисной функции, k – номер отсчета дискретизации
базисной функции. Их значения образуют матрицу N × N, которую
обозначим FN = {ϕ sk } . Тогда прямое и обратное ДКП можно записать в
матричной форме:
α = FN a,
(7.3)
a = FNT α,

где α = (α 0, α 1, …, α N–1 )T, a = (a0, a1, …, aN – 1)T.


Описанные прямое и обратное ДКП являются
одномерными преобразованиями. Однако их можно обобщить для
двумерного сигнала, представленного в виде матрицы размера N × N. В
результате ДКП над двумерным сигналом получается также
матрица размера N × N коэффициентов разложения по
базисным функциям:
α = {α sr } , s = 0, 1, …, N – 1, r = 0, 1, …, N – 1.

Формулы в матричной форме для выполнения прямого и обратного


двумерного ДКП имеют вид
α = FN aF NT ,
(7.4)
a = FNT αFN .

Матрица FN зависит только от N и может быть просчитана заранее.


Например, при N = 8 она будет иметь вид.

81
 0.3 5 0.3 5 0.3 5 0.3 5 0.3 5 0.3 5 0.3 5 0.3 5
 0.4 9 0.4 2 0.2 8 0.0 9 -0.0 9 -0.2 8 -0.4 2 -0.4 9
 
 0.4 6 0.1 9 -0.1 9 -0.4 6 -0.4 6 -0.1 9 0.1 9 0.4 6
 
0.4 2 -0.0 9 -0.4 9 -0.2 8 0.2 8 0.4 9 0.0 9 -0.4 2
FN = 
 0.3 5 -0.3 5 -0.3 5 0.3 5 0.3 5 -0.3 5 -0.3 5 0.3 5
 
 0.2 8 -0.4 9 0.0 9 0.4 2 -0.4 2 -0.0 9 0.4 9 -0.2 8
 0.1 9 -0.4 6 0.4 6 -0.1 9 -0.1 9 0.4 6 -0.4 6 0.1 9 
 
 0.0 9 -0.2 8 0.4 2 -0.4 9 0.4 9 -0.4 2 0.2 8 -0.0 9
При сжатии графических данных файл представляет собой
последовательность пикселей – значений цвета точек изображения. Можно
считать, что значение пикселя представляет собой вектор-функцию вида
f(x, y) = (r, g, b),
где x, y – координаты пикселя, r, g, b – яркости красной, зеленой и синей
компонент цвета (считается, что любой цвет можно разложить на три
указанные компоненты). При использовании методов сжатия, основанных на
ДКП, последовательность пикселей разбивают на блоки размером 8 × 8 и
обрабатывают эти блоки по отдельности. При этом из каждого блока
выделяют матрицы яркостей красной, зеленой и синей компонент.
Предположим, что матрица яркостей одной из компонент какого-либо
блока имеет вид

82
 9 5 8 8 8 8 8 7 9 5 8 8 9 5 9 5
 1 4 31 4 14 5 1 5 1 5 31 7 01 8 31 8 1
 
 1 5 31 5 1 6 12 6 61 6 21 5 1 2 61 1 7
 
1 4 31 4 14 3 13 3 01 4 31 5 31 5 91 7 5
a=
 1 2 31 1 12 1 16 3 01 4 31 4 71 6 21 8 9
 
1 3 31 5 1 6 12 6 61 7 01 8 81 6 61 2 8
 1 6 01 6 18 6 16 5 91 3 51 0 19 3 9 8
 
 1 5 41 5 15 5 13 4 41 2 61 0 61 1 81 3 3
Теперь последовательно выполним следующие шаги.
1. Все данные смещаются на 128. Новое значение матрицы данных
aСМ = a – 128:

 - 3 3 - 4 0- 4 0- 4 1- 3 3- 4 0- 3 3- 3 3
 1 5 1 6 2 3 2 3 2 5 4 2 5 5 5 3
 
 2 5 2 3 3 4 3 8 3 4 2 3 - 2 - 1 1
 
1 5 1 6 5 2 1 5 2 5 3 1 4 7.
aС М= 
 - 5 - 1 6- 1 2 1 5 1 9 3 4 6 1
 
5 2 3 3 4 3 8 4 2 6 0 3 8 0 
 3 2 4 0 3 8 3 1 7 - 2 7- 3 5- 3 0
 
 2 6 2 7 2 5 1 6 - 2 - 2 2- 1 05 
2. Выполняются ДКП над смещенными данными: α = FN a CM FNT ;
результаты округляются до целых значений:

83
9 22 - 8 - 7 4 - 1 1 1
 - 3 9- 5 17 1 1 7 - 2 2 4 2 
 
 - 8 56 4 0 1 7 3 5 - 6 5 
 
- 5 2- 3 - 7 1 10 3 - 9 3 - 2 0 
α= .
 - 8 6- 4 51 0 - 8 1 8 - 7 - 2 5 
 
- 6 36 6 - 1 - 3 1 2 - 8 - 2 1 
 -1 71 5 - 3 17 8 - 1 32 3 -  1
 
 - 5 3 1 - 7 - 1 20 3 - 1 1 3 
3. Выполняется загрубение коэффициентов разложения. Этот шаг
требует подробного объяснения, так как именно он является основным для
сжатия изображения. Дело в том, что каждый коэффициент разложения
характеризует вклад соответствующей базисной функции (гармоники) в
формирование сигнала. Чем больше сумма значений индексов у
коэффициента, тем выше частота соответствующей ему гармоники
(гармоника представляет собой косинусоиду). Гармонические составляющие
с большими частотами переносят более мелкие подробности изображения,
неразличимые зрением. Поэтому некоторые коэффициенты могут быть
отброшены и за счет этого уменьшен объем данных, если их хранить или
передавать не как отсчеты сигнала, а как результаты ДКП. Для этого
коэффициентам с большими индексами необходимо установить больший
порог значимости, например следующим образом:
αsr
α1sr = ,
q sr
q sr = 1 + ( s + r )Q,

где Q – параметр, задающий степень сжатия. Для рассматриваемого примера


при Q = 4 получим

84
 1 80 - 1 0 0 0 0 0
 -4 - 4 1 1 0 0 0 0
 
 -7 4 0 - 1 0 0 0 0
 
1  -3 - 2 0 0 0 0 0 0
α= .
 -4 - 2 2 0 0 0 0 0
 
 -3 2 0 0 0 0 0 0
 -1 0 - 1 0 0 0 0 0
 
 - 2 1 0 0 0 0 0 0
4. Кодирование данных. На этом шаге сначала полученные
коэффициенты матрицы α 1
представляют в виде линейной
последовательности
α00
1
,α01
1
,α10
1
,α20
1
,α11
1
,α02
1
,α03
1
,α12
1
,α21
1
,α30
1
,..., α67
1
,α76
1
,α77
1
,
т.е. в зигзагообразном порядке. Для нашего примера будет получена
следующая последовательность:
18, 0, –4, –7, –4, –1, 0, 1, 4, –3, –4, –2, 0, 1, 0, 0, 0, –1, 0, –2, –3, –1, 2, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, –2, 1, –1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0.
Затем серии нулей кодируют методом RLE, что дает существенное
сжатие (например, в приведенной последовательности имеется одна серия из
3 нулей, одна серия из 11 нулей и одна серия из 26 нулей). Кроме того, для
улучшения сжатия дополнительно можно применить метод Хаффмена или
арифметического кодирования.
Для восстановления данных выполняются обратные действия:
1. восстанавливается матрица α 1;
2. восстанавливается матрица α :
αsr = α1sr qsr ;

3. восстанавливается матрица aСМ:


a СМ = FNT α FN ;

85
4. восстанавливается матрица a:
a = aСМ + 128.
Восстановленная матрица будет отличаться от исходной матрицы.
Однако при правильном подборе параметра, задающего степень сжатия,
отличия не будет восприниматься человеком, рассматривающим
изображение.
Подчеркнем, что шаги компрессии и декомпрессии выполняются для
всех компонент всех блоков графического файла.
Изложенный метод служит основой сжатия данных по известному
стандарту JPEG. Он также является основой метода сжатия, применяемого
при представлении видеоданных в стандарте MPEG. Аналогичные методы
применяются также и для сжатия звуковых данных.

Вопросы
1. Словарные методы.
2. Метод LZ77.
3. Метод LZ78.
4. Методы RLE.
5. Преобразование Фурье.
6. Одномерное дискретное косинусное преобразование.
7. Двумерное дискретное косинусное преобразование.
8. Сжатие данных с применением дискретного косинусного преобразования.

Лекция 12
Тема 8. Сжатие непрерывной информации
8.1. Преобразование информации в цифровую форму
Очевидным способом сжатия непрерывной информации является ее
преобразование в цифровую форму, так как при этом часть информации
удаляется. В этом случае получают последовательность чисел – отсчетов
(выборок) исходного сигнала, которую затем можно дополнительно сжать

86
любым из рассмотренных выше методом (в этом случае будет удалена
избыточность в получившихся дискретных данных).
В основе преобразования непрерывных сигналов в цифровую форму
лежат две операции – дискретизация и квантование. Дискретизация
заключается в периодическом измерении непрерывного сигнала (с
некоторым интервалом дискретизации) и использование моментальных
значений (отсчетов) вместо исходной «волны». Квантование представляет
собой приведение значения очередного отсчета к допустимой величине из
конечного множества значений, соответствующим уровням квантования,
отличающимся на некоторый интервал квантования. Пример преобразования
непрерывного сигнала в цифровую форму с 13 отсчетами (с интервалом
дискретизации ∆ t) и 10 уровнями квантования (с интервалом квантования
∆ u) показан на рис. 8.1.

9∆
u8∆
u7∆
u6∆
u5∆
u4∆
u3∆
u2∆
u
∆u
∆ 3∆ 4∆ 5∆ 6∆ 7∆ 8∆ 9∆ 10 11∆ 12∆
2∆ t
t t t t t t t t ∆t t t
Рис. 8.1. Преобразование звукового сигнала в цифровую форму
Для представления результатов дискретизации используют
амплитудно-импульсную модуляцию (АИМ): сигнал преобразуется в набор
импульсов определенной длительности (меньшей интервала дискретизации)
с амплитудами, равными значениям, зафиксированным в момент опроса.
Результат квантования можно воспринимать как представление каждого
отсчета в виде последовательности импульсов, соответствующей двоичному
коду ближайшего к его значению уровня квантования (импульсно-кодовая
модуляция, ИКМ). Данные представления результатов дискретизации и

87
квантования играют роль при передаче информации по каналу связи. С точки
зрения обработки и хранения информации последовательность отсчетов
храниться в памяти вычислительной системы в виде чисел.

8.2. Адаптивные методы преобразования непрерывной информации в


цифровую форму
Выше были описаны равномерные дискретизация и квантование:
интервал дискретизации и интервал квантования являлись постоянными
независимо от характера сигнала в тот или иной момент времени. Однако
можно значительно сократить избыточность информации за счет применения
адаптивных методов преобразования сигнала в цифровую форму.
Рассмотрим метод дифференциальной импульсно-кодовая модуляции
(ДИКМ). Он основан на том, что фиксируются не сами моментальные
значения, а разница между последовательными значениями. Так как при
малом интервале дискретизации последовательно идущие выборки
отличаются друг от друга незначительно. В результате ДИКМ понадобиться
меньшее количество бит для хранения информации по сравнению с
равномерным квантованием. Пусть, например, три последовательные
выборки имеют величины 17, 22 и 23. Тогда после ДИКМ получим
последовательность чисел 17, 5 и 1, для которых можно получить коды с
меньшей средней длиной кодовых слов. При практическом использовании
ДИКМ набор допустимых приращений задается заранее.
Идея ДИКМ получила дальнейшее развитие в виде адаптивной ДИКМ
(АДИКМ). Методы, использующие АДИКМ, получили широкое
распространение как методы компрессии звука, обеспечивающие фактор
сжатия 4 при сохранении приемлемого качества звучания. Здесь вместо того,
чтобы использовать заранее заданные приращения, набор допустимых
приращений определяется, исходя из предварительно считанных данных.
Часто данный набор допустимых приращений принимает форму
изменяющегося масштабного коэффициента. Подгоняя значение

88
масштабного коэффициента к параметрам конкретного фрагмента, например,
звуковой записи, можно добиться более высокого качества, чем при
использовании обычной ДИКМ.
Широкое распространение получили также методы компрессии с
прогнозированием. В основе таких методов лежит задача поиска способа
предсказания последующего элемента данных на основе уже имеющихся
данных. При этом если удастся угадать, каким будет следующий элемент, то
хранить его не нужно, так как декодер, используя тот же способ
прогнозирования, просто вычислит пропущенное значение. Такие методы
часто используются для сжатия измерительной информации, поступающей в
систему с датчиков (интерполяционные и экстраполяционные методы).

8.3. Нелинейная ИКМ


При сжатии звуковой информации широкой применение получили
методы компрессии, основанные на нелинейной ИКМ. Это тоже методы
адаптивного преобразования в цифровую форму, но их обсудим отдельно.
Основная идея рассматриваемых методов заключается в том, что слух
человека устроен так, что практически нечувствителен к небольшим
искажениям громких звуков, зато очень хорошо замечает те же искажения в
более тихих звуках. Для обеспечения такой чувствительности можно
воспользоваться логарифмическими преобразованиями.
Наиболее широко используются методы µ - и A-типа. Метод µ -типа
основан на применении формулы

1
sµ = s i g(sn) l o g1 +( 2 5 |5s |) ,
8
 + 1, s ≥ 0,
s i g(sn) = 
 − 1, s < 0,

89
где s и sµ – исходное и преобразованное значения выборки, при этом s
представляет собой дробное число в диапазоне от –1 до +1.
В методе A-типа используется коэффициент A, чаще всего имеющий
значение 87.6. Для выборок, значения которых лежат в диапазоне от 0 до 1,
метод задается следующей формулой:

 As 1
 1 + l nA , s ≤ A ,
sA = 
 1 + l n A( )s, 1 < s ≤ 1,
 1 + l nA A
где s и sA – исходное и преобразованное значения выборки.
Отметим, что в методах µ - и A-типа больше общих черт, чем
различий. При этом главное различие заключается в том, что первые
используются в США и Японии, а вторые – в Европе.

8.4. Поддиапазонное кодирование звуковых данных


Все наиболее совершенные из действующих в настоящее время
методов компрессии звука, включая MPEG-аудио, Dolby AC-2 и AC-3,
систему Sony MiniDisk (ATRAC), а также RealAudio, основаны на
поддиапазонном кодировании. Обычно такое кодирование позволяет сжать
звуковые данные в 10 – 20 раз. Поддиапазонные методы заключаются в том,
что для повышения эффективности ДКИМ частотный диапазон звука делится
на две или более частей (выделяются частотные поддиапазоны) и каждая из
частей сжимается по отдельности. Применение нескольких поддиапазонов
позволяет использовать знания о строении слуха человека для получения еще
более качественной компрессии. Поскольку человек в одних диапазонах
частот слышит лучше, чем в других, можно использовать различные
параметры компрессии для различных диапазонов. Поддиапазоны,
расположенные вблизи центра слышимой человеком области, могут
оставаться без изменений, в то время как менее различимые диапазоны –

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

8.5. Методы сжатия речи


Для компрессии речи разработаны специальные методы. Самый
простой метод кодирования речи называется кодированием пауз. Он основан
на том, что в речи человека присутствует много пауз. Часть их – короткие
паузы между словами и фразами, остальное – более длинные паузы между
предложениями или репликами разных людей. Часто, выделяя эти паузы и
заменяя их компактными кодами, в которых указывается длительность
паузы, за счет сжатия удается сэкономить до 50% первоначального объема
речевой информации.
Более изощренные алгоритмы состоят из двух частей. Первая – это
математическая модель голосового тракта человека. Она представляет собой
последовательность уравнений, в которых используется информация о
гортани, горле, языке и губах человека для получения звуков, подобных тем,
что издает человек. Вторая часть – анализирующий механизм, на основании
считанного звука подготавливающий параметры для этой модели. При
компрессии разговора используется анализирующее устройство,
формирующее последовательность параметров. При декомпрессии
записанные параметры передаются в модель голосового тракта и получаются
звуки. С помощью подобной технологии удается сжать речь человека в 100
раз и более, сохранив при этом хорошее качество звучания.
Вопросы
1. Дискретизация.
2. Квантование.

91
3. Сжатие непрерывной информации за счет преобразования в цифровую
форму.
4. Дифференциальная импульсно-кодовая модуляция.
5. Адаптивная дифференциальная импульсно-кодовая модуляция.
6. Методы компрессии с прогнозированием.
7. Методы нелинейной импульсно-кодовой модуляции.
8. Поддиапазонное кодирование звуковых данных.
9. Кодирование пауз.
10. Сжатие речи на основе модели голосового тракта.

92