exponenta event banner

huffmanenco

Кодирование последовательности символов с помощью кодирования Хаффмана

Описание

пример

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

Примеры

свернуть все

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

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

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

свернуть все

Входной сигнал для сжатия, заданный как вектор, массив ячеек или алфавитно-цифровой массив ячеек. sig может иметь вид вектора, массива ячеек или алфавитно-цифрового массива ячеек. Если sig - массив ячеек, он должен быть массивом ячеек 1-by-S или S-by-1, где S - количество символов.

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

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

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

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

свернуть все

Кодированный сигнал для входного словаря кода Хаффмана dict, возвращено как вектор.

Ссылки

[1] Сайуд, Халид. Введение в сжатие данных. 2-я ред. Сан-Франциско: Morgan Kaufmann Publishers, 2000.

См. также

Функции

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