ハフマン符号化について少し異なる考え方を見てみましょう。
確率が0.5、0.25、および0.25の3つの記号A、B、Cのアルファベットがあるとします。確率はすべて2の逆乗であるため、これには最適なハフマンコードがあります(つまり、算術コーディングと同じです)。この例では、正規コード0、10、11を使用します。
状態が長整数であると仮定します。これをと呼びます。エンコーディングは、現在の状態とエンコードするシンボルを受け取り、新しい状態を返す関数と考えることができます。s
encode(s,A)encode(s,B)encode(s,C)=2s=4s+2=4s+3
それでは、状態11(バイナリでは1011)から始めて、シンボルBをエンコードします。新しい状態は46で、バイナリでは101110です。ご覧のとおり、これはシーケンス10が最後に追加された「古い」状態です。基本的にビットシーケンスを「出力」します10。
ここまでは順調ですね。
ここで、算術コーディングがどのように機能するかについて少し考えてみましょう。確率を共通の分母に置くと、記号Aは実際に範囲、記号Bは範囲[2[04,24)および記号Cは範囲[3[24,34)。[34,44)
基本的にここで私たちがしていることは、すべてに共通の分母を掛けることです。状態が実際にはベース4にあると想像してください。シンボルBをエンコードすると、実際にはそのベースに数字2が出力され、シンボルCをエンコードすると、そのベースに数字3が出力されます。
ただし、シンボルAは、基数4の数字ではないため、少し異なります。
代わりに、アルファベットを等しい確率でシンボルA_0、A_1、B、Cのセットと考えることができます。これにも、最適なハフマンコード00、01、10、11があります。または、これもベース4で考えることができます。シンボルをエンコードするには、次のようにします。
encode(s,A0)encode(s,A1)encode(s,B)encode(s,C)=4s+0=4s+1=4s+2=4s+3
A0A1
s
s′=⌊s2⌋
i=smod2
そして。encode(s′,Ai)
前の例を使用すると、およびであることがわかり、次にます。新しい状態はバイナリで10101です。s ′ = 5 i = 1 エンコード(5 、A 1)= 4 × 5 + 1 = 21s=11s′=5i=1encode(5,A1)=4×5+1=21
これはハフマンコーディングとまったく同じビット出力を生成しませんが、同じ長さの出力を生成します。そして、私があなたが見ることができることを望んでいるのは、これもユニークにデコード可能であることです。シンボルをデコードするには、4で割った余りを取ります。値が2または3の場合、シンボルはそれぞれBまたはCです。0または1の場合、シンボルはAであり、状態に2を掛けて0または1を追加することにより、情報のビットを戻すことができます。
このアプローチの良い点は、確率の分子または分母が2のべき乗でない場合に、自然に分数ビットエンコーディングに拡張されることです。AとBの2つのシンボルがあり、Aの確率がで、Bの確率がます。次に、シンボルを次のようにエンコードできます。 23525
encode(s,A0)encode(s,A1)encode(s,A2)encode(s,B0)encode(s,B1)=5s+0=5s+1=5s+2=5s+3=5s+4
シンボルAをエンコードするには、と、そしてます。I=SMOD3エンコード(S'、AI)s′=⌊s3⌋i=smod3encode(s′,Ai)
これは算術コーディングに相当します。これは、実際にはAsymmetric Numeral Systemsと呼ばれる手法のファミリーであり、過去数年間にJarek Dudaによって開発されました。名前の意味は明白である必要があります。シンボルを確率でエンコードするには、概念的にbase-pの数字を状態から盗み、base-qの数字を追加します。非対称性は、状態を2つの異なる基数の数値として解釈することから生じます。pq
それがコーディング方法のファミリーである理由は、ここで見たものがそれだけでは非実用的だからです。状態変数を効率的に操作するための無限精度の整数はおそらくないという事実に対処するためにいくつかの変更が必要であり、これを実現するにはさまざまな方法があります。もちろん、算術コーディングには、その状態の精度に関する同様の問題があります。
実用的なバリエーションには、rANS(「r」は「比率」を意味します)とtANS(「テーブル駆動型」)があります。
ANSには、算術符号化に比べて実用的かつ理論的ないくつかの興味深い利点があります。
- 算術符号化とは異なり、「状態」は2つの単語ではなく1つの単語です。
- それだけでなく、ANSエンコーダーとそれに対応するデコーダーは同一の状態を持ち、その動作は完全に対称です。これにより、エンコードされたシンボルの異なるストリームをインターリーブでき、すべてが完全に同期するなど、いくつかの興味深い可能性が生じます。
- もちろん、実用的な実装では、情報を「出力」して、最後に書き込むために大きな整数に収集するだけでなく、実行する必要があります。ただし、「出力」のサイズは、(通常はわずかな)圧縮損失と引き換えに構成できます。したがって、算術コーダーが一度にビットを出力する必要がある場合、ANSはバイトまたはニブルを一度に出力できます。これにより、速度と圧縮の直接的なトレードオフが得られます。
- 現在の世代のハードウェアでは、バイナリ算術符号化とほぼ同じ速度で、ハフマン符号化と競合できるようです。これにより、大きなアルファベットの算術コーディングとそのバリアント(たとえば、範囲コーディング)よりもはるかに高速になります。
- 特許がないようです。
私は算術符号化を再び行うつもりはないと思います。