—算数编码压缩与解压缩程序。
姓名: 杨宁。
学号: 14020181051
目录。一、 试验背景及目的 3
二、 试验内容 3
2.1 试验步骤 3
2.2 试验原理 3
三、 算法流程 5
3.1 编码器算法 5
3.2解码器算法 6
四、 程序设计说明 7
五、 程序压缩性能评价 7
5.1 文件的测试结果 8
5.2 文件的测试结果 10
5.3 程序压缩性能评价 13
六、 程序源** 14
七、 测试数据文件 22
一、 试验背景及目的。
霍夫曼方法比香农-费诺方法更有效,但这两种方法都很少能产生最佳变长编码,仅当符号概率等于2的负整数次幂时,这些方法才能产生最佳结果(码字的平均长度等于熵)。算数编码克服了这个问题,它是把一个码字(通常较长)分配给整个输入流,而不是给各符号分别分配码字。它可以为特定序列指定码字,而又不需要为所有同一长度的序列生成**。
算术编码逐个符号读输入流,每输入和处理一个符号,就在码字后面加上几位,因此,在算数编码中,当前区间的下限和上限随着码流长度的增大,将变得无限长。而实际上,双精度的实数也只有16位有效数字,更长精度的数无法表示,除此之外,即使有一种方法能够表示足够长的数据精度,两个很长的数进行运算,花费的时间也无法承受。因此,一个实用的方案应当采用有限长度的整数运算,利用有限字长寄存器来实现算数编码,该方法即为整数算数编码。
本实验的目的即根据算数编码的原理,利用二进制定点数法编写算数编码压缩及解压缩程序,实现对*.txt文件的压缩及解压缩,并对程序压缩性能进行评价,从而加深对算数编码原理的理解,掌握相关算法的设计方法以及进一步提高程序编写的能力。
二、 试验内容。
2.1 试验步骤。
根据试验目的,本次试验的具体步骤如下:
参考相关资料对算数编码的原理进行分析与理解,根据其原理,利用二进制定点数法设计符合要求的算法,根据所设计的算法,利用c语言编写相关程序,利用测试数据文件对程序进行测试,并对程序的压缩性能进行评价。
2.2 试验原理。
2.2.1 编码器的实现。
给定一个字长,将[0,1)区间中的重要值映射到个二进制字的范围。点0被映射为:
点1被映射为:
点0.5被映射为:
以表示符号出现的次数,定义,编码下限和上限可以用下式迭代:
具体编码规则如下:
如果l和u的最高位都是b:将b输出到码流,将l左移1位,最低位补0,将u左移1位,最低位补1
如果scale>0,输出b的补,scale减1
如果scale条件成立:将l左移1位,最低位补0将u左移1位,最低位补1l 和u最高位取反,scale加1
上述规则用**表示如下:
2.2.2 解码器的实现。
解码过程与编码过程相反,有了编码器的实现,解码器实现就很好描述了。解码过程一旦启动,剩下的就是模拟编码器算法了。其原理如下:
初始化l和u。从压缩码流读入m个比特作为t。
以index解码符号x,其表达式如下:
解码下限和上限可以用下式迭代:
具体解码规则如下:
如果l和u的最高位都是b:将t左移1位,最低位从压缩码流补1个比特,将l左移1位,最低位补0,将u左移1位,最低位补1。
如果scale条件成立:将t左移1位,最低位从压缩码流补1个比特,将l左移1位,最低位补0,将u左移1位,最低位补1,将l,u,t最高位取反。
三、 算法流程。
根据上述编码器与解码器的原理,设计相关的算法。
3.1 编码器算法。
初始化l和u
取得符号。while (u和l的最高位都等于b或满足scale条件)
if (u和l的最高位都等于b)
if (满足scale条件)
将l左移一个比特,并将0移入最低位。
将u左移一个比特,并将1移入最低位。
对l和u的(新)最高位求反。
递增scale
3.2解码器算法。
初始化l和u
将接收到的比特流中的前m个比特读入标签t
k=0对符号x进行解码。
while (u和l的最高位都等于b或满足scale条件)
if (u和l的最高位都等于b)
if (满足scale条件)
将l左移一个比特,并将0移入最低位。
将u左移一个比特,并将1移入最低位。
将t左移一个比特,并将接收到的比特流中的下一个比特读入最低位。
对l、u和t的(新)最高位求反。
四、 程序设计说明。
在上交的作业压缩包中共包含两个部分:pdf格式的试验报告,程序压缩包arith。
在程序压缩包arith中,算数编码的实现程序文件为 ,可在visual c++ 6.0 环境中运行成功。文件为待压缩文件。
程序成功运行后,data_文件为编码文件,用于存储压缩结果。data_文件为解压缩文件,用于存储恢复结果。
程序压缩包arith中的文件为测试文件,用于对编写的算数编码压缩及解压缩程序的测试。为了方便起见,在使用测试文件对程序进行测试时,可以直接将文件中的内容复制到待压缩文件中,并将文件中原来的数据覆盖掉,再次运行算数编码的实现程序文件即可得到测试结果,从而完成对程序压缩性能的评价。
五、 程序压缩性能评价。
本次试验共采用两个txt文件对算数编码压缩与解压缩程序进行测试,并利用两个文件的测试结果分别从两个方面对程序的压缩性能进行评价:原文件与解压缩后的文件内容的差异,压缩比。
5.1 文件的测试结果。
在visual c++ 6.0 环境中运行程序文件夹中的文件,得到运行结果如下所示:
5.2 文件的测试结果。
将程序文件夹下的文件的内容复制到文件中,并覆盖掉其原有内容,在visual c++ 6.0 环境中重新运行程序文件夹中的文件,得到运行结果如下所示:
5.3 程序压缩性能评价。
本试验算数编码程序编码的结果直接以0和1的形式输出,这样做的好处是更加直观。而对于实际应用情况,可以将八位数据组合输出(以ascii码形式展示,但这么做会显得编码结果比较乱),因此程序成功运行后的编码文件大小除以8才是实际应用中的编码文件大小。
从上述运行结果可以看出,无论是文件,还是文件,压缩前与解压缩后的文件内容完全一致,因此本试验编写的算数编码压缩与解压缩程序是正确的,能够成功运行。此外,文件的压缩比为185.789606% ,文件的压缩比为146.
636694% ,两个文件的压缩比均大于1。由于压缩比的定义为原始数据量与压缩数据量之比,所以压缩比大于1证明压缩后的文件数据量少于压缩前的文件数据量,该程序起到了压缩的作用。
综上所述,本试验编写的算数编码压缩与解压缩程序不仅能完成各种符号(包括汉字)的压缩与解压缩,使压缩前与解压缩后的内容完全一致,而且程序的压缩比均大于1,因此本试验编写的算数编码压缩与解压缩程序具有较好的压缩性能。
六、 程序源**。
根据上述编码器与解码器的算法,用c语言编写相关程序,具体程序如下所示:
#include<>
#include<>
#include<>
#define n 20
/定义相关变量并初始化。
unsigned char *databuf; /用来存储从文件中读入的字符串。
int filelen文档中字符的个数。
int totalcount字符总数。
int ckind = 0文档中字符的种类数。
int count[256] =有效字符表中对应字符出现次数。
int sub_code = 0codeout数组的下标。
int cumcount[256] =字符出现次数累加表。
int showingtable[256] =有效字符表。
int i = 0;
/主函数。int main()
void scanfile();
scanfile();扫描文件。
void arith_code();
arith_code();编码。
void arith_decode();
arith_decode();解码。
return 0;
/文件扫描函数。
void scanfile()
file *fp1;
char filepath 读入文件。
int asctable[256] =按ascii码表按序统计输入字符个数。
databuf = new unsigned char[1024*1024];
if((fp1 = fopen(filepath,"rb"))null)
printf("数据加载失败!");
filelen = fread(databuf,1,1024*1024,fp1);/总字符个数。
for(i=0; i < filelen; i++)实现字符扫描。
化工091大作业 1
化工本091综合作业。一 名词解释。1 反应机理 2 氢化催化 3 硝化 4 相转移催化 5 亚硝化 6 磺化 7 相似相溶 原则 8 卤化反应 9 反应物的摩尔比 10 气固相接触催化氧化 二 填空题。1 已有两个取代基为同一类型定位基,且处于间位,则定位作用 2 化学反应物不按化学计量比投料时,...
建筑制图1大作业
西南大学网络与继续教育学院课程考试答题卷。学号 1220822626002 姓名 陈霄层次 高起专 类别 网教专业 建筑工程技术 201 6 年 1 月。课程名称 编号 建筑制图1 0728a 卷。横线以下为答题区 一 问答题。1 组合体的尺寸种类有哪些?各种尺寸的含义是什么?10 答 1 定形尺寸...
2019大作业
2013 2014学年第二学期 计算流体力学原理及应用 大作业题目。一 总的要求。1 报告应该包括的内容。1 题目。2 计算过程中重要的设置过程 截图 并给出这样做的原因。3 结果分析,给出云图和速度矢量图等,并对计算结果进行分析比较。2 格式要求。1 请使用word打印。2 纸张大小为a4,封面见...