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