# huffmanenco

Encode sequence of symbols by Huffman encoding

## Syntax

``code = huffmanenco(sig,dict)``

## Description

example

````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.```

## 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.

## Version History

Introduced before R2006a