实现香农编码费诺编码杨兴勃0808060121.docx
- 文档编号:27634153
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:11
- 大小:86.95KB
实现香农编码费诺编码杨兴勃0808060121.docx
《实现香农编码费诺编码杨兴勃0808060121.docx》由会员分享,可在线阅读,更多相关《实现香农编码费诺编码杨兴勃0808060121.docx(11页珍藏版)》请在冰豆网上搜索。
实现香农编码费诺编码杨兴勃0808060121
《信息论课程设计》
———实现香农编码、费诺编码
信计0801班
杨兴勃
01
香农编码
一、课题描述:
二、课程设计目的:
三、课程设计要求:
四、算法分析:
五、香农编码流程图:
六、程序设计代码:
七、实验结果:
八、总结:
九、参考文献:
费诺编码
一、问题描述:
二、实习目的:
三、算法分析:
四、费诺编码流程图:
五、费诺编码源程序代码:
六、费诺编码测试结果截图:
七、总结:
八、参考文献:
香农编码
一、课题描述:
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
二、课程设计目的:
(1)进一步熟悉香农编码算法;
(2)掌握程序设计和调试技术中数值的进制转换、数值愈字符串之间的转换等技术。
三、课程设计要求:
(1)输入:
信源符号个数
、信源的概率分布
;
(2)输出:
每一个信源符号对应的香农编码码字。
四、算法分析:
2.1、数据结构
分别用数组p、q、k存放输入的概率,累加概率、码字长度;
2.2、算法基本原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码:
1)信源符号按概率从大到小排列;
2)对信源符号求累加和,表达式:
Pi=Pi-1+p(xi);
3)求自信息量,确定码字长度。
自信息量I(xi)=-log(p(xi));码字长度取大于等于自信息量的最小整数;
4)将累加和用二进制表示,并取小数点后码字的长度的码。
五、香农编码流程图:
六、程序设计代码:
#include
#include
#include
#include
usingnamespacestd;
voidbubble(double*p,intn)//排序
{
for(inti=0;i { for(intj=i+1;j { if(p[i] { doubletemp=p[i]; p[i]=p[j]; p[j]=temp; } } } } voidleijia(double*p,double*pa,intn)//累加概率 { doublesum=0.0; for(inti=0;i { pa[i]=sum; sum+=p[i]; } } voidlength(double*p,int*k,intn)//码字的长度 { for(inti=0;i { for(intj=0;j<20;j++) { if(j<1-log(p[i])/log (2)&&j>=-log(p[i])/log (2)) k[i]=j; } doubleI=-log(p[i])/log (2); inttemp=int(I); if(I-temp==0)k[i]=temp; elsek[i]=temp+1; } } voidcode(int*k,double*pa,string*str,intn)//求编码 { for(inti=0;i { doubles=pa[i]; for(intj=0;j { s=2*s; if(s>=1) { str[i]+="1"; s=s-1; } elsestr[i]+="0"; } } } voidmain() { intn; cout<<"信源符号个数n="; cin>>n; double*p=newdouble[n]; cout<<"信源符号的概率依次为: "; for(inti=0;i { cin>>p[i]; } bubble(p,n); double*pa=newdouble[n]; leijia(p,pa,n); int*k=newint[n]; length(p,k,n); string*str=newstring[n]; code(k,pa,str,n); cout< <<"码字"< for(i=0;i { cout< } } 七、实验结果: 八、总结: 通过本次上机,我对香农编码有了进一步的了解,掌握了其具体过程的实现方法,也对新源编码这一概念有了更加深刻的理解,在编码的过程中,是我对C以及C++语言的基础知识掌握更加牢固,特别是巩固了对输出流格式控制的相关知识,总而言之,这次课程设计实践让我受益匪浅。 九、参考文献: 1.《信息论与编码》(第二版)曹雪虹张宗橙编著,清华大学出版社 2.《C/C++语言程序设计》龚尚福主编,中国矿业大学出版社 费诺编码 一、问题描述: 对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。 二、实习目的: 掌握通过计算机实现费诺编码。 三、算法分析: 3.1、数据结构 本程序采用一个结构体的数据类型来存储费诺编码的相关信息,具体的数据结构如下: typedefstruct { chardata; floatP; }Fano[MAX+1];//需要编码的结构体 3.2、算法基本原理 1)将概率按从大到小的顺序排列; 2)按编码进制数将概率分组,使每组概率和尽可能接近或相等; 3)给每组分配一位码元; 4)将每一分组再按同样原则划分,重复2)和3),直到概率不再可分为止。 四、费诺编码流程图: 五、费诺编码源程序代码: #include #include #include #include usingnamespacestd; //全局变量定义 intn; string*sign; double*p; string*code; voidfano(inta,intb)//费诺编码函数 { if((b-a)>=1)//判断该组中符号个数是否大于2 { doublesum=0; for(inti=a;i<=b;i++) sum+=p[i];//计算该组概率累加和 doubles1=0,*s=newdouble[10]; for(i=a;i<=b;i++) { s1+=p[i];s[i]=fabs(2*s1-sum)/sum; } doublemin=s[a];intc; for(i=a;i<=b;i++) if(s[i]<=min) { min=s[i];c=i;//定位使两组概率和尽可能相近或相等的位置c } for(i=a;i<=b;i++) { if(i<=c)code[i]+="0";//码字加"0" elsecode[i]+="1";//码字加"1" } //判断分组点位置,进而分情况自身调用 if(c==a) fano(c+1,b); elseif(c==b-1) fano(a,c); else {fano(a,c);fano(c+1,b);} } } voidmain() { cout<<"请输入信源符号个数n: "; cin>>n; p=newdouble[n]; sign=newstring[n]; code=newstring[n]; cout<<"请依次输入信源符号: "; for(inti=0;i cout<<"请依次输入信源符号的概率: "; for(i=0;i for(i=0;i for(intj=i+1;j if(p[i] { doubletemp=p[i];p[i]=p[j];p[j]=temp; stringm=sign[i];sign[i]=sign[j];sign[j]=m; } fano(0,n-1);//费诺编码 cout< for(i=0;i cout< delete[]p;delete[]sign;delete[]code; } 六、费诺编码测试结果截图: 七、总结: 费诺编码方法不是唯一。 费诺码比较适合于对分组概率相等或相近的新源编码。 费诺码也可以编。 m进制码,但m越大,信源的符号数越多,可能的编码方式就越多,编码过程就越复杂,有时短吗未必能得到充分利用。 一般情况下,当信源符号个数越多,编码效率就越多低,信源符号相等或越接近,编码效率越高。 八、参考文献: 1.《信息论与编码》(第二版)曹雪虹张宗橙编著,清华大学出版社 2.《C/C++语言程序设计》龚尚福主编,中国矿业大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 香农 编码 杨兴勃 0808060121