2017-07-18 7 views
0

ハフマンエンコーディングでは、単純にシンボル - >コードのマップを生成します。次に、ランレングス符号化では、このマップを使用してシンボルとコードを交換します。これにより、エンコード/圧縮したくない他のシンボルとコードを簡単に混合することができます。例えば、JPEGでは、[先行ゼロの数、AC係数のビット数]を符号化し、それをビットストリームに置き、その後にAC係数ビット表現が続きます。これは、ハフマン符号化の非常に便利な特性です。エントロピーコーディング(ハフマンと算術/ ANS) - 非コードでのコードの混合

これで、算術符号化と同様のことが可能であるかどうかを質問したいと思います(非対称数値システムのコンテキストでは、これは私が実装しているものです)。私はこれにどのように取り組むべきか分かりません。

答えて

0

生のビットを混合するにはさまざまな方法があります。たとえば、バイパスコーディング(https://fgiesen.wordpress.com/2015/12/21/rans-in-practice/)を参照してください。一般に、データ圧縮の助けを借りる最もよい場所はencode.ruフォーラムです。

0

確かに、後のビットの他の解釈に切り替える前に、算術符号/ ANSからデコードするシンボルの数を知っているとします。これは、ビットの解釈を変更する前に読むべきシンボルの数を知っているハフマンの場合と同じです。

0

@Jarek Duda: ありがとうございました。私はそこに行って、ソースコードの助けを借りて、生のビットの書き込み/読み込みを実装することができました。私は、正規化がどのように機能するかについていくつかの説明を求めたいと思います。 WriteRawの私の現在の実装では、次のようになります。

uint32 _x; 
deque<uint16> _words; 

... 

void NCommon::ANSCoder32::WriteRaw(uint16 value, uint8 bitsCount) 
{ 
    uint32 freq = 1 << (16 - bitsCount); 
    uint32 maxX = ((uint32)1 << 16) * freq; 

    if (_x >= maxX) 
    { 
     _words.push_back(_x & 0xFFFF); 
     _x >>= 16; 
    } 

    _x = (_x << bitsCount) | value; 
} 

私はどうあるべきかFREQとMAXX(提供ウェブサイトに基づく)を考え出したが、彼らは、彼らはある方法で定義されている理由はわかりません。私は本当にいくつかの説明を歓迎する。

関連する問題