Encoding 无模糊或非法输出的范围编码

Encoding 无模糊或非法输出的范围编码,encoding,compression,entropy,range-encoding,Encoding,Compression,Entropy,Range Encoding,在范围编码器中,使用有限精度算法可能会导致在不首先应用某种刷新或调整以打开工作寄存器中的空间的情况下无法对下一个符号进行编码 这样做的结果是,根据调整的方式,在合法比特流集中可能会留下一些小间隙 例如,建议将输出范围缩小到允许更多位移出的范围,保留原始范围的某些部分未定义 在解码器中,可能会到达同一点,然后发现输入比特流本身不符合编码器调整,而是继续向下进入编码器应丢弃的间隙。这种比特流没有正确的解码 这与Huffman之类的东西形成对比,Huffman通常是在没有任何模糊输入配置的情况下定义的

在范围编码器中,使用有限精度算法可能会导致在不首先应用某种刷新或调整以打开工作寄存器中的空间的情况下无法对下一个符号进行编码

这样做的结果是,根据调整的方式,在合法比特流集中可能会留下一些小间隙

例如,建议将输出范围缩小到允许更多位移出的范围,保留原始范围的某些部分未定义

在解码器中,可能会到达同一点,然后发现输入比特流本身不符合编码器调整,而是继续向下进入编码器应丢弃的间隙。这种比特流没有正确的解码

这与Huffman之类的东西形成对比,Huffman通常是在没有任何模糊输入配置的情况下定义的(流末尾可能有不完整符号的情况除外)。因此,可以将任意比特流解码为消息,然后将其重新编码为原始比特流

我的问题是:是否有可能制定某种调整来处理精度限制,但不会产生不可编码或不明确比特流的可能性?这样,给定一个任意的比特流,总是有可能将它解码成一组符号,这些符号可以重新编码回原始比特流


直觉上,这似乎是不可能的,我不应该对这个问题大发雷霆;但是我看了哈夫曼,并推断它有一个我应该能够模拟的属性。

在写这个问题的过程中,我相信我可能找到了一个解决方案;但我现在还不确定。我将把它留在这里,要么有人(可能是我自己)最终会告诉我为什么我错了,要么它是正确的,并且可能对其他人有用

当您到达输出范围对于下一个符号来说太小的点时,这意味着该范围跨越了一个值,该值是2的一个大的幂,并且在该点上,下限和上限最终在最高有效位上不同

因此,取符号频率表,并将其划分在与范围内的壶边界大致相同的位置。然后根据符号是第一个分区还是第二个分区,设置POT的高边界或低边界;然后刷新新释放的位并将分区编码为一个完整的符号并继续


也许有一种功能上相当的方法可以做到这一点,但不太冗长。

在写这个问题的过程中,我相信我可能已经找到了解决办法;但我现在还不确定。我将把它留在这里,要么有人(可能是我自己)最终会告诉我为什么我错了,要么它是正确的,并且可能对其他人有用

当您到达输出范围对于下一个符号来说太小的点时,这意味着该范围跨越了一个值,该值是2的一个大的幂,并且在该点上,下限和上限最终在最高有效位上不同

因此,取符号频率表,并将其划分在与范围内的壶边界大致相同的位置。然后根据符号是第一个分区还是第二个分区,设置POT的高边界或低边界;然后刷新新释放的位并将分区编码为一个完整的符号并继续


也许有一种功能相当的方法可以做到这一点,但它不太冗长。

Hm。这突出了我的代码依赖于一个错误的测试,即我可以刷新多少位。我应该检查
low^(high-1)
的最高设置位,但这样做可以刷新所有位并导致
high
溢出。目前,我测试
low^high
,并且不会溢出——但是当将
high
设置为POT时,我将无法使用该测试刷新任何新位。讨厌的代码接踵而至……嗯。这突出了我在代码中依赖于一个错误的测试,即我可以刷新多少位。我应该检查
low^(high-1)
的最高设置位,但这样做可以刷新所有位并导致
high
溢出。目前,我测试
low^high
,并且不会溢出——但是当将
high
设置为POT时,我将无法使用该测试刷新任何新位。随后出现了令人讨厌的代码……您描述的属性名称是“双射”。所以你可以在文献中搜索“双射”和“范围编码”。“可能有人已经解决了这个问题。”马卡德勒,这当然有效。看起来主要关注的是EOF(因为在文件的中间有EOF创建任意数量的冗余比特流)。流行的非伪造解决方案似乎是使用延迟进位输出方案的任意精度。您描述的属性名称为“双射”。所以你可以在文献中搜索“双射”和“范围编码”。“可能有人已经解决了这个问题。”马卡德勒,这当然有效。看起来主要关注的是EOF(因为在文件的中间有EOF创建任意数量的冗余比特流)。流行的非伪造解决方案似乎是使用延迟进位输出方案的任意精度。