熵编码 之 2. Arithmetic coding

来源:互联网 发布:淘宝怎么弄淘口令 编辑:程序博客网 时间:2024/04/30 08:33

算术编码是将被编码的信源表示成实数0~1之间的一个间隔。信源符号序列越长,通过编码表示它的间隔就越短,需要的二进制比特数就越多。

举例说明,例如符号a1,a2,a3出现的概率分别为0.4, 0.5, 0.1。则将[0,1)区间分配给三个符号,分别为:

a1: [0, 0.4)

a2: [0.4, 0.9)

a3: [0.9, 1)

在编码之前,完整的信息间隔是[0, 1),然后根据输入的符号,依次将这个区间按照相应的比例变窄。例如,对”a2a2a2a3”进行编码:

low high

开始编码前: 0 1

a2 0.4 0.9

a2 0.6 0.85

a2 0.7 0.825

a3 0.8125 0.825

新的lowhigh的计算方法如下:

NewHigh = OldLow + Range * HighRange(X);

NewLow = OldLow + Range * LowRange(X);

其中Range是指OldHigh-OldLowHighRange(X)表示取得符号X的被分配到区间的上限,例如a2被分配的区间为[0.4, 0.9),其HighRange(a2)=0.9

通过上面的计算可得到,”a2a2a2a3”所处的区间是[0.8125, 0.825),在该区间中的任意一个数都可以用来表示该字符串。

解码过程如下,以”a2a2a2a3”编码为code = 0.82为例:

0.82所处的区间为[0.4, 0.9),与a2的区间相符,则该字符串的第一个字符为a2

然后计算新的code: NewCode = (OldCode - LowRange(x))/Range

code = (0.82-0.4)/0.5 = 0.84

0.84所处的区间仍是[0.4, 0.9),故第二个字符是a2

code = (0.84 - 0.4)/0.5 = 0.88

0.88所处的区间仍是[0.4, 0.9),故第三个字符是a2

code = (0.88 - 0.4)/0.5 = 0.96

0.96所处区间为[0.9, 1),故第四个字符为a3

即字符序列为”a2a2a2a3”

0 0