Main Content

huffmanenco

Encode sequence of symbols by Huffman encoding

Description

code = huffmanenco(sig,dict) encodes input signal sig using the Huffman codes described by input code dictionary dict. sig can have the form of a vector, cell array, or alphanumeric cell array. If sig is a cell array, it must be either a row or a column. dict is an N-by-2 cell array, where N is the number of distinct possible symbols to encode. The first column of dict represents the distinct symbols and the second column represents the corresponding codewords. Each codeword is represented as a row vector, and no codeword in dict can be the prefix of any other codeword in dict. You can generate dict using the huffmandict function.

example

Examples

collapse all

Create unique symbols, and assign probabilities of occurrence to them. Determine minimum number of bits required for binary representation of the symbols.

symbols = 1:6;
p = [.5 .125 .125 .125 .0625 .0625];
bps = ceil(log2(max(symbols)));      % Bits per symbol

Create a Huffman dictionary based on the symbols and their probabilities.

dict = huffmandict(symbols,p);

Generate a vector of random symbols.

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

Encode the random symbols.

code = huffmanenco(inputSig,dict);

Decode the data. Verify that the decoded symbols match the original symbols.

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

Convert the original signal to a binary, and determine the length of the binary symbols.

binarySig = int2bit(inputSig,bps);
seqLen = numel(binarySig)
seqLen = 
300

Convert the Huffman-encoded symbols to binary, and determine the length of the encoded binary symbols.

binaryComp = int2bit(code,bps);
encodedLen = numel(binaryComp)
encodedLen = 
672

Define the alphanumeric symbols in cell array form.

inputSig = {'a2',44,'a3',55,'a1'}
inputSig=1×5 cell array
    {'a2'}    {[44]}    {'a3'}    {[55]}    {'a1'}

Define a Huffman dictionary. Codes for signal letters must be numeric.

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]}

Encode the alphanumeric symbols.

enco = huffmanenco(inputSig,dict);

Decode the data. Verify that the decoded symbols match the original symbols.

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

isequal(inputSig,sig)
ans = logical
   1

Input Arguments

collapse all

Input signal for the compression, specified as a vector, cell array, or an alphanumeric cell array. sig can have the form of a vector, cell array, or alphanumeric cell array. If sig is a cell array, it must be a 1-by-S or S-by-1 cell array, where S is the number of symbols.

Data Types: double | cell

Huffman code dictionary, specified as an N-by-2 cell array. N is the number of distinct possible symbols for the function to encode. The first column of dict represents the distinct symbols and the second column represents the corresponding codewords. Each codeword is represented as a row vector, and no codeword in dict can be the prefix of any other codeword in dict. You can generate dict by using the huffmandict function.

Data Types: double | cell

Output Arguments

collapse all

Encoded signal for the input Huffman code dictionary dict, returned as a vector.

References

[1] Sayood, Khalid. Introduction to Data Compression. 2nd ed. San Francisco: Morgan Kaufmann Publishers, 2000.

Extended Capabilities

C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.

Version History

Introduced before R2006a

expand all

See Also

Functions