算术编码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
low : 01011010 high : 10010111
low : 00110100 high : 10101111
neglectedSecondHigh++
正规化
此外,如果当前有未输出的次高位,又遇到了上 述三种情况,那么需要区别对待。 如果是情况 1 ,那么可以确定被忽略的次高位趋 向0,此时可以输出0,并按忽略次数 n输出 n个1,然 后扩展区间。 如果是情况 2 ,可以确定被忽略的次高位趋向 1 此时可以输出 1,并按忽略次数输出 n个0,然后扩展 区间。
low : 10101101 high : 11001011 low : 01011010 high : 10010111
正规化举例
区间的上下限除了会出现上面两种情况外,还会 出现其他情况,如果区间上下限的最高位不同,而次 高位只相差1。极端情况如下所示:
low : 00000001 high : 11111111
(1)计算当前区间大小:
range = high - low
(2)计算新的子区间:
high = low + range ? cumFreq( x 1) low = low + range cumFreq( x)
(3)输出编码结果。
解码
算术编码进行解码时仅输入一个小数。解 码前首先需要对初始区间[0,1),按照初始时的 符号概率进行划分;观察输入的小数位于哪个 子区间,输出对应符号, 选择对应的子区间; 然后继续对选择的子区间进行划分,重复这个 过程,直到所有符号都解码完毕。整个解码过 程相当于编码过程的逆运算。
解码过程
需要说明的是,计算机是根据输入的数值、 当前区间的下限和累计频率之和,计算出一个 估计出来的累计概率从而确定当前解码符号的。 累计概率通过下面的公式计算:
range = high - low (value - low) total estFreq = range
改进
前面讲的是最基本的算术编码,通过它只 是让大家明白算术编码的基本思想。实际上, 前面描述的编解码过程,在计算机上是很难实 现的。因为区间可以无限制地划分下去,而且 总能找到落在这一区间的一个小数,但是计算 机做不到;所以在实现的时候,需要做一些改 进,使得它可以在计算机上实现。
1、计算区间时,区间上限减1的原因。
2、更新区间时,区间上下限高位相同时,移位操作 略有不同的原因。 3、涉及到的数据定义为无符号类型的必要性。
分析
4、次高位是如何被忽略的。 5、怎样从最后的编码区间中取出任意一个数作为编 码结果。
谢谢!
编码举例
假设编码符号由A、B、C 三种符号组成, 输入符号是“BCCB”,编码过程如下。
编码举例
• 首先,初wenku.baidu.com区间是[0,1);
• ABC三个符号的初始概率都是1/3,按照这个概率将 当前区间[0,1)划分为三个子区间;
• 第一个输入的符号是 B,所以选择与 B 对应的子区 间[0.3333,0.6667),并且作为编码C时的当前区间;
解码举例
• 在上面的例子中,编码得到的小数是0.6400,因此 解码输入的小数就是0.6400。
• 首先,初始区间是[0,1);
• 初始符号概率都是1/3,按照这个概率划分区间;
• 小数0.6400位于区间[0.3333,0.6667),与之对应的符 号是B,即第一个解码符号,选择[0.3333,0.6667) 作 为下一次解码的当前区间; • 更新符号概率,划分区间、选择子区间,直至最后 一个符号 B 解码出来。
• 更新符号概率,继续划分区间、选择子区间,直到 最后输入符号B编码完毕; • 最终得到的子区间是[0.6390,0.6501),从中选择任意 一个小数,如0.6400,作为编码结果。
编码过程
已知编码符号序列及其各符号概率,输入符号序 列(它是编码符号序列的一个子集)和初始区间[low, high) = [0,1)。
正规化举例
因此可以将最高位移出区间并输出。可以通过 将区间的下限左移1位,将区间的上限左移1位并加1 实现。这样在输出一个二进制位的同时,对区间进 行了扩展,具体操作过程如下所示:
low : 00101101 high : 01001011 low : 01011010 high : 10010111
仍以前面的例子为例,使用区间[3333,6667) 表示区间[0.3333,0.6667),输出6400表示0.6400。 整数运算的区间变化如下:
整数运算举例
解码的时候也进行整数运算。解码过程 如下表所示:
正规化
上面的整数运算实际上也是无法实现的。由 前面整数运算编码区间的变化可以看出,随着编 码的进行区间范围会越来越小,最后区间范围会 趋向于 0;如果输入符号序列很长,那么区间范 围为 0 时就无法继续编码。因此需要使用正规化 操作来解决这一问题。 正规化就是当区间上下限满足一定条件时, 将一定位数从区间中移出,同时对区间进行放大。 其作用是在有限区间上模拟无限运算。
编码
• 算术编码将整个要编码的数据映射到一个位于 区间[0,1)中的一个小数。 • 算术编码在编码时,从初始区间[0,1)开始;按 照编码符号的概率将当前区间划分成多个子区 间;根据当前输入符号选择对应的子区间,并 将该子区间作为下次编码的当前区间;重复这 一过程,直到所有符号都编码完毕,最后从最 终的子区间中选择任意小数作为编码结果。
此时区间范围只有1,已经不能再进行编码。因此 为了避免这种情况的出现,当区间上下限的最高位不 同时,还需要检查它们的次高位。
正规化举例
如果上限的次高位为0而下限的次高位为1,那么 需要暂时忽略次高位,同时对区间进行一次扩展(采 用与请两种情况相同的扩展方法);另外,这个次高 位只是暂时被忽略,而不是被抛弃,因此需要记录一 下忽略了一个次高位。对应的操作如下所示: 情况3:
算术编码
提纲
• • • • • • 背景 编码 解码 改进 实现 分析
背景
早在1948年香农提出信息论的时候,就提 出了算术编码的思想。但是经过多年研究,许 多学者认为算术编码是无法实现的,因为算术 编码要求进行无限精度的实数运算,而计算机 只能进行有限精度的运算。随着研究的深入, 终于在1987年Ian H. Witten、Radford M. Neal 和John G. Cleary发表了一篇论文,提出了一种 基于二进制整数运算的算术编码实现算法。
正规化举例
因为实现算法的时候用的是二进制整数,所以下 面也以二进制整数为例进行说明。编码过程中区间变 化的可能情况: 情况1:
low : 00101101 high : 01001011
情况2:
low : 10101101 high : 11001011
在这两种情况中,区间上下限的最高位都是相同 的。在划分区间的时候,当区间上下限的最高位相同 时,在后续的计算中最高位将不会再发生变化。
如果是情况 3 ,仍然无法确定次高位的趋向,继 续忽略次高位,并扩展区间。
正规化
如果把整个区间分为四段,那么上面三种情况 对应的区间位置如下图所示:
正规化
除了上面三种情况,编码过程中区间的变化还有 另外三种情况:
正规化
只是这三种情况不进行正规化操作,仍然 可以继续编码;因此对于这三种情况,可以直 接从当前区间开始,进入下一轮编码。 另外,由于在编码阶段进行了正规化操作, 解码的时候同样需要正规化操作,而且要与编 码的时候的操作相一致。
整数运算
在前面描述的编解码过程中,区间的上下 限都是小于1的小数。如果省略0和小数点,仅 使用小数的尾数表示小数,那么实际上原来的 区间上下限就变成了一个无限大的整数。更进 一步地,如果仅使用无限整数的部分高位表示 这个无限整数,并在用这些进行整数运算,那 么就可以用整数来模拟原来的实数运算。
整数运算举例
实现
如果考虑正规化操作,那么算术编码的编码过程 可以粗略地概括为:
1、初始化编码参数 2、对每一个符号进行如下操作 (1)计算当前区间;
(2)更新区间;
3、编码结束。 解码过程与之对应,只是解码的时候不存在额外考 虑解码怎么结束的问题。
分析
编码正确性的判定: 1、是否能无损还原信源; 2、压缩比是否不小于信源的熵。 实现过程中遇到的几个问题:
相关文档
最新文档