CABAC编码

记录自己的学习过程,防止遗忘,如有错误,多多包涵

目录

一、二进制化

二、上下文建模

1.概念

2.CABAC中的上下文模型

 三、二进制算术编码

 参考文献


CABAC编码_第1张图片

主要分为三步:1.二进制化;2.上下文建模;3二进制算术编码。 

 

一、二进制化

CABAC首先会将语法元素映射为二进制序列。如指数哥伦布编码。

二、上下文建模

1.概念

即利用已编码块,已编码语法元素的概率情况来估计当前待编码元素的分布概率。

CABAC编码_第2张图片

 

如上图所示,E为当前代编码块,ABCD为其空间相邻块。此时ABCD中已编码的语法元素可作为E编码块的上下文。参考的上下文越多,上下文“阶数”越高。

2.CABAC中的上下文模型

为了控制复杂度,CABAC是以二进制比特为单位进行上下文建模,其关键是概率预测,即确定低概率符号LPS(0/1)出现的概率P_{LPS},而P_{LPS}会随着编码是LPS还是MPS自适应的发生变化。 

为了降低复杂度,引入概率状态索引σ,取值范围为[0,63],分别对应=[0.01875,0.5],其表示低概率符号LPS的概率值对应的索引,即只有64个可能概率。且其变化过程通过查表得到。

 CABAC编码_第3张图片

 举例:假设当前σ=61,MPS=1,若当前待编码比特为0,则编码后σ=38;若当前代编码比特为1,则编码后σ=62

 三、二进制算术编码

在上下文编码中,我们提到其表示状态是σ和MPS,而在编码器的状态,是由当前编码区间宽度Range和区间起始点Low表示,那么在编码下一个二进制符号的时候,当前的R就会划分为两个部分,R_{LPS}R_{MPS},其计算公式如下:

R_{LPS}=R.

 R_{MPS}=R-R_{LPS}

当编码的二进制符号为LPS时,R就会更新为R_{LPS},L更新为L+R_{LPS}(这是因为区间先是MPS后是LPS);当编码的二进制符号为MPS,R更新为R-R_{LPS},L不变。

在HEVC中我们规定,L用10比特表示,R的范围为[2^8,2^9),写成二进制即100000000-111111111,为了降低复杂度,便于硬件实现,在对当前区间进行划分的时候,首先要进行量化,即将R>>6,可以发现,右移6位区间变成100-111,只有2,3比特位不一样,那么就只有四种情况00,01,10,11,对应我们将这四个数定义为量化区间索引ρ,计算公式为

ρ=(R>>6)&3

那么对R进行划分的乘法运算就可转化为查表计算,这样ρσ对应64*4的二维表格,只要知道当前ρσ,就可读出当前R_{LPS},即

R_{LPS}=rLPSTable[σ,ρ]

CABAC编码_第4张图片

其整体流程为

CABAC编码_第5张图片

经过区间更新后得到的新的编码区间可能不在R的范围内,因此需要进行重归一化,流程如下:

CABAC编码_第6张图片


 参考文献

[1]王一涛.H.265/HEVC CABAC熵编码的研究与硬件实现.2019.福州大学

[2]王尧.HEVC二进制算术编码器的实现与CABAC算法改进.2019.中国科学院大学(中国科学院上海技术物理研究所)

[3]齐静瑞.H.264/AVC中CABAC熵编码电路的设计.2015.东南大学

你可能感兴趣的:(视频编解码)