shannon码的编码实验总结
本科生实验报告 实验课程信息理论与编码 学院名称信息科学与技术学院 专业名称 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一六年九月----二〇一六年十一月 填写说明 1、适用于本科生所有的实验报告; 2、专业填写为专业全称,有专业方向的用小括号标明; 3、格式要求: ①用A4纸双面打印或在A4大小纸上用蓝黑色水笔书写。②打印排版:正文用宋体小四号,倍行距,页边距采取默认形式。字符间距为默认值;页码用小五号字底端居中。 ③具体要求: 题目; 摘要; 关键词 小四号黑体 参考文献,参考文献用五号宋体,参照《参考文献著录规则》。 实验一:香农编码 一、实验目的 掌握通过计算机实现香农编码的方法。 二、实验要求 对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。 三、实验基本原理 给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1.将信源消息符号按其出现的概率大小排列 p(x1)?p(x2)???p(xn) 2.确定满足下列不等式的整数码长Ki; ?log2p(xi)?Ki??log2p(xi)?1 3.为了编成唯一可译码,计算第i个消息的累加概率 pi??p(xk) k?1i?1 4.将累加概率Pi变换成二进制数。 5.取Pi二进制数的小数点后Ki位即为该消息符号的二进制码。 四、实验内容 x2x3x4x5x6x7??X??x1?q(X)???????进行二进制香农编码。1.对给定信源? x2x3x4x5x6??X??x1??q(X)??????进行二进制香农编码。2.对给定信源? 3.自已选择一个例子进行香农编码。 五、实验设备 PC计算机,C++ 六、实验报告要求 1、画出程序设计的流程图, 2、写出程序代码, 3、写出在调试过程中出现的问题, 4、对实验的结果进行分析。 七、流程图 八、程序代码 //:定义控制台应用程序的入口点。 // #include"" #include #include usingnamespacestd; int_tmain(intargc,_TCHAR*argv[]) { inttest;intN; cout>N; cout>X[i]; } //由小到大排序 for(i=0;i=1)//累加概率乘2大于1,对应码字加1,累加概率自身取余 {pa[i]=pa[i]*2-1;code[i]+="1"; } else//累加概率乘2小于1时,对应码字加0,累加概率自身取余 { code[i]+="0"; pa[i]*=2;}}{code[i]=code[i].substr(0,K[i]);}//求码字for(i=0;idata() #include"vector" #include"algorithm" #include"" usingnamespacestd; structbitree {//定义结构用于存储编码结果的二叉树结构,在译码时用到 charch;//用于存储码符号 charmz;//用于存储码字 bitree*lchild; bitree*rchild; }; structdata {//用于存储相关的信源符号以及其概率 doublep; charch; vectorcode; intml; }; boolsortspecial(datadt1,datadt2) {//用于排序时用 return>; } voidprint2(vectorvd) {//用于打印译码结果 for(inti=0;i&vd) {//用于读入相关的信源符号以及概率 intn; while(true) { cout>n; cout>; cin>>; =0; _back(dt); i++; } doublesum=0; vector::iteratorpit; /*for(pit=();pit!=();pit++) { sum+=pit->p; } if(sum!=1) { coutch=ch1; bit->mz=ch2; bit->lchild=NULL; bit->rchild=NULL; if(ch1=='0') bt->rchild=bit; elsebt->lchild=