您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 初中教育 > 香农编码课程设计报告
信息论与编码课程设计实验报告课程题目:香农编码姓名:叶显权学号:311008000927班级:电信10-03班指导老师:成凌飞学院:电气工程与自动化学院日期:2013年3月28日一.设计任务与要求熟悉运用香农编码,并能通过C语言进行编程,对任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。二.实验原理原理:编码的目的是为了优化通信系统。香农编码属于不等长编码,通常将经常出现的消息编成短码,不常出现的消息编成长码。从而提高通信效率。香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。香农第一定理指出,选择每个码字的长度Ki满足下式:-log2p(xi)≤Ki1-log2p(xi)就可以得到这种码。这种编码方法称为香农编码。二进制香农码的编码步骤如下:⑴将信源符号按概率从大到小的顺序排列,p(a1)≥p(a2)≥…≥p(an)⑵确定满足下列不等式的整数Ki,-log2p(ai)≤Ki1-log2p(ai)⑶令p(a1)=0,用Pi表示第i个码字的累加概率,⑷将Pi用二进制表示,并取小数点后Ki位作为符号ai的编码三.设计思路11)(ikkiapP二进制香农编码的步骤如下:(1)、将信源符号按概率从大到小的顺序排列(2)、对第j个前的概率进行累加得到pa(aj)(3)、由-logp(ai)ki1-logp(ai)求得码字长度ki(4)、将pa(aj)用二进制表示,并取小数点后ki位作为符号ai的编码。四.设计流程图五.程序及结果香农编码源程序#includeiostream.h#includemath.h#includeiomanip.h#includestdlib.hclassT{public:T(){}~T();voidCreate();voidCoutpxj();voidCoutk();voidCoutz();voidPrint();protected:intn;double*p;输入符号概率十进制小数转换成二进制输出函数求前J个的累加和求码长Ki将信源符号概率从大到小排序double*pxj;int*k;double*mz;};voidT::Create(){cout请输入信源符号个数:;cinn;p=newdouble[n];cout请分别输入这n个概率:\n;for(inti=0;in;i++)cinp[i];pxj=newdouble[n];k=newint[n];mz=newdouble[n];doublesum=0.0;for(i=0;in;i++)sum+=p[i];if(sum!=1.0)throw1;else{for(i=0;in;i++){intk=i;for(intj=i+1;jn;j++)if(p[k]p[j])k=j;doublem=p[i];p[i]=p[k];p[k]=m;}}}T::~T(){deletep;deletepxj;deletek;deletemz;}voidT::Coutpxj(){pxj[0]=0;for(inti=1;in;i++){pxj[i]=0;for(intj=0;ji;j++)pxj[i]+=p[j];}}voidT::Coutk(){for(inti=0;in;i++){doubled=(-1)*(log(p[i])/log(2));if(d-(int)d0)k[i]=(int)d+1;elsek[i]=(int)d;}}voidT::Print(){coutXisetw(8)P(xi)setw(8)Pa(xj)setw(8)Kisetw(8)码字endl;for(inti=0;in;i++){coutXi+1setw(8)setprecision(2)p[i]setw(8)setprecision(2)pxj[i]setw(8)k[i];mz[i]=pxj[i];for(intj=0;jk[i];j++){if(2*mz[i]-1=0){cout1;mz[i]=2*mz[i]-1;}else{cout0;mz[i]=2*mz[i];}}coutendl;}doubleK=0.0,H=0.0,Y;for(i=0;in;i++){K+=(double)p[i]*k[i];H+=(-1)*p[i]*(log10(p[i])/log10(2.0));}Y=H/K;cout平均码长:Kendl;cout信源熵:Hendl;cout编码效率:Yendl;}voidmain(){Tt;inte;try{t.Create();t.Coutpxj();t.Coutk();t.Print();}catch(inte){if(e==1)cout输入错误,请重新运行;}}六.心得体会在本次的课程设计中,我感觉最大的难题就是对C语言编程的运用不够熟练,但是通过相应的复习,我还是收获很多,并把握住了一些基本知识点,最后经过不断尝试编写程序,还是较好的完成了本模块的设计。对于香农编码而言,主要是弄清楚各个步骤,像求码长、累加和、概率排序,每个模块建立一个函数,使得程序简单易读,自己的思路也更清晰明了。编码的原理我们都很清楚,主要就是在一些C和C++基本知识上的巩固才能做好这次的实验。
本文标题:香农编码课程设计报告
链接地址:https://www.777doc.com/doc-4903646 .html