欢迎来到天天文库
浏览记录
ID:33615382
大小:382.24 KB
页数:16页
时间:2019-02-27
《信息论上机报告_——huffman编码对英文文本的压缩和解压缩和算术编码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、信息论上级报告题目一算术编码1﹑题目要求算术编码是把一个信源表示为实轴上0和1之间的一个区间,信源集合中的每一个元素都用来缩短这个区间。算法流程(1)输入信源符号个数,信源概率分布,还有需要编码的符号序列,(2)根据概率可以算出初始编码间隔,High——当前编码的上限,Low——当前编码的下限,high——中间变量,用来计算下一个编码符号的当前间隔的上限,low——中间变量,用来计算下一个编码符号的当前间隔的下限,d——当前间隔之间的距离。(3)扫描需编码的符号序列,确定编码空间第1个编码符号的当前间隔为其初始的编码间隔,第i个编码符号的当前间隔为第i-1个编码后的
2、[Low,High),第i+1个编码符号的当前间隔算法如下:high=Low+d*第i+1个初始编码符号对应的上限,low=Low+d*第i+1个编码符号对应的下限,然后High=high,Low=low,d=d*第i个编码符号的概率。2.设计设计思想:其算法的主要算法基本思想:首先就是构造一个结构体用于存储信源的相关信息(包括信源符号,信源概率,编码的上下限);接着就是初始化信源的相关信息,如初始化编码间隔;利用算术编码的原理构造编码方法,最后实现编码。3.调试分析:此算法主要就是算术编码方法的构造,利用算法中Initial_message()函数初始化以后,根据
3、初始化间隔完成编码序列的编码。在调试的过程中经常遇到一些小问题,通过一步步的调试以及修改,问题一个的解决了。同时也遇到比较大的问题,就是编码方法过程的实现,最大的体会就是必须深入理解次编码方法的原理。4.用户手册:首先设置信源符号的个数和编码的序列长度(即算法中宏定义的N和n),然后输入N个信源符号及其概率,如,a空格0.2输入(重复N次),最后输入长度为n的信源符号序列,即长度为n要编码的序列。5.流程图开始输入信源符号及其概率初始化信源符号的初始间隔输入要编码的序列进行算术编码输出编码结果结束6.测试结果:7.源程序清单:#include#in
4、clude#include#defineN4//信源符号的个数#definen7//要编码的序列长度structARC{charm[N];floatP[N];floatLow[N];floatHigh[N];floatlow;floathigh;}code;Initial_message()//初始化编码间隔{floatF=0;inti=0,j;printf("请输入%d个信源符号及其概率!",N);for(i=0;i5、}for(j=0;j6、:",n);scanf("%s",c);p=c;q=code.m;while(q!=NULL)//判定第一个需要编码序列的第一符号所在的间隔{if(*p==*q){code.low=code.Low[i];code.high=code.High[i];printf("%c[%f,%f)",code.m[i],code.low,code.high);gotoss;}else{q++;i++;}}ss:p++;while(*p!=' ')//利用算术编码的方法,求出编码的十进制结果{intk=0;floatt;floatpt=0;intk1;q=code.m;7、while(*q!=' '){if(*p==*q){if(k==0){t=code.high-code.low;code.low=code.low+t*pt;code.high=code.low+t*code.P[k];printf("%c[%f,%f)",code.m[k],code.low,code.high);gotoxx;}else{k1=k;while(k1){t=code.high-code.low;pt=pt+code.P[k1-1];k1--;}code.low=code.low+t*pt;code.high=code.low+t*co
5、}for(j=0;j6、:",n);scanf("%s",c);p=c;q=code.m;while(q!=NULL)//判定第一个需要编码序列的第一符号所在的间隔{if(*p==*q){code.low=code.Low[i];code.high=code.High[i];printf("%c[%f,%f)",code.m[i],code.low,code.high);gotoss;}else{q++;i++;}}ss:p++;while(*p!=' ')//利用算术编码的方法,求出编码的十进制结果{intk=0;floatt;floatpt=0;intk1;q=code.m;7、while(*q!=' '){if(*p==*q){if(k==0){t=code.high-code.low;code.low=code.low+t*pt;code.high=code.low+t*code.P[k];printf("%c[%f,%f)",code.m[k],code.low,code.high);gotoxx;}else{k1=k;while(k1){t=code.high-code.low;pt=pt+code.P[k1-1];k1--;}code.low=code.low+t*pt;code.high=code.low+t*co
6、:",n);scanf("%s",c);p=c;q=code.m;while(q!=NULL)//判定第一个需要编码序列的第一符号所在的间隔{if(*p==*q){code.low=code.Low[i];code.high=code.High[i];printf("%c[%f,%f)",code.m[i],code.low,code.high);gotoss;}else{q++;i++;}}ss:p++;while(*p!=' ')//利用算术编码的方法,求出编码的十进制结果{intk=0;floatt;floatpt=0;intk1;q=code.m;
7、while(*q!=' '){if(*p==*q){if(k==0){t=code.high-code.low;code.low=code.low+t*pt;code.high=code.low+t*code.P[k];printf("%c[%f,%f)",code.m[k],code.low,code.high);gotoxx;}else{k1=k;while(k1){t=code.high-code.low;pt=pt+code.P[k1-1];k1--;}code.low=code.low+t*pt;code.high=code.low+t*co
此文档下载收益归作者所有