Кодирование методом Хаффмана

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

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=3×2 cell
    {[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