目录
算术编码是一种无失真的编码方法,能有效地压缩信源冗余度,属于熵编码的一种。算术编码的一个重要特点就是可以按分数比特逼近信源熵,突破了Haffman编码每个符号只不过能按整数个比特逼近信源熵的限制。对信源进行算术编码,往往需要两个过程,第一个过程是建立信源概率表,第二个过程是对信源发出的符号序列进行扫描编码。而自适应算术编码在对符号序列进行扫描的过程中,可一次完成上述两个过程,即根据恰当的概率估计模型和当前符号序列中各符号出现的频率,自适应地调整各符号的概率估计值,同时完成编码。尽管从编码效率上看不如已知概率表的情况,但正是由于自适应算术编码具有实时性好、灵活性高、适应性强等特点,在图像压缩、视频图像编码等领域都得到了广泛的应用。
1.算法编码基本原理
算术编码是一种无损数据压缩方法,其核心思想是将消息映射到一个区间内,该区间的长度反映了消息的概率分布。具体来说,对于一个由符号组成的序列S,其概率分布为p1,p2,…,pn。
算术编码的基本原理是:根据信源可能发现的不同符号序列的概率,把[0,1]区间划分为互不重叠的子区间,子区间的宽度恰好是各符号序列的概率。这样信源发出的不同符号序列将与各子区间一一对应,因此每个子区间内的任意一个实数都可以用来表示对应的符号序列,这个数就是该符号序列所对应的码字。显然,一串符号序列发生的概率越大,对应的子区间就越宽,要表达它所用的比特数就减少,因而相应的码字就越短。
算术编码的过程如下:
1.初始化:定义一个区间[0,1][0,1]作为初始编码区间。
2.分割:根据每个符号的概率分布,将当前区间分割成若干个子区间,每个子区间与一个符号相对应。
3.递归:选择与序列中下一个符号对应的子区间作为新的编码区间,重复上述步骤直到序列中的所有符号都被处理。
4.输出:最终的编码区间可以表示为一个二进制数,该数的精度取决于原始区间长度。
2.自适应算术编码
自适应算术编码是一种动态更新概率模型的算术编码方法,它不需要事先知道数据的概率分布,而是随着数据流的处理逐步学习和更新概率模型。这种方法非常适合于数据源的概率分布未知或随时间变化的情况。
自适应算术编码在扫描符号序列前并不知道各符号的统计概率,这时假定每个符号的概率相等,并平均分配区间[0,1]。然后在扫描符号序列的过程中不断调整各个符号的概率。同样假定要编码的是一个来自四符号信源{A,B,C,D}的五个符号组成的符号序列:ABBCD。编码开始前首先将区间[0,1]等分为四个子区间,分别对应A,B,C,D四个符号。扫描符号序列,第一个符号是A,对应区间为[0,0.25],然后改变各个符号的统计概率,符号A的概率 为2/5,符号B的概率为1/5,符号C的概率为1/5,符号D的概率为1/5,再将区间[0,0.25]等分为五份,A占两份,其余各占一份。接下来对第二个符号B进行编码,对应的区间为[0.1,0.15],再重复前面的概率调整和区间划分过程。具体的概率调整见表1。
如下图所示:
如上图所示,要编码的是一个来自四符号信源{A,B,C,D}的由五个符号组成的符号序列:ABBCD。假设已知各信源符号的概率分别为:P(A)=0.2,P(B)=0.4,P(C)=0.2,P(D)=0.2。编码时,首先根据各个信源符号的概率将区间[0,1]。分成四个子区间。符号A对应[0,0.2],符号B对应[0.2,0.6],符号C对应[0.6,0.8],符号D对应[0.8,1.0]。符号序列中第一个符号是A,其对应的区间为[0,0.2],接下来将这个区间扩展为整个高度,再根据各个信源符号的概率将这个间扩展为整个高度,再根据各个信源符号的概率将这个新区间分成四段;第二个符号是B,它对应新的子区间的第二个子区间,即对应区间[0.04,0.12];再将该区间扩展为整个高度,再根据这个过程直接最后一个符号得到一个区间[0.08032,0.0816],这样该区间内的任何一个实数就可以表示整个符号序列,如0.081。
综上所述,自适应算术编码算法包括如下几个步骤:
2.1概率估计
假设我们有一个符号集A={a1,a2,…,aN},每个符号ai出现的概率为pi。在自适应算术编码中,我们使用一个计数器Ci来估计每个符号的概率。初始时,所有计数器设置为一个较小的非零值,以防止概率为0或1的情况。每当遇到符号ai时,就增加相应的计数器Ci。概率pi可以通过公式计算:
2.2 编码区间更新
在编码过程中,我们不断更新编码区间[L,H],其中L是区间的左端点,H是区间的右端点。对于每个符号ai,我们需要找到对应的子区间[L′,H′],并将其设置为新的编码区间。
一旦编码区间足够小(通常小于某个阈值),就需要输出编码区间的一部分。输出的比特数n可以通过以下公式计算:
自适应算术编码是一种高效的无损数据压缩方法,特别适用于数据源概率分布未知或随时间变化的情况。基于FPGA的实现能够充分利用硬件并行处理的优势,显著提高编码效率。通过精心设计的硬件架构和算法优化,可以实现高性能的自适应算术编码器。