- •Основы теории цифровой связи Часть 1 кодирование информации
- •1. Введение
- •1.1. Модель радиотехнической системы связи
- •Контрольные вопросы
- •1.2. Статистическая трактовка процесса передачи информации
- •Контрольные вопросы
- •1.3. Основные понятия и элементы математического аппарата теории связи
- •1.3.1. Сигналы и помехи
- •1.3.2. Разложение сигнала по системе ортогональных функций. Спектр сигнала
- •1.3.3. Cвойства преобразования Фурье
- •1.3.4. Корреляционная функция сигнала
- •1.3.5. Связь между корреляционной функцией и спектром сигнала
- •1.3.6. Случайные сигналы и их характеристики
- •Контрольные вопросы
- •1.4. Источники информации
- •1.5. Теорема дискретизации
- •1.6. Дискретизация изображений
- •Контрольные вопросы
- •1.7. Квантование. Ошибки квантования
- •Контрольные вопросы
- •1.8. Количество информации, содержащейся в сообщении
- •1.8.1. Энтропия сложных сообщений, избыточность источника
- •Контрольные вопросы и задачи
- •2. Основы экономного кодирования информации
- •2.1. Способы представления кодов
- •Контрольные вопросы и задачи
- •2.2. Типы систем сжатия
- •X Квантователь Xq Кодер без потерь информации b (Xq) Декодер X*
- •Методы кодирования без потерь
- •2.3.1. Понятие префиксного множества
- •2.3.2. Алгоритм кодирования Хаффмена
- •2.3.3. Алгоритм Шеннона–Фано
- •2.3.4. Блочные коды
- •2.3.5. Арифметическое кодирование
- •2.3.6. Словарное кодирование. Метод Зива–Лемпеля
- •2.3.7. Кодирование длин повторений (rle)
- •2.3.8. Дифференциальное кодирование
- •Контрольные вопросы и задачи
- •2.4. Методы сжатия с потерей информации
- •2.4.1. Функции “скорость–искажение” и “искажение–скорость”
- •2.5. Сжатие речевых сигналов
- •2.5.1. Кодирование формы сигнала, икм
- •2.5.2. Дифференциальная икм
- •2.5.3. Адаптивная дифференциальная икм (адикм)
- •2.5.4. Дельта-модуляция
- •2.5.5. Другие методы кодирования формы сигнала
- •2.5.6. Кодирование источника
- •2.5.7. Гибридные методы кодирования речи
- •2.5.8. Полноскоростной кодер rpe-ltp (стандарт gsm 06.10)
- •2.5.9. Кодер vselp (стандарт d-amps)
- •Контрольные вопросы и задачи
- •2.6. Кодирование изображений. Стандарт сжатия jpeg
- •Процедуру дкп можно записать в матричной форме:
- •2.6.1. Рекурсивный (вэйвлет) алгоритм
- •2.7. Сжатие подвижных изображений (видео)
- •3. Основы помехоустойчивого кодирования
- •3.1. Основные принципы. Типы кодов
- •3.2. Линейные блочные коды
- •3.2.1. Код с проверкой на четность
- •3.2.2. Итеративный код
- •3.2.3. Порождающая матрица линейного блочного кода
- •3.2.4. Проверочная матрица
- •3.2.5. Дуальные коды
- •3.2.6. Синдром и обнаружение ошибок
- •3.2.7. Синдромное декодирование линейных блочных кодов
- •3.2.8. Мажоритарное декодирование линейных блочных кодов
- •3.2.9. Декодирование методом максимального правдоподобия
- •Поскольку
- •Если принятый сигнал дискретизован и Si – I-й отсчет принятого сигнала.
- •3.2.10. Вес и расстояние Хемминга. Способность кодов обнаруживать и исправлять ошибки
- •Контрольные вопросы и задачи
- •3.3. Полиномиальные коды
- •3.3.1. Циклические коды
- •3.3.2. Кодирование с использованием циклических кодов
- •3.3.3. Вычисление синдрома и исправление ошибок в циклических кодах
- •3.3.4. Неалгебраические методы декодирования циклических кодов
- •3.4. Сверточные коды
- •3.4.1. Кодирование с использованием сверточных кодов
- •3.4.2. Синдромное декодирование сверточных кодов
- •3.4.3. Кодовое дерево и решетчатая диаграмма
- •3.4.4. Декодирование сверточных кодов. Алгоритм Витерби
- •3.4.5. Алгоритмы поиска по решетке
- •Контрольные вопросы и задачи
- •3.5. Применение корректирующего кодирования в системах связи
- •3.5.1. Каскадные коды
- •3.5.2. Кодирование с перемежением
- •Библиографический список
- •Часть 1 1
2.3.6. Словарное кодирование. Метод Зива–Лемпеля
Существует множество методов словарного кодирования, начало которым было положено работой двух израильских ученых – Зива и Лемпеля, опубликованной в 1977 году. Все они получили название “LZ-сжатие”.
Идея словарного кодирования достаточно проста. Допустим, нужно закодировать некоторое слово длиной в 8 букв из словаря размером в 32000 слов.нии Для кодирования любой из N букв равномерным двоичным кодом нужно, как известно, n = log2 N бит, то есть для кодирования любой буквы русского алфавита нужно n = log2 32 = 5 бит/букву. Тогда для кодирования любого слова длиной в 8 букв (средняя длина слов русского словаря) понадобится 5бит/букву 8букв = = 40 бит. Если же пронумеровать все слова в словаре (от 0 до 32000) и вместо кодирования самого слова (40 бит) кодировать его положение в словаре, то понадобится n = log2 32000 = 15 бит, то есть будем иметь почти трехкратный выигрыш в длине кода.
На самом деле, это только главная идея работы словарных методов – вместо кодирования самих данных кодировать их положение в словаре. Практически работающие алгоритмы кодирования используют ее по-разному. При этом все известные на сегодня алгоритмы LZ-сжатия можно разбить на две группы.
Методы, принадлежащие к первой группе, алгоритмы семейства LZ77, – находя в кодируемой последовательности цепочки символов, которые ранее уже встречались, вместо того чтобы повторять эти цепочки, заменяют их указателями на предыдущие повторения (ссылка назад, длина фрагмента).
Приведем схему наиболее популярного варианта LZ77, обладающего самым большим быстродействием:
while (lookAheadBuffer not empty)
get a pointer (position, lenght) to the longest match in
the window for lookahead buffer;
if (lenght > MINIMUM_MATCH_LENGHT)
output a pair (position, lenght);
shift the window lenght characters along;
else
output the first character in the lookahead buffer;
shift the window 1 character along;
endif; endwile
Алгоритм распаковки (декодирования) работает еще проще: если на вход поступает пара (position, length), то нужно выдать на выход фрагмент текста из окна длиной lenght символов, начиная с позиции position, если же на вход поступает один символ, то он копируется в выходной поток. После этого окно сдвигается на соответствующее количество символов.
Таким образом, словарь в этой группе алгоритмов содержится в сжатых данных в неявном виде, сохраняются лишь указатели на встречающиеся цепочки повторяющихся символов. При декодировании сжатого текста происходит замена указателя готовой фразой из словаря (из уже декодированного текста), на которую тот указывает.
Алгоритмы второй группы (семейство алгоритмов LZ78) в дополнение к исходному словарю источника (букв) создают словарь фраз, представляющих собой повторяющиеся комбинации символов, встречающиеся во входных данных. При этом размер словаря источника возрастает и для его кодирования потребуется большее количество бит, но значительная часть этого словаря будет представлять собой уже не отдельные буквы, а буквосочетания или целые слова. Когда кодер обнаруживает фразу, которая ранее уже встречалась, он заменяет ее индексом словаря, содержащим эту фразу.
Самым известным алгоритмом этого класса является алгоритм Тэри Уэлча (Terry Welch), описанный им в 1984 г. для применения в высокопроизводительных контроллерах жестких дисков. Однако наиболее широкое применение он нашел в скоростных модемах и вошел составной частью в протокол связи v.42bis. (Метод обозначается LZW.) Метод LZW в своей работе пользуется словарем, содержащим 4096 элементов. Элементы словаря с номерами 0 255 содержат отдельные символы, которые являются постоянными, то есть не изменяются в процессе работы алгоритма. Остальные элементы с номерами 256 4095 изначально имеют пустые ссылки, а в процессе работы указывают на фразы, составленные по следующему правилу: новая фраза образуется добавлением текущего символа к концу текущей фразы. Схема LZW алгоритма сжатия выглядит следующим образом:
w = NIL
loop
read a character K
if wK exists in the dictiontary
w = wK
else
output the code for w
add wK to the dictionary
w = K
endloop
Когда словарь переполняется, алгоритм Уэлча приписывает нулевые ссылки элементам словаря с номерами 256 4095, т.е. как бы начинает свою работу сначала.
Приведем упрощенные примеры работы алгоритмов второй группы.
Допустим нужно закодировать строку АBCABCABCABCABCABC. Текст сознательно взят с повторяющимися буквосочетаниями, чтобы продемонстрировать главную идею словарного метода.
Кодирование начинается с пустого словаря. Просматривая кодируемые данные, кодер начинает составлять свой словарь согласно следующему правилу: первыми в словаре идут первые однократно встречающиеся символы исходного текста А = 1, B = 2, C = 3. Далее в тексте снова встретилась буква А, но она в словаре уже есть, поэтому в словарь начинают добавляться фразы длиной в два символа из уже имеющихся в словаре: АB = 4, СА = 5, ВС = = 6. Далее в тексте встречается уже имеющееся в словаре буквосочетание – АB, поэтому к словарю начинают добавляться фразы из трех символов – АBС = 7, и т.д.
В результате получается следующий словарь кодера:
Символ словаря Индекс словаря
А 1
B 2
С 3
AB 4
CA 5
BC 6
ABC 7,
а результат кодирования фразы АBCABCABCABCABCABC будет выглядеть, как 123456777, то есть гораздо более компактно.
Рассмотрим немного отличающийся вариант кодирования. В этом случае закодированные данные состоят из пакета {адрес словаря, следующий символ данных}, а каждый новый элемент словаря образуется как {элемент словаря, на который делается ссылка, следующий символ данных}. Допустим, нужно закодировать последовательность символов ABAABABBBBBBBABBBBA. Процедура и результат кодирования выглядят следующим образом.
Закодированные пакеты:{0,A}{0,B}{1,A}{2,A}{2,B}{5,B}{5,A}{6,B}{4,}
Адрес в словаре: 1 2 3 4 5 6 7 8
Содержимое словаря: A B AA BA BB BBB BBA BBBB.
Пакеты {0, A} и {0, B} означают первые одиночные символы в тексте, пакет {1, A} уже ссылается на первую букву текста и добавляет к ней A, пакет {2, A} ссылается на вторую букву текста и добавляет к ней А и т. д.
