自适应算术编码器概述

目录

1.算法编码基本原理

2.自适应算术编码

2.1概率估计

2.2 编码区间更新


       算术编码是一种无失真的编码方法,能有效地压缩信源冗余度,属于熵编码的一种。算术编码的一个重要特点就是可以按分数比特逼近信源熵,突破了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的实现能够充分利用硬件并行处理的优势,显著提高编码效率。通过精心设计的硬件架构和算法优化,可以实现高性能的自适应算术编码器。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值