Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы.doc
Скачиваний:
8
Добавлен:
19.05.2015
Размер:
268.29 Кб
Скачать
  1. Принцип арифметического кодирования;

Метод Хаффмана является простым и эффективным, однако, он порождает наилучшие коды переменной длины (коды, у которых средняя длина равна энтропии алфавита) только когда вероятности символов алфавита являются степенями числа 2, то есть равны 1/2, 1/4, 1/8 и т.п. Это связано с тем, что метод Хаффмана присваивает каждому символу алфавита код с целым числом битов. Теория информации предсказывает, что при вероятности символа, скажем, 0.4, ему в идеале следует присвоить код длины 1.32 бита, поскольку . А метод Хаффмана присвоит этому символу код длины 1 или 2 бита.

Арифметическое кодирование решает эту проблему путем присвоения кода всему, обычно, большому передаваемому файлу вместо кодирования отдельных символов. (Входным файлом может быть текст, изображение или данные любого вида.) Алгоритм читает входной файл символ за символом и добавляет биты к сжатому файлу. Чтобы понять метод, полезно представлять себе получающийся код в виде числа из полуинтервала . Таким образом, код «9746509» следует интерпретировать как число «0.9746509» однако часть «0.» не будет включена в передаваемый файл.

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

В первом примере мы рассмотрим три символа  и  с вероятностями  и , соответственно. Интервал  делится между этими тремя символами на части пропорционально их вероятностям. Порядок следования этих подынтервалов не существенен. В нашем примере трем символам будут соответствовать подынтервалы  и . Чтобы закодировать строку «», мы начинаем с интервала . Первый символ  сокращает этот интервал, отбросив от него 40% в начале и 10% в конце. Результатом будет интервал . Второй символ  сокращает интервал  в той же пропорции до интервала . Третий символ  переводит его в . Наконец, символ  отбрасывает от него 90% в начале, а конечную точку оставляет без изменения. Получается интервал . Окончательным кодом нашего метода может служить любое число из этого промежутка. (Заметим, что подынтервал  получен из  с помощью следующих преобразований его концов:  и ).

На этом примере легко понять следующие шаги алгоритма арифметического кодирования:

1. Задать «текущий интервал» .

2. Повторить следующие действия для каждого символа  входного файла.

2.1. Разделить текущий интервал на части пропорционально вероятностям каждого символа.

2.2. Выбрать подынтервал, соответствующий символу , и назначить его новым текущим интервалом.

3. Когда весь входной файл будет обработан, выходом алгоритма объявляется любая точка, которая однозначно определяет текущий интервал.

После каждого обработанного символа текущий интервал становится все меньше, поэтому требуется все больше бит, чтобы выразить его, однако окончательным выходом алгоритма является единственное число, которое не является объединением индивидуальных кодов последовательности входных символов. Среднюю длину кода можно найти, разделив размер выхода (в битах) на размер входа (в символах).

  1. Классический алгоритм Лемпеля-Зива;

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

Пример 1: Строка "КОЛОКОЛ_ОКОЛО_КОЛОКОЛЬНИ" с помощью алгоритма LZ77 будет закодирована строкой "КОЛО(-4,3)_(-5,4)О_(-14,7)ЬНИ".

Пример 2: Строка "ААААААА" с помощью алгоритма LZ77 будет закодирована "А(-1,6)". С помощью алгоритма RLE она же будет закодирована как "(А,7)". Видно, что степень сжатия такой последовательности алгоритмом LZ77 несколько ниже. В тоже время алгоритм LZ77 более универсален.

Основу алгоритма составляют четыре базовых принципа:

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

  2. Разложение хранится в памяти и используется в дальнейшем в качестве словаря.

  3. Кодирование осуществляется при помощи указателей на фразы из уже сформированного словаря фраз.

  4. Кодирование является динамической процедурой, ориентированной на блоки. Сам процесс кодирования может быть дополнен скользящими окнами, содержащими текущий словарь фраз и окно просмотра.

  1. Алгоритм Лемпеля-Зива и Терри Уэлча.

Алгоритм LZ78, предложенный в 1978 г. Лемпелом и Зивом, нашел свое практическое применение только после реализации LZW84, предложенной Уэлчем (Welch) в 1984 г. Этот алгоритм является одним из наиболее оптимальных с точки зрения сочетания степени сжатии и скорости работы.

В отличие от предыдущего (LZ77), в данном алгоритме понятия строки и словаря несколько изменены. Словарь является расширяющимся (expanding). Первоначально в нем содержится только 256 строк длиной в одну букву – все коды ASCII. В процессе работы словарь разрастается до своего максимального объема |Vmax| строк (слов). Обычно, объем словаря достигает нескольких десятков тысяч слов. Каждая строка в словаре имеет свою известную длину и этим похожа на привычные словари и отличается от строк LZ77, которые допускали использование подстрок. Таким образом, количество слов в словаре точно равно его текущему объему. В процессе работы словарь пополняется по следующему алгоритму:

  1. В словаре ищется слово str, максимально совпадающее с текущим кодируемым словом в позиции pos исходного текста. Так как словарь первоначально не пустой, такое слово всегда найдется.

  2. В выходной файл помещается номер найденного слова в словаре position и следующий символ из входного текста B (на котором обнаружилось различие) - <position, B>. Длина кода при этом равна |position|+|B|= log Vmax + 8 (бит).

  3. Если словарь еще не полон, новая строка str+B добавляется в словарь по адресу last_position, размер словаря возрастает на одну позицию;

  4. Указатель в исходном тексте pos смещается на |strB| = |str| + 1 байт дальше к символу, следующему за В.

В таком варианте алгоритм почти не нашел практического применения и был значительно модернизирован. Изменения коснулись принципов управления словарем и способа формирования выходного кода:

- так как словарь увеличивается постепенно и одинаково для кодера и декодера, для кодирования позиции нет необходимости использовать log Vmax бит, а можно брать лишь log V бит, где V-текущий объем словаря.

- самая серьезная проблема LZ78-переполнение словаря: если словарь полностью заполнен, прекращается его обновление и процесс сжатия может ухудшиться. Отсюда следует вывод - словарь нужно иногда обновлять, но когда и как значительно? Самый простой способ - как только словарь заполнился его полностью обновляют. Недостаток очевиден – кодирование начинается на пустом месте, как бы с начала, и пока словарь не накопится, степень сжатия будет небольшой. Более сложные алгоритмы используют два словаря, которые заполняются синхронно, но с задержкой на |V|/2 слов один относительно другого. После заполнения одного словаря, он очищается, а работа переключается на другой. Еще более сложными являются эвристические методы обновления словарей в зависимости от частоты использования тех или иных слов.

Выходной код также формируется несколько иначе. В словаре ищется слово str, максимально совпадающее с текущим кодируемым словом в позиции pos исходного текста. В выходной файл помещается номер найденного слова в словаре <position>. Длина кода равна |position| = logV (бит). Если словарь еще не полон, новая строка strB добавляется в словарь по адресу last_position, размер словаря возрастает на одну позицию. Указатель в исходном тексте pos смещается на |str| байт дальше к символу В.

  1. Принцип кодирования цветных изображений, цветовое пространство, таблица цветов;

  2. Применение классических алгоритмов сжатия данных к черно-белым и цветным изображениям, способы повышения степени сжатия;

  3. Коды Грея, использование и преимущества кодирования;

  4. Схема и принцип работы алгоритма JPEG;

  5. Преобразование Хаара, применение вейвлет-разложения для кодирования изображений;

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

  7. Принцип и схема работы алгоритма MPEG для кодирования видео;

  8. Представление аудио сигналов в цифровом виде, теорема Котельникова;

  9. Способы кодирования аудио сигналов.