【问题标题】:Range-coding with no ambiguous or illegal output没有歧义或非法输出的范围编码
【发布时间】:2023-03-16 05:55:02
【问题描述】:

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

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

例如,Wikipedia page 建议将输出范围缩小到允许移出更多位的范围,从而使原始范围的某些部分未定义。

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

将此与 Huffman 之类的内容进行对比,后者通常在没有任何模糊输入配置的情况下定义(除非在流的末尾可能存在不完整的符号)。因此可以将任意比特流解码为一条消息,然后再将其重新编码为原始比特流。

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

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

【问题讨论】:

  • 您描述的属性名称是“双射”。因此,您可以在文献中搜索“双射”和“范围编码”。有人可能已经解决了这个问题。
  • @MarkAdler,这当然有效。看起来主要关注的是EOF(因为在文件中间有EOF会创建任意数量的冗余比特流)。流行的 non-fudge 解决方案似乎是使用延迟进位输出方案的任意精度。

标签: encoding compression entropy range-encoding


【解决方案1】:

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

当您发现输出的范围对于下一个符号来说太小了,这意味着该范围跨越了一个值,该值是 2 的大幂,这就是低和高边界最终在最高有效位上有所不同。

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

也许有一种功能等效的方法可以做到这一点,但不那么冗长。

【讨论】:

  • 嗯。这突出了我在代码中对我可以刷新多少位的错误测试的依赖。我应该检查low ^ (high - 1) 的最高设置位,但这样做可以刷新 all 位并导致high 溢出。目前我测试low ^ high 并且不会溢出 - 但是当将high 设置为 POT 时,我将无法使用该测试刷新任何新位。令人讨厌的代码随之而来......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2012-11-13
  • 1970-01-01
  • 2018-03-22
  • 2020-03-29
  • 2020-03-27
相关资源
最近更新 更多