指数哥伦布编码

指数哥伦布编码是变长编码的一种,类似于哈夫曼编码,与哈夫曼编码不同之处在于其在解码是不需要保存一个码表,可以直接根据码字进行解码。

编码

指数哥伦布编码由前缀和后缀两部分构成,前缀和后缀都依赖于指数哥伦布编码的阶数k。对于非负整数N其k阶指数哥伦布编码由以下步骤生成。

  1. 将非负整数N转成二进制形式,去掉最低的k比特,然后加1。

  2. 计算剩下的比特数,将此数减1,即是需要增加的前缀0个数。

  3. 将步骤1中去掉的最低k比特补回比特串尾部。

例:计算4的1阶指数哥伦布编码

  1. 4的二进制形式为100,去掉最低1比特变为10,加1后为11。

  2. 11的比特数为2,因此前缀0的个数为1。

  3. 在比特串尾部补上步骤1中去掉的0,最终码字为0110。

解码

解析k阶指数哥伦布编码过程如下:

  1. 从比特流当前位置开始寻找第一个非零比特,并将找到的0比特个数记为m。

  2. 第一个非零比特之后的m+k比特的十进制值为value。

  3. 按下式计算解码值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

发布了92 篇原创文章 · 获赞 109 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/Dillon2015/article/details/104093454