指数哥伦布编码是变长编码的一种,类似于哈夫曼编码,与哈夫曼编码不同之处在于其在解码是不需要保存一个码表,可以直接根据码字进行解码。
编码
指数哥伦布编码由前缀和后缀两部分构成,前缀和后缀都依赖于指数哥伦布编码的阶数k。对于非负整数N其k阶指数哥伦布编码由以下步骤生成。
-
将非负整数N转成二进制形式,去掉最低的k比特,然后加1。
-
计算剩下的比特数,将此数减1,即是需要增加的前缀0个数。
-
将步骤1中去掉的最低k比特补回比特串尾部。
例:计算4的1阶指数哥伦布编码
-
4的二进制形式为100,去掉最低1比特变为10,加1后为11。
-
11的比特数为2,因此前缀0的个数为1。
-
在比特串尾部补上步骤1中去掉的0,最终码字为0110。
解码
解析k阶指数哥伦布编码过程如下:
-
从比特流当前位置开始寻找第一个非零比特,并将找到的0比特个数记为m。
-
第一个非零比特之后的m+k比特的十进制值为value。
-
按下式计算解码值CodeNum。
由以上过程可见,指数哥伦布编码基于这些规则,解码器很快可以判断一个码字长度,并通过简单的计算来解码。
指数哥伦布编码属于变长编码,基本原理是用短码表示频率较高的码字,长码表示频率较低的码字。
0阶指数哥伦布编码是指数哥伦布编码家族中常用的一种,它可以直接根据公式解析码字,解码复杂度低。
零阶指数哥伦布编码
零阶指数哥伦布编码由前缀和后缀拼接成,前缀长度L_pfx和后缀长度L_sfx满足L_pfx-1=L_sfx。
前缀具有一元码形式00....01,其中0的个数M为
后缀部分为INFO十进制值的二进制表示形式:
其中CodeNum为编码数值索引,对于无符号数V,CodeNum=V。
对于有符号数,
零阶指数哥伦布编码解码,先读取第一个1前0的个数M,接着读取第一个1后的M比特INFO,根据下式计算CodeNum。
然后根据是有符号还是无符号数计算V。
还是以vlaue=4为例解释零阶指数哥伦布编码和解码过程:
编码:
M=log(4+1)=2,所以前缀为001。前缀长度为3,后缀长度为2。
INFO=4+1-2^M=1,二进制形式为1,后缀为01。
最终编码结果为00101。和上一节结果相同。
解码:
第一个1前0的个数M=2。第一个1后M比特,INFO=01=1。
CodeNum=2^M+1-1=4。
若vlaue为无符号数,V=CodeNum=4。
若vlaue为有符号数,V=-2。
零阶指数哥伦布编码主要用在VPS、SPS、PPS的语法元素编码中。
感兴趣的请关注微信公众号Video Coding