2017-07-18 46 views
0

使用霍夫曼编码,我们只需生成符号 - >代码的映射。然后,当运行长度编码时,我们使用该映射与代码交换符号。这允许将代码与我们不想编码/压缩的一些其他符号轻松混合。例如,在JPEG中,我们编码[前面的零的数量,AC系数的位数],并将其放入比特流,然后是AC系数比特表示。这是霍夫曼编码的一个非常方便的特性。熵编码(Huffman and Arithmetic/ANS) - 混合代码与非代码

现在我想问的是,如果这可以做与算术编码类似的东西(在不对称数字系统的情况下导致这就是我正在实施)?我不知道如何解决这个问题。

回答

0

当然,假设您知道有多少个符号需要从算术代码/ ANS中解码出来,然后再切换到后续位的其他解释。这与Huffman案例没有什么不同,在这种情况下,在更改对位的解释之前,您知道要读取多少个符号。

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

我想应该是什么样频率和maxX的(根据网站上提供的),但不知道为什么,他们就被定义成这个样子。我真的很欢迎一些解释。