算术编码

来源:互联网 发布:优化最好的安卓系统 编辑:程序博客网 时间:2024/04/29 04:36

1.算术编码

算术编码把一个信源集合表示为实数线上的 0 到 1 之间的一个区间。这个集合中的每个元素都要用来缩短这个区间。信源集合的元素越多,所得到的区间就越小,当区间变小时,就需要更多的数位来表示这个区间,这就是区间作为代码的原理。算术编码首先假设一个信源的概率模型,然后用这些概率来缩小表示信源集的区间。

 

2.举例说明算术编码过程

[ 例 ]设英文元音字母采用固定模式符号概率分配如下:

字符

a

e

i

o

u

概率

0.2

0.3

0.1

0.2

0.2

范围

[0,0.2]

[0.2,0.5]

[0.5,0.6]

[0.6,0.8]

[0.8,1.0]

设编码的数据串为 eai 。令 high 为编码间隔的高端 ,low 为编码间隔的低端 , range 为编码间隔的长度 ,rangelow 为编码字符分配的间隔低端 ,rangehigh 为编码字符分配的间隔高端。
初始 high=1,low=0,range=high-low, 一个字符编码后新的 low 和 high 按下式计算 :
·low =low+range × rangelow
·high =low+range×rangehigh

(1) 在第一个字符 e 被编码时 ,e 的 rangelow=0.2,rangehigh=0.5, 因此 :
low=0 + 1 × 0.2 = 0.2
high=0 + 1 × 0.5 = 0.5
range=high-low=0.5-0.2=0.3
此时分配给 e 的范围为 [0.2,0.5] 。

(2)第二个字符 a 编码时使用新生成范围 [0.2,0.5],a 的 rangelow=0, rangehigh=0.2, 因此:
low=0.2 十 0.3 × 0=0.2
high=0.2 +0.3 × 0.2=0.26
range=0.06
范围变成 [0.2,0.26] 。

(3) 对下一个字符 i 编号,i 的 rangelow=0.5,rangehigh=0.6, 则:
low=0.2 + 0.06 × 0.5=0.23
high=0.2 + 0.06 × 0.6=0.236
即用 [0.23,0.236] 表示数据串 eai, 如果解码器知道最后范围是
[0.23,0.236 ]这一范 围 , 它马上可解得一个字符为 e, 然后依次得到惟一解 a, 即最终得到 eai 。

3.算术编码的特点

不必预先定义概率模型 , 自适应模式具有独特的优点;
信源符号概率接近时 , 建议使用算术编码 , 这种情况下其效率高于 Huffman 编码;
算术编码绕过了用一个特定的代码替代一个输入符号的想法 , 用一个浮点输出数值代替一个流的输入符号 , 较长的复杂的消息输出的数值中就需要更多的位数。
算术编码实现方法复杂一些 , 但 JPEG 成员对多幅图像的测试结果表明 , 算术编码比Huffman 编码提高了 5% 左右的效率 , 因此在 JPEG 扩展系统中用算术编码取代 Huffman 编码。

原创粉丝点击