原理
基本原理是将被编码的数据序列表示成0到1之间的一个间隔(也就是一个小数范围),该间隔的位置与输入数据的概率分布有关,信息越长,编码表示的间隔就越小,因而表示这一间隔所需要的二进制位数就越多。
算术编码的步骤
算术编码是从整个符号序列出发,采用递推式连续编码的方法,解码时,根据该区间判断信源哥哥符号出现的顺序和类型。
下面以一个多符号的算术编码为例来分析算术编码的步骤。
概率表
符号 | 概率 | 概率区间 |
A | 0.1 | 0,0.1 |
B | 0.3 | 0.1,0.4 |
C | 0.2 | 0.4,0.6 |
D | 0.15 | 0.6,0.75 |
E | 0.25 | 0.75,1 |
假设要编码ABBCD
编码过程
读入A,区间为[0,0.1]
读入B,区间为S = (L' - S') * R1 + S'; L = (L' - S') * R2 + S' = [S, L] = [(0.1 - 0) * 0.1 + 0, (0.1 - 0) * 0.4 + 0] = [0.01, 0.04]
读入B,区间为[(0.04 - 0.01) * 0.1 + 0.01, (0.04 - 0.01) * 0.4 + 0.01] = [0.013, 0.022]
读入C,区间为[(0.022 - 0.013) * 0.4 + 0.013, (0.022 - 0.013) * 0.6 + 0.013] = [0.0166, 0.0184]
读入D,区间为[(0.0184 - 0.0166) * 0.6 + 0.0166, (0.0184 - 0.0166) * 0.75 + 0.0166] = [0.01768, 0.01795]
最终取一个数字:0.01769
解码过程
0.01769 在范围[0, 0.1] 因此第一个符号式A
0.01769在[0,0.1]什么范围区间?先放大 0.1769, [0, 1] 明显是[0.1, 0.4]区间,因此第二个符号是B
按照编码的时候调整区间,区间为S = (L' - S') * R1 + S'; L = (L' - S') * R2 + S' = [S, L] = [(0.1 - 0) * 0.1 + 0, (0.1 - 0) * 0.4 + 0] = [0.01, 0.04]
0.01769在[0.01, 0.04]什么范围区间?放大。0.1769,[0.1, 0.4] 也是在[0.1, 0.4]区间。因为A的区间是[0.1, 0.11] B的区间是 [0.11, 0.22] 因此第三个符号也是B
按照编码的时候调整区间,[(0.04 - 0.01) * 0.01 + 0.01, (0.04 - 0.01) * 0.4 + 0.01] = [0.013, 0.022]
0.01769在区间 [0.013, 0.022]什么范围?放大,0.1769, [0.13, 0.22] = 0.1769 ~ 0.013 + 0.09 * 0.5 0.5落在区间范围C上面,因此这个字符是C
按照编码的时候调整区间,[(0.022 - 0.013) * 0..4 + 0.013, (0.022 - 0.013) * 0.6 + 0.013] = [0.0166, 0.0184]
0.01769在区间[0.0166, 0.0184] 什么范围呢?答案是[0.6, 0.75] 因此解码符号是D