“整数算术编码以区间和延迟bit按前向顺序处理消息;本页用单一状态、编码前提取及逆序栈,两者的归一化证明与尾部协议不同。前向自适应模型不能直接随着逆序源串更新:若需要前向历史模型,应先保存对应…”
形式陈述
压缩模型的工作是:给定双方已经恢复的字节前缀,返回下一符号的有序正频数表。编码器的工作是:按这张表把符号变成bit。本页以整数算术编码为使用者,模型接口只有三件事:给出累计区间和总量、从区间找到符号、看到已处理符号后更新状态。
一个固定字母表的自适应零阶模型可如下规定。正文符号及EOF初始计数全为1,符号顺序永不改变。编码或解码正文符号
- 使用更新前的表完成当前符号的编码或解码
- 令
- 若新总量
,把每项换为
EOF使用当前表,但不触发更新。要求字母表大小
且每项仍至少为1。这既避免零概率,又满足整数编码器的总频数上界。
协议必须连同字母表、顺序、初始计数、阈值、取整方向、EOF更新规则一起定义。只说“两边都自适应”还不能决定同一个码流。
直觉
模型像共同记账。编码端已经看见下一字节,但译码端还没看见;所以不能先用这个未知字节修改概率,再让接收者猜该用哪张表。正确顺序是两边先用已知历史完成同一步,然后一起记入刚恢复的符号。
频数缩放既限制整数大小,也使较早的观察逐渐失去重量。向上取整让低频符号仍有一个位置;若直接向下取整,EOF或尚未出现的字母可能变为零,后续第一次出现就无法表达。
这是一种简单预测器,不知道A后面是否更容易出现B。若想用前一个字节作为上下文,可以为每个上下文维护一张表,但需要另外规定初始状态、未见上下文、内存上限和切换规则;bit编码算法不必因此更换。
例子与边界
取字母表A、B、EOF,初始 ABABA 前各步使用的表为:
- 第1个A前:
;处理后 - 第2个B前:
;处理后 - 第3个A前:
;处理后 - 第4个B前:
;加一成 ,总量7,缩为 - 第5个A前:
;处理后 - EOF用
,不更新
按前页的同一个整数coder,得到11位 00101111101,然后再加guard及填充。固定经验表
一个一开始就能看见的失步反例:初始三项均为1,编码器错误地先把A加到2,便把首个A分到
空正文直接用初始表编码EOF。字母表若含256种字节及EOF,
推论与应用
同步不变量
归纳假设处理前两边的表与前缀相同。整数coder据相同表恢复同一个符号,随后确定性的更新和缩放给出相同新表。因此从相同初态开始,两边每一步都同步。证明真正需要的是更新是共同历史的确定函数;没有要求预测等于真实分布。
固定表需要在文件头传频数,或者另行规定双方预先拥有同一模型。自适应表省去最终计数,但不能免费省去字母表和更新规则;新符号问题若使用escape,还必须给escape概率与原始字节的编码方式。本页采用固定字母表,不暗中加入escape机制。教学ARC1文件只封装静态表;自适应实验通过检查器函数显式传入初态和阈值,不伪装成ARC1的另一种隐含解码模式。
简单数组每次构造累计表和寻找符号花
若把coder换为逆序编码的rANS,不能把本页的更新直接沿逆序正文执行:那会得到不同的历史表。前向模型需要先记录各位置的预测状态或足以重建它们的信息,逆序编码时使用对应表,译码再按前向历史同步;缓存与重建另计。本页的静态ARC1和前向自适应算术实验仍维持原接口。
参考资料
- I. H. Witten、R. M. Neal、J. G. Cleary,Arithmetic Coding for Data Compression,1987,pp.520–521的模型/coder分离与Figure4的自适应模型。本页保留稳定符号顺序并使用明确的教学缩放规则,未照搬原文的频数排序模型
- Aarti Singh,CMU 10-704 Lecture 9,§9.1、§9.3:共同预测器及预测损失和编码长度的联系