Range Coder编码比特流

本文简述如何实际应用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)
然后,通过观察将该比特流分成两个子比特流:指数(前缀),偏移量(后缀),分别是:
前缀:

01 001 001 01 1

后缀(解码时先解前缀,根据前缀来解码后缀,0没有后缀比特):

1 10 00 0

它们各自的概率分布:
前缀:

(6/11, 5/11) 约等于 (0.545, 0.455)

后缀:

(4/6, 2/6) 约等于 (0.667, 0.333)

可见两个子比特流的分布和整体的分布是不同的。
最后分别用两个独立的Range Coding实例将它们编码。

其次,对于同一个子比特流而言,虽然可以假定任意位置相邻的比特概率分布相近,但对于相隔较远的比特,其概率分布仍然很可能是不同的,即概率分布会随着时间/空间变化。如果Range Coding使用固定的概率分布来进行编码的话,一样无法得到很好的效果。这就要求Range Coding对待编码流(子流)的概率分布具有自适应性。一般来说,会先将子比特流看作马尔可夫随机过程,即每个比特的概率只和之前的比特的概率相关(跟之后的比特无关),基于这个假设,以及相邻比特概率分布相近的特点,我们可以根据当前比特的概率分布估计出下一个比特的概率分布。
下面给出一个自适应更新概率分布的算法例子:

  • 定义,令MPS(t)为当前概率较大的bit值,LPS(t)为当前概率较小的bit值,P(t)为LPS(t)的概率,显然有:MPS(t) = 1-LPS(t),P(t) <= 0.5
  • 首先设置初始值:P(0) = 0.5,MPS(0) = 1,LPS(0) = 0
  • 然后,如果下一个编码的bit值为MPS(t),则令新的LPS概率P(t+1) = max( P(t)-P(t)*f, 0 );否则如果下一个编码bit值为LPS(t),则令P(t+1) = min( P(t)+(1-P(t))*f, 1 )。该步骤对概率进行更新。f<1,是经验值。这个公式的大意就是如果下一个bit是MPS,则根据局部性原理,让P再小一些;否则就让P变大一些。
  • 最后,如果P(t+1)>0.5,则令LPS(t+1) = MPS(t),MPS(t+1) = LPS(t),P(t+1) = 1-P(t+1)。即当原来的LPS概率大于0.5时,说明它变成了概率较大的bit值,需要对MPS和LPS进行交换。

在编码时,随着输入新的bit,不停循环上述步骤。
在解码时,使用相同的P(t)和LPS(t)的初始值和更新公式,因此能够保证对于每个bit使用的概率和编码时使用的完全相同,以保证解码正确。
亲测过取f=1/16,对于某些比特流压缩效率接近CABAC,而且收敛速度也很快。
工程实际应用中的熵编码算法往往并不现场计算概率更新,而是进行查表,可以节省一些计算。而查找表可能也是由一些公式计算并且近似而得出的。

那么在这个算法中为什么要对MPS和LPS进行编码而不是直接对0和1进行编码呢?笔者认为主要是出于算法优化的考量。参考一些Range Coding或者Arithmatic Coding算法可知,如果把MPS的range放在空间底部,LPS的range放在顶部,则输入MPS时可以对算法进行一些优化减少计算量。如果我们直接对0和1编码,相当于上述算法中不进行MPS和LPS的交换,这样势必导致更多地输入空间顶部的符号,使得计算量相对增大。

综上所述,编码比特流时,一是需要在空间上将整体比特流划分成不同分布的子比特流单独进行Range Coding;二是在时间上让Range Coder能够进行概率的自适应。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值