
自信息的数学期望为信源的信息熵;

信息熵是从平均意义上表示信源的总体信息测度,可以理解为信源 X 每输出一个符号所提供的平均信息量;
任何概率分布都满足 0<=P(xi)<=1,所以熵的取值总是非负数;
与变长码不同,算术编码的本质是为整个输入序列分配一个码字, 而不是给每个输入流中的每个字符分别指定码字, 因此平均意义上可以为单个字符分配码长小于1 的码字,所以算术编码可以给出接近最优的编码结果;
算术编码的基本原理:
根据信源可能发生的不同符号序列的概 率, 把 [0, 1) 区间划分为互不重叠的子区间,子区间的宽度恰好是各符号序列的概率 , 这样信源发出的不同符号序列将与各子区间一一对应。因此每个子区间内的任意一个实数都可以用来表示对应的符号序列 , 这个数就是该符号序列所对应的码字。显然,一串符号序列发生的概率越大,对应的子区间就越宽,要表达它所用的比特数就越少,因而相应的码字就越短。
算术编码的两个基本参数:符号的概率和它的编码间隔;信源符号概率决定编码过程中信源符号的间隔,而这些间隔包含在0到1之间,编码过程中的间隔决定了符号压缩后的输出。
实际中计算机的精度不可能无限长,明显的问题就是运算出现溢出,考虑计算机的 16、32、64 位精度,可以用比例缩放方法解决;
算术编码器对整个消息只产生一个码字,在间隔[0, 1)中的一个实数,因此译码器在收到表示这个实数的所有位之前不能进行译码;
算术编码也是一种对错误很敏感的编码方法,如果有一位发生错误会导致整个消息译错;
算术编码可以是静态的或者自适应的,静态算术编码中,信源符号的概率是固定的,自适应算术编码中,信源符号的概率根据编码时符号出现的频繁程度动态的进行修改;开发动态算术编码是因为事先知道精确的信源概率是很难的,且不切实际;在编码期间估算信源符号概率的过程叫建模;动态建模决定编码器压缩效率的关键因素。





基于上下文的自适应二进制算术编码(CABAC)是一种将自适应的二进制算术编码与一个设计精良的上下文模型结合起来的方法;
采用了算术编码思想,同时充分考虑了视频流相关统计特性,提高了编码效率;在编码中,每一个符号的编码都与以前编码的结果有关,根据符号流的统计特性来自适应地为每一个符号分配码字。
基本步骤:二进制化、上下文建模、二进制算术编码,如下图;
二进制化是将一个给定的非二进制语法元映射成一个二进制序列,即一个二元流(Bin String),若输入的语法元素本身就是一个二进制语法元素,则忽略此过程,数据会通过一条旁路直接送往下一步;
虽然霍夫曼二元化效率高,但因为码字结构不规则,需要对码表进行存储并且解码不断查表,导致复杂度很高,实际应用一般都采用一元码、定长码、指数哥伦布码的二元方法;
h265中采用的是截断莱斯二元化TR、K阶指数哥伦布二元化EGK、定长二元化FL;不同的语法元素采用不同的二元化方法;
上下文建模即二元算术编码有常规编码模式和旁路编码模式两种以供选择,在常规编码模式中,语法元素的二元位(Bin)顺序地进入上下文模型器,编码器根据先前编码过的语法元素或二元位的值,为每一个输入的二元位分配合适的概率模型,此过程就是上下文建模;
根据条件熵理论,利用其他己编码的语法元素进行条件编码 ,相对于独立编码或者无记忆编码能够进一步提高编码性能,这些用来作为条件的己编码符号信息称为上下文;
条件越多所得到的条件熵就越小,因此提高上下文阶数能够获取更好的编码性能,但随着上下文模型阶数的增加,对概率模型存储和更新的复杂度也惊人的速度增加,所以在设计上下文模型时,既要考虑提高编码效率,又要考虑实现复杂度;
在h265中采用查表的方式来为每种语法元素进行上下文模型参数初始化;
二进制算术编码对当前语法元素二进制化后的每一个 Bin 根据其概率模型参数进行算术编码,得到最后的输出码流;
二进制算术编码基于递归区间划分的方式,在递归过程中保存编码区间和区间下限;
包括两种编码方式:常规编码、旁路编码,常规编码利用自适应的概率模型进行编码,旁路以等概率的方式进行编码。

量化后变换系数的熵编码在整个熵编码中占有举足轻重地位,量化后变化系数大多为零值或幅度较小的值;
通过编码非零系数的位置信息和非零系数的幅值来表示变换系数;
变换系数的扫描
○ 在 h265中变换系数的扫描是基于4x4大小的子块进行,较大的TB都需要进行分割成多个4x4子块;
○ h265中扫描方式:对角扫描(类似h264中的zig-zag)、水平扫描、垂直扫描;
○ h265中扫描方式与预测模式存在对应关系,如4x4和8x8TB帧内预测,垂直预测模式对应水平扫描方式;16x16、32x32TB的帧内以及帧间预测模式采用对角扫描;

一个 TB 的变换系数经过扫描后就可得到一组一维的变换系数,该组系数可以根据非零系数位置信息和幅值信息完全表示,h265标准对变换后的非零系数位置信息和幅值信息进行CABAC编码。
参考:https://blog.csdn.net/Dillon2015/article/details/104254432
为什么用SDH
因为每个非零系数符号语法元素采用coeff_sign_flag来标识,用来表示该系数是正值还是负值,通过旁路编码器进行熵编码,可以加快整个编码以及解码的速度,该标识在视频压缩码流里占据很大比例,大约15%~20%;
为了减少其比特数,H265中对非零系数符号允许使用符号数据隐藏技术(Sign Data Hiding,SDH);
是否采用 SDH 技术需要显式标识,图像参数集中的语法元素 sign_data_hiding_enabled_flag 置为 1 表示允许编码器应用 SDH 技术。
当SDH得到的符号和CG内最后一个非零系数符号不一致时就需要调整CG中某个非零系数,将它的值加1或减1,以使其和真实符号一致。所以使用SDH技术可能会带来变换系数的失真,但符号位在熵编码时使用的是旁路编码模式开销较大,使用SDH技术节约的码率大于一个变换系数失真带来的影响。