CABAC 学习(4)概率更新模型分析

来源:互联网 发布:mac 修改u盘图标 编辑:程序博客网 时间:2024/06/08 17:20


不知道很多人是不是和我一样有疑惑,那个probability estimation 是干什么用的?

就是在CABAC 的第三步, 算术编码完一个bin, 都要update context model. 

在TEncBinCoderCABAC.cpp中的 encodeBin()函数中调用:

    rcCtxModel.updateLPS();
<pre name="code" class="cpp">    rcCtxModel.updateMPS();


这个函数来update context ,其实就是更新概率模型。

算术编码克服了哈夫曼只能为整数的缺点,根据概率更新来更准确估计信源信号出现概率,概率估计越精确,编码效果越好。

这里的概率更新模型是单参数指数平滑法模型, 并以CABAC 定义的64个转换状态为index。这只是概率与index的函数的趋势关系, 参考H.264/AVC中那个经典的概率模型图。

但是在CABAC中, 概率更新FSM却是根据当前状态的概率来计算出新的概率。

每个概率在CABAC中其实是隐含着对应的状态的,比如如果得出概率0.04, 那么对应该的pStateIdx 就是48. 这与当前是LPS 还是MPS无关,就是一个概率对应一个确定的pstaeIdx. 

只不过,标准中简化了对概率这种FP类型的数据的应用,直接实施为状态转移FSM,如果编码完一个bin之后, 当前的state是知道的,根据当前的stateIdx, 以及现在编码的binValue 是否等于对应context中的valMPS 的值(这个是会一直保持不变,除非stateIdx = 0, 只是后要变换为反码,0变1 , 1变0.), 即确定是LPS还是MPS的过程,确定了这个,在知道了现在的state,然后参考状态转移FSM表,就可以确定新的state,也就是新的概率模型,也就是新的context 模型,存储到context中的,下次再调用这个context 模型的时候,就会引用的是新的概率模型,也就是stateIdx 已经变成了新的。

这个过程的实现思想,就是信息论里的数据压缩的一个重要思想,体现adaptive的一个地方,使得编码更准确


然后应用到概率的range division, 也是用了一个4×64的array Table 9-40(最终标准书里)来实现, 避免了理论上的乘法,也就是有人说的免乘法原则。简化复杂度,表格中的数值也都是训练得到的结果。





0 0