huffmanenco

Энкодер Хаффмана

Синтаксис

comp = huffmanenco(sig,dict)

Описание

comp = huffmanenco(sig,dict) кодирует sig сигнала с помощью Кодов Хаффмана, описанных словарем кода dict. Аргумент sig может иметь форму числового вектора, числового массива ячеек или алфавитно-цифрового массива ячеек. Если sig является массивом ячеек, это должна быть или строка или столбец. dict является массивом ячеек N-2, где N является количеством отличных возможных символов, которые будут закодированы. Первый столбец dict представляет отличные символы, и второй столбец представляет соответствующие кодовые комбинации. Каждая кодовая комбинация представлена как числовой вектор - строка, и никакая кодовая комбинация в dict не может быть префиксом никакой другой кодовой комбинации в dict. Можно сгенерировать dict с помощью функции huffmandict.

Примеры

свернуть все

Создайте уникальные символы и присвойте вероятности вхождения им.

symbols = 1:6; 
p = [.5 .125 .125 .125 .0625 .0625];

Создайте словарь Хаффмана на основе символов и их вероятностей.

dict = huffmandict(symbols,p);

Сгенерируйте вектор случайных символов.

sig = randsrc(100,1,[symbols; p]);

Закодируйте случайные символы.

comp = huffmanenco(sig,dict);

Декодируйте данные. Проверьте, что декодируемые данные совпадают с исходными данными.

dsig = huffmandeco(comp,dict);
isequal(sig,dsig)
ans = logical
   1

Преобразуйте исходный сигнал в двоичный файл и определите его длину.

binarySig = de2bi(sig);
seqLen = numel(binarySig)
seqLen = 300

Преобразуйте кодируемое сообщение Хаффмана и определите его длину.

binaryComp = de2bi(comp);
encodedLen = numel(binaryComp)
encodedLen = 224

Хаффман закодировал требуемые 224 бита данных, который составляет 25% сбережения по незакодированным данным.

Задайте алфавитно-цифровой сигнал в форме массива ячеек.

          sig = {'a2', 44, 'a3', 55, 'a1'}
sig = 1x5 cell array
    {'a2'}    {[44]}    {'a3'}    {[55]}    {'a1'}

Задайте словарь. Коды для букв сигнала должны быть числовыми.

          dict = {'a1',0; 'a2',[1,0]; 'a3',[1,1,0]; 44,[1,1,1,0]; 55,[1,1,1,1]}
dict = 5x2 cell array
    {'a1'}    {[       0]}
    {'a2'}    {1x2 double}
    {'a3'}    {1x3 double}
    {[44]}    {1x4 double}
    {[55]}    {1x4 double}

Закодируйте алфавитно-цифровые символы.

comp = huffmanenco(sig,dict);

Декодируйте данные и проверьте, что декодируемые данные совпадают с исходными данными.

dsig = huffmandeco(comp,dict)
dsig = 1x5 cell array
    {'a2'}    {[44]}    {'a3'}    {[55]}    {'a1'}

isequal(sig,dsig)
ans = logical
   1

Ссылки

[1] Sayood, Халид, введение в сжатие данных, Сан-Франциско, Моргана Кофманна, 2000.

Представлено до R2006a