huffmandeco

Декодируйте двоичный код Хафманом, декодирующим

Описание

пример

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

Примеры

свернуть все

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

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

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

dict = huffmandict(symbols,p);

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

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

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

code = huffmanenco(inputSig,dict);

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

sig = huffmandeco(code,dict);
isequal(inputSig,sig)
ans = logical
   1

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

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

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

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

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

inputSig = {'a2',44,'a3',55,'a1'}
inputSig=1×5 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=5×2 cell array
    {'a1'}    {[      0]}
    {'a2'}    {[    1 0]}
    {'a3'}    {[  1 1 0]}
    {[44]}    {[1 1 1 0]}
    {[55]}    {[1 1 1 1]}

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

enco = huffmanenco(inputSig,dict);

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

sig = huffmandeco(enco,dict)
sig=1×5 cell array
    {'a2'}    {[44]}    {'a3'}    {[55]}    {'a1'}

isequal(inputSig,sig)
ans = logical
   1

Входные параметры

свернуть все

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

Типы данных: double

Словарь кода Хаффмана в виде N-by-2 массив ячеек. N является количеством отличных возможных символов для функции, чтобы закодировать. Первый столбец dict представляет отличные символы, и второй столбец представляет соответствующие кодовые комбинации. Каждая кодовая комбинация представлена как числовой вектор-строка и никакая кодовая комбинация в dict может быть префикс любой другой кодовой комбинации в dict. Можно сгенерировать dict при помощи huffmandict функция.

Типы данных: double | cell

Выходные аргументы

свернуть все

Декодируемый сигнал, возвращенный как числовой вектор, числовой массив ячеек или алфавитно-цифровой массив ячеек.

  • Если все символы во входном словаре кода dict являются числовыми, sig вектор.

  • Если любой символ во входном словаре кода dict является алфавитным, sig одномерный массив ячеек.

Ссылки

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

Смотрите также

Функции

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