【问题标题】:Entropy coding (Huffman and Arithmetic/ANS) - mixing codes with non-codes熵编码(霍夫曼和算术/ANS) - 将代码与非代码混合
【发布时间】:2017-07-18 15:39:52
【问题描述】:
使用 Huffman 编码,我们只需生成符号映射 -> 代码。然后,当运行长度编码时,我们使用这个映射来交换一个符号和一个代码。这允许将代码与我们不想编码/压缩的其他一些符号轻松混合。例如,在 JPEG 中,我们编码 [前面零的数量,AC 系数的位数] 并将其放入比特流,然后是 AC 系数位表示。这是霍夫曼编码的一个非常方便的属性。
现在我想问的是,这是否可以用算术编码做类似的事情(在非对称数字系统的上下文中,这就是我正在实现的)?我不知道如何解决这个问题。
【问题讨论】:
标签:
compression
huffman-code
【解决方案2】:
当然,假设您知道在切换到后续位的其他解释之前要从算术代码/ANS 解码多少符号。这与 Huffman 情况没有什么不同,在这种情况下,您知道在更改对位的解释之前要读取多少个符号。
【解决方案3】:
@Jarek 杜达:
感谢您的链接。我去了那里,在源代码的帮助下能够实现原始位的写入/读取。不过,我想要求对标准化的工作原理进行一些解释。我当前的 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(基于提供的网站)应该是什么,但不知道为什么要这样定义它们。我真的很欢迎一些解释。