算术编码

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现算术编码及其译码

一、实验内容

借助C++ 编程来实现对算术编码的编码及其译码算法的实现

二、实验环境

1. 计算机

2. VC++6.0

三、实验目的

1. 进一步熟悉算术编码的原理,及其基本的算法;

2. 通过编译,充分对于算术编码有进一步的了解和掌握;

3. 掌握C++ 语言编程(尤其是数值的进制转换,数值与字符串之间的转

换等)

四、实验原理

算术编码

算术编码的基本原理是将编码的消息表示成实数0 和1 之间的一个间隔,消息越长,编码表示它的间隔就越小,表示这一间隔所需的二进制位就越多。算术编码用到两个基本的参数:符号的概率和它的编码间隔。信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在0 到1 之间。编码过程中的间隔决定了符号压缩后的输出。

给定事件序列的算术编码步骤如下:

(1) 编码器在开始时将“当前间隔”设置为[0,1)

(2) 对每一事件,编码器按步骤(&)和(b )进行处理

(a)编码器将“当前间隔”分为子间隔,每一个事件一个

(b) —个子间隔的大小与下一个将出现的事件的概率成比例,编码器选择

子间隔对应于下一个确切发生的事件相对应,并使它成为新的“当前间

隔”。

(3) 最后输出的“当前间隔”的下边界就是该给定事件序列的算术编码

编码过程

假设信源符号为{A,B,C,D},这些符号的概率分别为{ 0.1,0.4,0.2,0.3 },根据这些概率可把间隔[0,1]分成4个子间隔:[0,0.1],[0.1,0.5],[0.5,

0.7],[0.7,1],其中[x,y]表示半开放间隔,即包含x不包含y。上

面的信息可综合在表03-04-1中。

F表为信源符号,概率和初始编码间隔

如果二进制消息序列的输入为:CADAC D B。编码时首先输入的符号是C,找到它的编码范围是[0.5, 0.7]。由于消息中第二个符号A的编码范围是[0,0.1],

因此它的间隔就取[0.5,0.7]的第一个十分之一作为新间隔[0.5,0.52]依此类推,编码第3个符号D时取新间隔为[0.514,0.52],编码第4个符号A 时,取新间隔为[0.514,

0.5146],…。消息的编码输出可以是最后一个间隔中

的任意数。整个编码过程如图03-04-1所示。

编码和译码的全过程分别表示在下表。

编码过程

步骤输入符号编码间隔编码判决

1 C [0.5,0.7] 符号的间隔范围[0.5,0.7]

2 A [0.5,0.52] [0.5,0.7]间隔的第一个1/10

3 D [0.514,0.52] [0.5,0.52]间隔的最后一个1/10

4 A [0.514,0.5146] [0.514,0.52]间隔的第一个1/10

[0.5143,[0.514,0.5146]间隔的第五个1/10开始,

5 C

0.51442] 二个1/10

6 D [0.514384,[0.5143,0.51442]间隔的最后3 个1/10

0.51442]

[0.5143836 , [0.514384 , 0.51442]间隔的4 个1/10,从7 B

从[0.5143876 ,0.514402]中选择一个数作为输出: 0.5143876

0.514402] 第1 个1/10 开始

译码过程

步骤间隔译码符号译码判决

1 [0.5,0.7] C 0.51439 在间隔[0.5,0.7)

0.51439 在间隔[0.5,0.7)的第1个

2 [0.5,0.52] A

1/10

[0.514,0.51439 在间隔[0.5,0.52)的第7个

3 D

0.52] 1/10

[0.514,0.51439 在间隔[0.514,0.52]的第1 个

4 A

0.5146] 1/10

[0.5143,0.51439 在间隔[0.514,0.5146]的第5

5 C

0.51442] 个1/10

[0.514384,0.51439 在间隔[0.5143,0.51442]的第

6 D

0.51442] 7 个1/10

[0.51439,0.51439 在间隔[0.51439,0.5143948]

7 B

0.5143948] 的第1个1/10

8 译码的消息: C A D A C D B

五、实验设计:

算术编码是一种无损数据压缩方法,也是一种熵编码的方法。和其它熵编码方法不同的地方在于,其他的熵编码方法通常是把输入的消息分割为符号,然后

对每个符号进行编码。而算术编码是直接把整个输入的消息编码为一个数,一个满足(0.0

算术编码的算法思想如下:

(1)对一组信源符号按照符号的概率从大到小排序,将[0,1)设为当前分析区间。按信源符号的概率序列在当前分析区间划分比例间隔。

(2)检索“输入消息序列”,锁定当前消息符号(初次检索的话就是第一个消

息符号)。找到当前符号在当前分析区间的比例间隔,将此间隔作为新的当前分

析区间。并把当前分析区间的起点(即左端点)指示的数“补加”到编码输出数里。当前消息符号指针后移。

(3)仍然按照信源符号的概率序列在当前分析区间划分比例间隔。然后重复第

相关文档
最新文档