本文简述如何实际应用Range Coder编码比特流
上文中介绍过,Range Coder编码需要预先设定编码符号各自的概率,即全体符号的概率分布。二进制比特流由符号0和符号1构成,作为整体而言,自然是有一个固定的概率分布,以该分布对其进行编码是完全可行的。但是,这种方法编码很难达到理想的压缩效果,原因和解决方法如下:
首先,在实际应用中,待编码比特流往往有着复杂的内部逻辑结构,往往由若干概率分布不同的子比特流嵌合而成————即在同一个子比特流内部,相邻的比特倾向于呈现相同的概率分布,而不同的子比特流的概率分布则可能完全不同。上文提到过,编码时使用的概率分布和实际概率分布越相近,压缩效率就越高;反之就越低。使用整体概率分布对二进制流进行编码时,整体概率可能跟各个同分布子比特流的概率分布都有出入,因此压缩性能可能不尽理想。因此优化的第一步是分析出每个嵌合在待编码比特流中的子流,编码时对每个子流进行独立的Range Coding。
举一个例子:
需要编码如下整数:
2 5 3 1 0
可以将它们写成指数哥伦布编码的形式,即
2: 011
5: 00110
3: 00100
1: 010
0: 1
一共17比特,其中0占10个,概率分布为(10/17, 7/17) 约等于 (0.588, 0.412)
然后,通过观察将该比特流分成两个子比特流:指数(前缀),偏移量(后缀),分别是&#