Кодирование методом Хаффмана предлагает способ сжать данные. Средняя длина Кода Хаффмана зависит от статистической частоты, с которой источник производит каждый символ из своего алфавита. Словарь Кода Хаффмана, который сопоставляет каждый символ данных с кодовой комбинацией, имеет свойство, что никакая кодовая комбинация в словаре не является префиксом никакой другой кодовой комбинации в словаре.
huffmandict
, huffmanenco
и функции huffmandeco
поддерживают Кодирование методом Хаффмана и декодирование.
Для длинных последовательностей из источников, скашивавших дистрибутивы и маленькие алфавиты, кодирование арифметики сжимается лучше, чем Кодирование методом Хаффмана. Чтобы изучить, как использовать арифметическое кодирование, смотрите Арифметическое Кодирование.
Кодирование методом Хаффмана запрашивает статистическую информацию об источнике закодированных данных. В частности, входной параметр p
в функции huffmandict
перечисляет вероятность, с которой источник производит каждый символ в своем алфавите.
Например, рассмотрите источник данных, который производит 1 с с вероятностью 0.1, 2 с с вероятностью 0.1 и 3 с с вероятностью 0.8. Основной вычислительный шаг в кодировании данных из этого источника с помощью Кода Хаффмана должен создать словарь, который сопоставляет каждый символ данных с кодовой комбинацией. Пример ниже создает такой словарь, и затем покажите вектор кодовой комбинации, сопоставленный с особым значением от источника данных.
Этот пример показывает, как создать словарь Кода Хаффмана с помощью функции huffmandict
.
Создайте вектор символов данных и присвойте вероятность каждому.
symbols = [1 2 3]; prob = [0.1 0.1 0.8];
Создайте словарь Кода Хаффмана. Самый вероятный символ данных, 3, сопоставлен с одноразрядной кодовой комбинацией, в то время как менее вероятные символы данных сопоставлены с кодовыми комбинациями 2D цифры.
dict = huffmandict(symbols,prob)
dict = 3x2 cell array
{[1]} {1x2 double}
{[2]} {1x2 double}
{[3]} {[ 0]}
Отобразите вторую строку словаря. Вывод также показывает, что энкодер Хафмана, получающий символ данных 2
, заменяет последовательностью 1 0
.
dict{2,:}
ans = 2
ans = 1×2
1 0
Пример выполняет Кодирование методом Хаффмана и декодирующий использование источника, алфавит которого имеет три символа. Заметьте, что huffmanenco
и функции huffmandeco
используют словарь, созданный huffmandict
.
Сгенерируйте последовательность данных, чтобы закодировать.
sig = repmat([3 3 1 3 3 3 3 3 2 3],1,50);
Задайте набор символов данных и вероятности, сопоставленной с каждым элементом.
symbols = [1 2 3]; p = [0.1 0.1 0.8];
Создайте словарь Кода Хаффмана.
dict = huffmandict(symbols,p);
Закодируйте и декодируйте данные. Проверьте, что исходные данные, sig
, и декодируемые данные, dhsig
, идентичны.
hcode = huffmanenco(sig,dict); dhsig = huffmandeco(hcode,dict); isequal(sig,dhsig)
ans = logical
1