使用霍夫曼编码,我们只需生成符号映射 - >码。然后,当运行长度编码时,我们使用此映射与代码交换符号。这允许容易地将代码与我们不想编码/压缩的一些其他符号混合。例如,在JPEG中,我们编码[前一个零的数量,AC系数的比特数]并将其置于比特流,然后是AC系数比特表示。这是霍夫曼编码的一个非常方便的属性。
现在我想问的是,是否可以用算术编码做类似的事情(在非对称数字系统的背景下导致我实现的目的)?我不知道如何解决这个问题。
答案 0 :(得分:1)
混合原始位有多种方法,例如参见旁路编码:https://fgiesen.wordpress.com/2015/12/21/rans-in-practice/通常,获得数据压缩帮助的最佳位置是encode.ru论坛。
答案 1 :(得分:0)
当然,假设您在切换到后续位的某些其他解释之前知道要从算术代码/ ANS解码多少个符号。这与Huffman案例没有什么不同,在这种情况下,您可以在更改对位的解释之前知道要读取多少个符号。
答案 2 :(得分: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(基于提供的网站)应该是什么,但不知道他们为什么按照他们的方式定义。我真的很欢迎一些解释。