没有合适的资源?快使用搜索试试~ 我知道了~
CABAC原理及其实现笔记
5星 · 超过95%的资源 需积分: 50 3 下载量 63 浏览量
2013-07-24
13:26:35
上传
评论
收藏 748KB DOC 举报
温馨提示
网上下载的一份关于h264中CABAC算法的资料,有兴趣的童鞋可以看看
资源推荐
资源详情
资源评论
Context-Based Adaptive Binary Arithmetic Coding in the H.264/AVC
简称 Cabac,H264 中的一种熵编码方式:基于上下文的自适应二进制算术编码
内容安排:1,介绍算术编码 2,介绍二进制算术编码 3 介绍 Cabac 及其一些实
用的实现方式(参考 JSVM 代码,也可以参考 JM) ---张新发
一,算术编码
算术编码是一种常用的变字长编码,它是利用信源概率分布特性、能够趋
近熵极限的编码方法。它与 Huffman 一样,也是对出现概率大的符号赋予短码,
对概率小的符号赋予长码。但它的编码过程与 Huffman 编码却不相同,而且在
信源概率分布比较均匀的情况下其编码效率高于 Huffman 编码。它和 Huffman
编码最大的区别在于它不是使用整数码。Huffman 码是用整数长度的码字来编
码的最佳方法,而算法编码是一种并不局限于整数长度码字的最佳编码方法。
算术编码是把各符号出现的概率表示在单位概率 [0,1] 区间之中,区间的宽度
代表概率值的大小。符号出现的概率越大对应于区间愈宽,可用较短码字表示;
符号出现概率越小对应于区间愈窄,需要较长码字表示。 举例如下:
以符号 为例
在算术编码中通常采用二进制分数表示概率,每个符号所对应的概率区间
都是半 开 区 间,即该 区 间 包括左端 点 , 而不包括右端 点 , 如 S1 对应 [0,
0.001),S2 对应 [0.001, 0.01) 等。
算术编码产生的码字实际上是一个二进制数值的指针,指向所编的符号对
应的概率区间。
符号序列 …… 的第一个符号 S3 用指向第 3 个子区间的指针来
代表,可以用这个区间内的任意一个小数来表示这个指针,这里约定这
个区间的左端点代表这个指针,因此得到第一个码字.011。
后续的编码将在前面编码指向的子区间内进行,将 [.011, .111] 区间再按
概率大小划分为 4 份,第二个符号 S3 指向 .1001 (S3 区间的左端),输
出码字变为 .1001。
然后,S3 对应的子区间又被划分为 4 份,开始对第三个符号 S2 进行编
码,…….
两个参量:编码点(指针所指处)C 和区间宽度 A。
初始状态
编码点(指针所指处)C = 0
区间宽度 A = 1.0
新编码点 C = 原编码点 C + 原区间 A×Pi
新区间 A = 原区间 A×pi
序列 S3S3S2S4 …… 的编码过程:
第 1 个符号 (S3): C = 0 + 1×.011 = .011
A = 1×.1 = .1
第 2 个符号 (S3): C = .011 + .1×.011 = .1001
A = .1×.1 = .01
第 3 个符号 (S2): C = .1001 + .01×.001 = .10011
A = .01×.01 = .0001
第 4 个符号 (S4): C = .10011 + .0001×.111 = .1010011 (输出的码
字)
A = .0001×.001 = .0000001
解码过程
算法解码采取与编码过程相反的步骤
把接收到的码字串指向其对应的子区间,得到此子区间对应的符
号,即为解码后的符号。
即从码字串中减去已解码符号的子区间的左端点的数值(累积概
率),
并将差值除以该子区间的宽度(概率值),得到新的码字串。
上述例子
当收到字码串 (.1010011) 时,其指向子区间 [.011, .111],对应于
S3,因此,得到第 1 个符号为 S3。
新码字串:(.1010011 - .011) ÷ (.1) = 0.100011 ,新码字串仍然指
向子区间 [.011, .111],因此,第 2 个符号仍为 S3。
其它符号依次类推
二,二进制算术编码
二进制算术编码的输入的字符只有两种,如果信源字符集内包含有多个字
符,则先将这些字符经过一系列的二进判决,变成二进制字符串。
这两个符号构成的序列的编码与算术编码基本原理相同,仍是不断划分概
率子区间的递归过程。
在两个输入字符中,出现概率较大的为 MPS (More Probable Symbol),MPS
的概率为 Pe;出现概率较小的为 LPS (Less Probable Symbol),LPS 的概率为
Qe,Pe=1-Qe。
编码初始化子区间为 [0,1],MPS 与 LPS 分配如图所示:
编码时,设置两个专用寄存器(C,A)
C 寄存器的值为编码点(指针所指处),初时化为 0
A 寄存器的值为子区间的宽度 (该宽度恰好是已输入符号串的概率),初时化为 1
随着被编码数据源输入,C 和 A 的内容按以下编码规则修正:
当低概率符号 LPS 到来时:
C=C , A=AQe
当高概率符号 MPS 到来时:
C=C + AQe , A=Ape = A(1-Qe)
例: 信源符号序列 11011111
0 为 LPS Qe = 1/8 =(0.001)b
1 为 MPS Pe = 7/8 =(0.111)b
初始状态:C=0 (子区间起始位置) A=1 (子区间宽度)
1, 第 1 个符号 1 为 MPS
C = C + AQe = 0 + 1 ´0.001 = 0.001
A = APe = 1 ´0.111 = 0.111
2, 第 2 个符号 1 仍为 MPS
C=C+AQe = 0.001 + 0.111 ´0.001=0.001111
A=APe= 0.111 ´0.111 =0.110001
3, 第 3 个符号 0 为 LPS
C=C=0.001111
A=A Qe = 0.110001 ´0.001 =0.000110001
4, 继续下去……. 最后得
C= 0.010001111110111100000001
A= 0.000011001001000010111111
此时区间的尾为 C+A=0.010101000111111111000000,编码区间[C, C+A)
编码输出可以是最后一个编码区间中的任意小数值,但为了取得最好的编码效
率,选择的小数应有最短的比特长度。上面区间我们可取 0.0101,即输出为 0101
解码过程
按 Qe、Pe 分成两个子区间,判断被解码的码字落在哪个区间,并赋予对应符号。
设 c’ =(0.0101) b 是被解码的值,初始值 A=1 Qe = 0.001
当 c’ 落在 0-QeA 之间,解码符号为 D=0,则 C’ = C’, A = Qe A
当 c’ 落在 QeA-A 之间,解码符号为 D=1,则 C’ = C’-Qe A ,A = A(1-Qe)
1,c’ = 0.0101 落在 Qe A -A 之间,解码符号为 D = 1
c’ = c’-QeA = 0.0101 - 0.001 = 0.0011 , A = A(1-Qe)= 0.111
2,c’= 0.0011 落在 Qe A -A 之间,解码符号为 D=1
c’=c’-QeA= 0.0011 -0.000111=0.000101 , A=A ( 1-Qe ) = 0.111
´0.111=0.110001
剩余16页未读,继续阅读
资源评论
- 子非鱼_s2015-08-20对于算术编码的理解很与帮助
天好蓝
- 粉丝: 44
- 资源: 26
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功