音视频从入门到精通——指数哥伦布码原理

指数哥伦布编码(理论篇)

指数哥伦布码(Exponential-Golomb coding)是一种无损数据压缩方法。Exp-Golomb编码是一种可变长前缀码, 其硬件实现简单, 无需事先建立和存储码表, 不但可以通过硬件计算快速产生码字, 而且可以根据信源PDF函数灵活调整级数k, 因而, 可以达到很高的编码效率。

前言
在计算机中,一般数字的编码都为二进制,但是由于以相等长度来记录不同数字,因此会出现很多的冗余信息,如下:

十进制5425521
二进制0000010100000100111111110000001000000001
有效字节33821

如数字1,原本只需要1个bit就能表示的数据,如今需要8个bit来表示,那么其余7个bit就可以看做是冗余数据,在网络传输时,如果以原本等长的编码方式来传输数据,则会出现很大的冗余量,加重网络负担但是如果只用有效字节来传输上述码流,则会是:10110011111111101,这样根本不能分离出原本的数据。哥伦布编码则是作为一种压缩编码算法,能很有效地对原本的数据进行压缩,并且能很容易地把编码后的码流分离成码字。

在H264中使用
在H264中使用的是0阶指数哥伦布编码,在H.264中使
用ue(v)表示0阶无符号指数哥伦布编码的解码过程,
用se(v)表示0阶有符号指数哥伦布编码过程。

指数哥伦布编码和哈夫曼编码的区别:

  • 信源相关性:哈夫曼编码依赖于信源的概率分布;指数哥伦布编码与信源无关;因此对于不同的信源,即使是相同的符号的哈夫曼编码的结果也是不同的;指数哥伦布编码针对不同的信源采用的编码是统一的,因此无论是什么样的输入,输出的编码后的数据都是一致的。
  • 额外信息: 哈夫曼编码的数据必须额外携带与该信源匹配的码表;指数哥伦布编码无需携带任何额外信息
  • 由于未考虑信源的实际特性,指数哥伦布编码的压缩比率通常比较低,对于有些信息甚至完全没有压缩效果,输出数据比原始数据更大,在这一点上哈夫曼编码作为“最优编码”在效率上更高;然而由于哈夫曼编码运算较指数哥伦布编码更为复杂,且必须保存码表信息增加了传输负荷,也对压缩比率造成了不利影响
      实际上,对于视频压缩这样的需求而言,类似于哈夫曼编码所提供的压缩比率的优势远远不够,而且像H.264等编码标准都不会指望靠这样的方式来提高压缩比率。因此在实际的视频编码方法中使用的是指数哥伦布编码,但是只作为少数的辅助语法元素的编码以及多数语法元素的二值化方法。真正贡献了高压缩比还需要后面详述的CAVLC和CABAC等。

1、无符号指数哥伦布编码

用来表示无符号整数k阶指数哥伦布编码的生成步骤如下:

(1)将数字以二进制形式写出,去掉最低位的k个比特位,之后加1 
(2)计算留下的比特数位数,将此数减1,即是需要增加的前导0的个数
(3)将第一步中去掉的最低个比特位补回到比特串尾部

1.1、0阶无符号指数哥伦布编码过程

0阶无符号指数哥伦布编码最后生成的比特串格式为"前缀1后缀",前缀和后缀的长度是相同的。

假如我们待编码的数字codeNum = 4,0阶无符号指数哥伦布编码的步骤如下:

(1)将数字以二进制写出,4的二进制为100,因为0阶指数哥伦布编码所有不用去掉低位
(2)将上面的二进制+1,100加1为101,留下的比特数为3,3-1=2,所有需要增加前导0的个数为2
(3)因为第一步没有去掉,所有这一步不进行任何操作,最终生成的比特串为00101

0阶指数哥伦布编码可以简化为如下步骤

(1)将codeNum+1,4+1=5
(2)将加1后的数字用二进制表示,5的二进制位101,1后缀=101,后缀位01,长度2
(3)前缀与后缀长度相同,在前面加上2个0 

下面对不同codeNum进行编码结果

codeNumcodeNum+1codeNum+1的二进制需补前缀0的个数编码后的比特串(红色表示补的前缀0)
01101
12101(0)010
23111(0)011
341002(00)00100
451012(00)00101
561102(00)00110
671112(00)00111

0阶无符号指数哥伦布编码的解析过程如下

(1)找到第一个不为0的bit,并记录总共找到了0的个数(num),这个时候读到的这个bit肯定是1
(2)然后读num个后缀
(3)1后缀转变成十进制就是原来的codeNum,codeNum = (1 <<i) + 后缀(十进制) - 1;

比如比特串的二进制为:00111,
首先找到第一个不为0的比特,前面0的个数为2,
然后再读2个后缀11,11十进制为3,
这个时候codeNum = (1 << 2) + 3 - 1 = 4 + 3 - 1 = 6

1.2、k阶无符号指数哥伦布编码过程

k阶无符号指数哥伦布编码过程

(1)将codeNum加上2^k
(2)将加上2^k的数字用二进制表示
(3)计算二进制的长度len,然后再前面加上len-1-k个0

比特串的格式位"前缀1后缀"。前缀 = 后缀 - k

codeNumk=1len-1-k编码后比特串k=2len-1-k编码后比特串
11+2^1=3(11)2-1-1=0111+2^2=5(101)3-1-2=0101
22+2^1=4(100)3-1-1=101002+2^2=6(110)3-1-2=0110
33+2^1=5(101)3-1-1=101013+2^2=7(111)3-1-2=0111
44+2^1=6(110)3-1-1=101104+2^2=8(1000)4-1-2=101000

2、有符号指数哥伦布编码

有符号指数哥伦布编码一般使用se(v)表示,输出可能是负数,有符号指数哥伦布编码解析的过程是在无符号指数哥伦布编码解析过程之上进行的,遇到se(v)需要先调用ue(v)得到codeNum,然后再调用se(v)的过程.

value = (-1)^(codeNum+1) * (codeNum+1)/2;

(-1)^(codeNum+1):表示如果codeNum为奇数那么是1,偶数为-1

0-9的0-3级指数哥伦布编码

指数哥伦布编码

参考资料

哈夫曼编码(Huffman Coding)多图详细解析
指数哥伦布码
八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值