H.264 熵编码分析
Bykdjwang
2008‐08‐09 第一版
2008‐10‐10 第二版
利用信源的随机过程统计特性进行码率压缩的编码方式称为熵编码。它是把所有的语法
(句法)元素(包括控制流数据,变换量化残差系数和运动矢量数据)以一定的编码形式映
射成二进制比特流。熵编码是无损压缩编码方法,它生成的码流可以经解码无失真地恢复出
数据。在信息论中表示一个数据符号的理论上最佳的比特数通常是一个分数而不是整数,这
个比特数用 log2(1/P)表示,其中 P 是每个数据符号的出现概率。这里 log2(1/P)指的就是熵的
概念。熵的大小与信源的概率模型有着密切的关系,各个符号出现的概率不同,信源的熵也
不同。当信源中各事件是等概率分布时,熵具有极大值。信源的熵与其可能达到的最大值之
间的差值反映了该信源所含有的冗余度。信源的冗余度越小,即每个符号所独立携带的信息
量越大,那么传送相同的信息量所需要的序列长度就越短,符号位也越少。因此,数据压缩
的一个基本的途径是去除信源的符号之间的相关性,尽可能地使序列成为无记忆的,即前一
符号的出现不影响以后任何一个符号出现的概率。
熵编码可以是定长编码,变长编码或算术编码。定长编码把固定长度的码字解释为有符
号或者无符号的整数。变长编码对出现频率高的符号用短码字表示,对出现频率低的符号用
长码字表示。算术编码是一种递推形式的连续编码,其思想是用 0 到 1 的区间上的一个数来
表示一个字符输入流,它的本质是为整个输入流分配一个码字,而不是给输入流中的每个字
符分别指定码字。算术编码是用区间递进的方法来为输入流寻找这个码字的,它从于第一个
符号确定的初始区间(0 到 1)开始,逐个字符地读入输入流,在每一个新的字符出现后递
归地划分当前区间,划分的根据是各个字符的概率,将当前区间按照各个字符的概率划分成
若干子区间,将当前字符对应的子 2 区间取出,作为处理下一个字符时的当前区间。到处理
完最后一个字符后,得到了最终区间,在最终区间中任意挑选一个数作为输出。算术编码是
一种高效的熵编码方案,其每个符号所对应的码长被认为是分数。由于对每一个符号的编码
都与以前编码的结果有关,所以它考虑的是信源符号序列整体的概率特性,而不是单个符号
的概率特性,因而它能够更大程度地逼近信源的极限熵,降低码率。
在 H.264 标准中通过描述子(Descriptor)的形式来说明语法元素的解码算法。描述子在括
号中带有一个参数,这个参数表示需要提取的比特数。除了定长编码以外,还有 3 种熵编码
方案:一个是指数哥伦布编码(ExponentialGolombCodes);一个是从可变长编码发展而来的
上下文自适应可变长编码(CAVLC);另一个是从算术编码发展而来的基于上下文的自适应二
进制算术编码(CABAC)。前两种属于变长编码,而第三种属于算术编码。研究表明 CABAC 的
压缩效率比 CAVLC 提高了 9%~14%。
Exp‐GolombCodes
Exp‐Golomb 的描述子有无符号指数哥伦布编码 ue(v),有符号指数哥伦布编码 se(v),截
断指数哥伦布编码 te(v)和映射指数哥伦布编码 me(v)。
0 阶指数哥伦布编码是一种有规则结构的变长编码,它的结构可以表示为
[Mzeros][1][INFO]
其中Mzeros称为前缀,由M个零组成,而M位INFO称为信息后缀。码字总长为
2M+1。
M和INFO的值由要编码的值索引code_num得到。(可参考标准表 9‐1)
①
2
log ( _ 1)M code num=+
⎢⎥
⎣⎦
_
12
M
INFO code num=+−
①
如无特别说明,本文档中提到的标准均指“ITU‐TRecommendationH.264‐‐Advancedvideocodingfor
genericaudiovisualservices”2005 年 3 月版本。
BykdjwangE‐mail:kdjwang@gmail.com
评论1