《2022年编程实现算术编码算法 2.pdf》由会员分享,可在线阅读,更多相关《2022年编程实现算术编码算法 2.pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编程实现算术编码算法中国地质大学计算机学院信息安全专业信息论实验报告实验三算术编码一、实验内容编程实现算术编码算法二、实验环境1.计算机2.Windows 2000 或以上3.DEVC+ 三、实验目的1.进一步熟悉算术编码算法;2.掌握 C 语言编程(尤其是数值的进制转换, 数值与字符串之间的转换等)四、实验要求1.提前预习实验,认真阅读实验原理。2.认真高效的完成实验, 实验过程中服从实验室管理人员以及实验指导老师的管理。3.认真填写实验报告。五、实验原理算术编码是把一个信源表示为实轴上0 和 1 之间的一个区间,信源集合中的每一个元素都用来缩短这个区间。1.算法流程六、参考书1.信息论基础
2、理论及应用傅祖芸,电子工业出版社(1) 输入信源符号个数,信源概率分布,还有需要编码的符号序列,(2) 根据概率可以算出初始编码间隔,High当前编码的上限,Low当前编码的下限,high中间变量,用来计算下一个编码符号的当前间隔的上限,low中间变量,用来计算下一个编码符号的当前间隔的下限,d当前间隔之间的距离。(3)扫描需编码的符号序列,确定编码空间第 1 个编码符号的当前间隔为其初始的编码间隔,第 i 个编码符号的当前间隔为第i-1 个编码后的 Low ,High) ,第 i+1 个编码符号的当前间隔算法如下:high=Low+d* 第 i+1 个初始编码符号对应的上限,low=Low+
3、d* 第 i+1 个编码符号对应的下限, 然后 High=high,Low=low ,d=d*第 i 个编码符号的概率。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - 七、源代码#include #include #include const double proc=0.10,0.10,0.10,0.1,0.1,0.1,0.1,0.1,0.15,0.05; double result,areaBegin,areaEnd; int
4、 cord1000,cordLength; char str1000; int strLength=0; bool readdat() printf(*固定模式 *n); printf( 请输入字符串(0-9):n); scanf(%s,str); while(strstrLength!=0) strLength+; for(int i=0;i9|stri0) return 1; return 0; void encord() printf( 编码 :); double w=0.0,len; areaBegin=0.0,areaEnd=1.0; for(int i=0;istrLength;i
5、+) int n=stri-0,k; w=0.0; for(k=0;kn;k+) w+=prock; len=areaEnd-areaBegin; areaEnd=areaBegin+len*(w+prock); areaBegin+=len*w; result=areaBegin*0.01+areaEnd*0.99;/ 选择适合的点cordLength=(int(-log(areaEnd-areaBegin)/log(2)+1; printf( 编码位数 :%dn,cordLength); printf( 编码结果 :); double temp1=result; int temp2; fo
6、r(int j=0;jcordLength;j+)/是进制转换成二进制名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - temp1*=2; temp2=int(temp1); temp1-=temp2; cordj=temp2; printf(%d,temp2); printf(n); void decord() printf( 译码 :n); result=0.0; double wei=0.5; for(int i=0;ico
7、rdLength;i+,wei*+0.5)/二进制转换成十进制result+=wei*cordi; printf( 译码选取的数:%fn,result); areaBegin=0.0,areaEnd=1.0; wei=0.0; int temp; double len; for(int j=0;jwei*len) wei+=proctemp+; temp-; areaEnd=areaBegin+wei*len;/ 计算新的空间areaBegin=areaBegin+(wei-proctemp*len); printf(%d,temp); printf(n); int main() if(readdat() printf( 字符输入错误!n); else encord(); decord(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -