最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ハフマン符号化

ハフマン符号化は、データを圧縮する方法を提供します。ハフマン符号の平均の長さは、ソースのアルファベットから各シンボルが生成される統計的な頻度に応じて異なります。各データ シンボルを符号語と関連付けるハフマン符号ディクショナリの性質として、ディクショナリ内の符号語はディクショナリ内の他の符号語の接頭辞ではありません。

関数 huffmandicthuffmanenco、および huffmandeco は、ハフマン符号化と復号化をサポートします。

メモ

ソースからの長いシーケンスに歪んだ分布があり、アルファベットの数が少ない場合、算術符号化による圧縮はハフマン符号化よりも優れています。算術符号化の使用方法の詳細は、算術符号化を参照してください。

ハフマン符号化は、符号化されるデータのソースに関する統計的な情報を必要とします。特に、関数 huffmandict の入力引数 p は、ソースのアルファベットで各シンボルが生成される確率をリストします。

たとえば、確率 0.1 で 1 を生成し、確率 0.1 で 2 を生成し、確率 0.8 で 3 を生成するデータ ソースを考えます。このソースからハフマン符号を使用してデータを符号化する主な計算ステップは、各データ シンボルを符号語と関連付けるディクショナリを作成することです。以下の例は、そのようなディクショナリを作成してから、データ ソースの特定の値と関連する符号語ベクトルを示します。

ハフマン符号ディクショナリの作成

この例では、関数 huffmandict を使用してハフマン符号ディクショナリを作成する方法を示します。

データ シンボルのベクトルを作成し、それぞれに確率を割り当てます。

symbols = [1 2 3];
prob = [0.1 0.1 0.8];

ハフマン符号ディクショナリを作成します。最も確率の高いデータ シンボル 3 が 1 桁の符号語に関連し、確率の低いデータ シンボルが 2 桁の符号語と関連します。

dict = huffmandict(symbols,prob)
dict=3×2 cell
    {[1]}    {1x2 double}
    {[2]}    {1x2 double}
    {[3]}    {[       0]}

ディクショナリの 2 番目の行を表示します。この出力は、データ シンボル 2 を受け取るハフマン符号化器がシーケンスを 1 0 に置き換えることも示しています。

dict{2,:}
ans = 2
ans = 1×2

     1     0

ハフマン符号の作成と復号化

この例は、アルファベットに 3 つのシンボルがあるソースを使用して、ハフマン符号化および復号化を行います。関数 huffmanenco および huffmandecohuffmandict によって作成されたディクショナリを使用することに注意してください。

データ シーケンスを生成して符号化します。

sig = repmat([3 3 1 3 3 3 3 3 2 3],1,50);

データ シンボルのセットおよび各要素に関連付けられる確率を定義します。

symbols = [1 2 3];
p = [0.1 0.1 0.8];

ハフマン符号ディクショナリを作成します。

dict = huffmandict(symbols,p);

データの符号化および復号化を行います。元のデータ sig と復号化済みのデータ dhsig が同じであることを確認します。

hcode = huffmanenco(sig,dict);
dhsig = huffmandeco(hcode,dict);
isequal(sig,dhsig)
ans = logical
   1