费诺编码课程设计报告书
- 格式:doc
- 大小:268.00 KB
- 文档页数:17
费诺编码课程设计一、课程目标知识目标:1. 理解费诺编码的基本原理和数学背景;2. 掌握费诺编码的算法步骤,能够运用编码方法进行简单信息编码;3. 了解费诺编码在实际通信系统中的应用及其优势。
技能目标:1. 能够运用费诺编码对文字、图像等不同类型的信息进行编码;2. 培养学生的逻辑思维能力和问题解决能力,通过团队合作完成费诺编码的实际操作;3. 提高学生的信息处理能力,学会在信息传输过程中优化编码,提高通信效率。
情感态度价值观目标:1. 培养学生对信息科学的兴趣,激发他们探索通信领域奥秘的热情;2. 引导学生认识信息编码在国家安全、科技进步和社会发展中的重要作用,增强他们的责任感和使命感;3. 培养学生的团队协作精神,使他们学会在合作中解决问题,共同成长。
课程性质:本课程为信息技术与通信原理相结合的实践课程,旨在帮助学生掌握费诺编码的理论知识,培养实际操作能力。
学生特点:六年级学生具备一定的数学基础和逻辑思维能力,对新鲜事物充满好奇心,善于合作与交流。
教学要求:结合学生特点,注重理论与实践相结合,通过任务驱动、分组合作等教学策略,提高学生的学习兴趣和实际操作能力。
在教学过程中,关注学生的个体差异,引导他们主动探究、积极思考,培养解决问题的能力。
将课程目标分解为具体的学习成果,以便在教学设计和评估中达到预期效果。
二、教学内容1. 费诺编码原理:- 线性代数基础知识:向量空间、线性变换;- 编码理论基本概念:编码、解码、错误纠正;- 费诺编码基本原理:费诺不等式、最小距离、编码效率。
2. 费诺编码算法:- 编码算法步骤:生成矩阵、编码过程;- 解码算法步骤:伴随矩阵、纠错能力;- 实例分析:具体案例展示费诺编码的编码与解码过程。
3. 费诺编码应用:- 数字通信系统中的应用:提高通信效率、降低误码率;- 现实生活中的应用案例:光纤通信、卫星通信等;- 编码优化:针对不同场景选择合适的编码方案。
4. 实践操作:- 软件工具使用:介绍相关软件工具,如Matlab等;- 编码与解码实践:分组进行费诺编码的实际操作,包括编码、解码及性能分析;- 团队协作:分组完成任务,培养学生的合作精神和沟通能力。
费诺编码1 课题描述费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率达,编码效率高,但它属于概率匹配编码它不是最佳的编码方法。
本文通过采用递归的思想进行费诺编码,求得了每个字符的二进制码字。
并且对编码后的平均码长,以及编码的传输效率进行了求解。
符合费诺编码的要求,并且得到了预期的编码结果。
费诺编码在电子计算机、电视、遥控和通讯等方面广泛使用。
其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用C语言实现费诺编码。
关键字:信息论,费诺编码,C语言2 信源编码的相关介绍信源编码分为无失真信源编码和限失真信源编码。
一般称无失真信源编码为第一机械定理;限失真信源编码定理称为第三极限定理。
由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。
具体说,就是针对信源输出符号序列的统计特性,寻找一定的方法把信源输出符号序列变换为最短码字序列的方法。
信源编码的基本途径有两个:使编码中各个符号出现的概率尽可能地相等,即概率均匀化。
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。
其中无失真编码定理是可逆编码的基础。
可逆是指当信源符号转换成代码后,可从代码无失真地恢复信源符号。
当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载有的信息量。
编码定理不但证明了必定存在一种编码方法,可使代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,就是使概率与码长匹配。
无失真编码或可逆编码只适用于离散信源。
对于连续信源,编成代码后就无法无失真地恢复原来的连续值,因为后者的取值可有无限多个。
此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。
信源编码定理出现后,编码方法就趋于合理化。
凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。
能获得最佳码的编码方法主要有:香农码(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。
实验名称:实验五费诺编码一、实验目的:加深对费诺编码的理解及其具体的实现过程二、实验内容与原理:1.完成费诺的编码2.计算平均码长及编码效率三、实验步骤根据费诺编码的步骤完成该编码四、实验数据及结果分析(可附程序运行截图)编码的结果:五、代码附录clc;clear;A=[0.4,0.3,0.1,0.09,0.07,0.04];A=fliplr(sort(A));%降序排列[m,n]=size(A);for i=1:nB(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1))/2;for k=1:n-1if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a) break;endendfor i=1:n%生成B第2列的元素if i<=kB(i,2)=0;elseB(i,2)=1;endend%生成第一次编码的结果END=B(:,2)';END=sym(END);%生成第3列及以后几列的各元素j=3;while (j~=0)p=1;while(p<=n)x=B(p,j-1);for q=p:nif x==-1break;elseif B(q,j-1)==xy=1;continue;elsey=0;break;endendendif y==1q=q+1;endif q==p|q-p==1B(p,j)=-1;elseif q-p==2B(p,j)=0;END(p)=[char(END(p)),'0'];B(q-1,j)=1;END(q-1)=[char(END(q-1)),'1'];elsea=sum(B(p:q-1,1))/2;for k=p:q-2if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a);break;endendfor i=p:q-1if i<=kB(i,j)=0;END(i)=[char(END(i)),'0'];elseB(i,j)=1;END(i)=[char(END(i)),'1'];endendendendp=q;endC=B(:,j);D=find(C==-1);[e,f]=size(D);if e==nj=0;elsej=j+1;endendBAENDfor i=1:n[u,v]=size(char(END(i)));L(i)=v;endavlen=sum(L.*A)六、其他:实验总结、心得体会及对本实验方法、手段及过程的改进建议等。
西华数学与计算机学院上机实践报告课程名称:信息与编码理论年级:2007级上机实践成绩:指导教师:李月卉姓名:何龙上机实践日期:2010.5.20上机实践名称:费诺编码学号:312007*********上机实践编号:2上机实践时间:14:30-15:50一、目的通过上机实践,实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。
二、内容与设计思想1)充分掌握信源编码方案之一的费诺编码算法设计;2)以教材例题为算例,将该算法用代码实现;3)以至少2组算例验证程序;4)理解,总结费诺编码算法。
三、使用环境实验室PC 标准配置,winXP,matlab/C/C++/Frotran 等四、核心代码及调试过程核心代码:void fano(float p[],int a[N][N],int n,int m,int k){float g=0.0,h=0.0,d,b,c;int i,j,flase;if(n<m){for(i=n;i<=m;i++){g=p[i]+g;} g=g/2;for(i=n;i<=m;i++){h=h+p[i];if(h>g){d=h-p[i];b=h-g;c=g-d;if(c>b){for(j=n;j<=i;j++) a[j][k]=0;fano(p,a,n,i,k+1);for(j=i+1;j<=m;j++) a[j][k]=1;fano(p,a,i+1,m,k+1);}else{for(j=n;j<=i-1;j++) a[j][k]=0;fano(p,a,n,i-1,k+1);for(j=i;j<=m;j++) a[j][k]=1;fano(p,a,i,m,k+1);}break;}}}}调试过程:(1)当输入信源符号个数为:3输入各信源符号概率分别为:0.2 0.3 0.5时(2)当输入信源符号个数为:3输入各信源符号概率分别为:0.3 0.3 0.3时(3)当输入信源符号个数为:4输入各信源符号概率分别为:0.1 0.2 0.3 0.4 时(4)当输入信源符号个数为:4输入各信源符号概率分别为:0.25 0.25 0.25 0.25 时五、总结费诺码编码方法不是唯一。
一、实验名称:山农—范诺编码二、实验环境软件环境:Windows 2000,Microsoft Visual C++6.0硬件环境:P4,2.4GHz,256内存,IBM-PC及兼容机三、实验目的掌握山农—范诺编码、译码原理,并能够通过程序模拟山农—范诺编码、译码功能。
四、实验原理1、首先把消息按概率不同由大到小的次序重新排列;2、把这个概率序列分成尽可能相等的两组,对每一组又同样分成概率尽可能相等的两组,如此下去,直至每个消息都被分出来为止;3、在每一次划分中,所有第一组的消息均以符号0表示,而第二组的消息则以1表示。
五、实验过程与实验结果源程序:#include<math.h>#include<iostream>#include<string>using namespace std;static int Message_Num=0;typedef struct Message{char Message_Char;//消息字符名称double P;//消息字符对应的概率double Sum_P;//消息字符对应的累加概率string Code_Str;//消息字符对应的码字double Code_Length;//消息字符对应的码长}Message,* Message_P;//数据定义Message_P * Message_Source;/**********************初始化模块**********************///对输入的字符进行检验int Input_Char_Check(){int flag=1;int j;for(int i=0;i<Message_Num-1&&flag;i++){for(j=i+1;j<Message_Num;j++)if(Message_Source[j]->Message_Char==Message_Source[i]->Message_Char) {flag=0;break;}}return flag;}//对输入的概率进行检测int Input_P_Check(){int flag=1;for(int i=0;i<Message_Num;i++){if(!(Message_Source[i]->P>0&&Message_Source[i]->P<1))//概率越界{flag=0;break;}}return flag;}//初始化void Init_Message_Source(){Message_Source=new Message_P[];/*一个信源可以包含多个字符,由于每个字符用一个结构体描述,故信源则需用结构体数组来描述*/Message_P temp;I: double n=0;//n<=1int flag_n=1;if(Message_Num){//若Message_Num非零则将其置为零Message_Num=0;}cout<<"请输入信源发出的消息字符及相应概率(各字符与概率之间用空格隔开):"<<endl;do{temp=new Message;cin>>temp->Message_Char>>temp->P;n+=temp->P;//概率累加if(n>1){flag_n=0;break;}temp->Sum_P=0.0;temp->Code_Length=0;temp->Code_Str="";Message_Source[Message_Num]=temp;Message_Num++;//消息字符数加1}while(n<1);if(!flag_n){cout<<"概率之和超过1,输入错误,请重新输入!"<<endl;goto I;}int flag1=Input_Char_Check();//检测输入的字符是否重复int flag2=Input_P_Check();//检测输入的概率是否越界if(!flag1&&flag2){cout<<"出现相同字符,输入错误,请重新输入!"<<endl;goto I;}if(!flag2&&flag1){cout<<"概率越界,输入错误,请重新输入!"<<endl;goto I;}if(!flag1&&!flag2){cout<<"出现相同字符且概率越界,输入错误,请重新输入!"<<endl;goto I;}}/**********************山农—范诺最佳编码模块**********************/ //要进行编码,首先根据各消息的概率由大到小排序void Bubble_Message(){Message_P temp;for(int i=0;i<Message_Num-1;i++)for(int j=i+1;j<Message_Num;j++)if(Message_Source[i]->P<Message_Source[j]->P){temp=Message_Source[i];Message_Source[i]=Message_Source[j];Message_Source[j]=temp;}}//局部概率累加函数void Sum_P_Function(int start,int end){Message_Source[start]->Sum_P=Message_Source[start]->P;for(int i=start+1;i<=end;i++)Message_Source[i]->Sum_P=Message_Source[i]->P+Message_Source[i-1]->Su m_P;}//根据待分组的各消息的累加概率,找出分组边界int Find_Boundary(int start,int end){ /*思路:找出与(待分组的所有消息的概率和的一半最接近的)累加概率相对应的编号*/int boundary;double tag=Message_Source[end]->Sum_P/2;for(int i=start;i<=end;i++)/*为避免浪费存储空间,可直接用Message_Source[i]->Sum_P存放Message_Source[i]->Sum_P-tag的差的绝对值*/Message_Source[i]->Sum_P=(double)fabs(Message_Source[i]->Sum_P-tag);//找出Message_Source[i]->Sum_P的最小者的下标boundary=start;for(int j=start+1;j<=end;j++)if(Message_Source[j]->Sum_P<Message_Source[boundary]->Sum_P) boundary=j;return boundary;}//对所给消息进行编码void Set_Code(int start,int end){int boundary;Bubble_Message();//由已知概率求累加概率Sum_P_Function(start,end);//找出分组边界boundary=Find_Boundary(start,end);for(int i=start;i<=boundary;i++)//上半组编码为0Message_Source[i]->Code_Str+="0";for(int j=boundary+1;j<=end;j++)//下半组编码为1Message_Source[j]->Code_Str+="1";for(int m=start;m<=end;m++)Message_Source[m]->Code_Length+=1;//此次分组中的各消息码长加1 if(start!=boundary)//上半组包含一个以上消息,仍需进一步分组编码Set_Code(start,boundary);//递归实现对上半组进一步分组编码if(boundary+1!=end)//下半组包含一个以上消息,仍需进一步分组编码Set_Code(boundary+1,end);//递归实现对下半组进一步分组编码}/**********************编码效率分析模块**********************///求平均编码长度double Ave_Code_Length(){double Ave_L=0.0;for(int i=0;i<Message_Num;i++)Ave_L+=Message_Source[i]->Code_Length*Message_Source[i]->P;return Ave_L;}//求信源熵double To_Get_H(){double H=0.0;for(int i=0;i<Message_Num;i++)H+=-1*Message_Source[i]->P*log(Message_Source[i]->P)/log(2);return H;}//求编码效率double To_Get_Code_Efficiency(){double H2,H,Ave_L;H=To_Get_H();Ave_L=Ave_Code_Length();H2=H/Ave_L;return H2;}//分析结果输出void Output(){double H2,H,Ave_L;H=To_Get_H();Ave_L=Ave_Code_Length();H2=To_Get_Code_Efficiency();cout<<"山农—范诺编码结果如下:(消息字符——码长——码字)"<<endl;for(int i=0;i<Message_Num;i++)cout<<Message_Source[i]->Message_Char<<"——>"<<Message_Source[i]->Code_Length<<"——>"<<Message_Source[i]->Code_Str<<endl;cout<<"平均编码长度Ave_L=L1*p1+L2*p2+...+Ln*pn="<<Ave_L<<"(码元/消息)"<<endl;cout<<"信源熵H=-(p1*log(p1)+p2*log(p2)+...+pn*log(pn))/log(2)="<<H<<"(bit/消息)"<<endl;cout<<"码元熵H2=H/Ave_L="<<H2<<"(bit/码元)"<<endl;cout<<"编码效率E=(H2/H2max)*100%="<<H2*100<<"%"<<endl;}/**********************编码模块**********************///字符合理性检测int Message_Str_Check(string temp){int flag=1;//先假设输入的消息串不含非法字符int j;for(int i=0;temp[i]!='\0';i++){for(j=0;j<Message_Num;j++){if(temp[i]==Message_Source[j]->Message_Char)break;}if(j==Message_Num)//表示出现非法字符{flag=0;break;}}return flag;}//获取信源发出的消息字符并整合成字符串string Get_Message_Source_str(){int i;string Message_Source_str="";for(i=0;i<Message_Num;i++){Message_Source_str+=Message_Source[i]->Message_Char;}return Message_Source_str;}//获取待编码消息串string Get_Message_Str(){string temp;int flag;string Message_Source_str=Get_Message_Source_str();A: cout<<"输入待编码的消息串(只含"<<Message_Source_str<<"):\n";cin>>temp;flag=Message_Str_Check(temp);if(flag==0)//输入的消息串含非法字符{cout<<"输入的消息串含非法字符,请重新输入!"<<endl;goto A;}return temp;}//对输入的消息串进行编码string Get_All_Code_Str(string Message_Str){string All_Code_Str="";int j;for(int i=0;Message_Str[i]!='\0';i++)for(j=0;j<Message_Num;j++){if(Message_Str[i]==Message_Source[j]->Message_Char){All_Code_Str+=Message_Source[j]->Code_Str;break;}}return All_Code_Str;}//输出得到的二进制序列void Output_All_Code_Str(string All_Code_Str){cout<<"该消息串对应的编码序列如下:"<<endl;cout<<All_Code_Str<<endl;}//编码void Encoding(){string Message_Str,All_Code_Str;Message_Str=Get_Message_Str();All_Code_Str=Get_All_Code_Str(Message_Str);Output_All_Code_Str(All_Code_Str);}/**********************译码模块**********************///检测输入的二进制序列是否含有非法字符int Binary_Str_Check(string temp){int flag=1;//假设不含非法字符for(int i=0;temp[i]!='\0';i++){if(!(temp[i]=='0'||temp[i]=='1')){flag=0;break;}}return flag;}//获取待译的二进制序列string Get_Binary_Str(){string temp;int flag;B: cout<<"输入待译的二进制序列:\n";cin>>temp;flag=Binary_Str_Check(temp);if(flag==0)//输入的二进制序列含非法字符{cout<<"输入的二进制序列含非法字符,请重新输入!"<<endl;goto B;}return temp;}//获取源码string Get_Original_Message_Str(string Binary_Str,int *flag){string temp="";*flag=1;string Original_Message_Str="";int j;for(int i=0;Binary_Str[i]!='\0';i++){temp+=Binary_Str[i];for(j=0;j<Message_Num;j++){if(Message_Source[j]->Code_Str==temp){Original_Message_Str+=Message_Source[j]->Message_Char;temp="";//重置tempbreak;}}}if(temp!=""){cout<<"您输入的二进制序列不可译,请重新输入!"<<endl;*flag=0;}return Original_Message_Str;}//输出得到的源码void Output_Original_Message_Str(string Original_Message_Str){cout<<"该二进制序列对应的源码如下:"<<endl;cout<<Original_Message_Str<<endl;}//译码void Decoding(){int flag;string Binary_Str,Original_Message_Str;D: Binary_Str=Get_Binary_Str();Original_Message_Str=Get_Original_Message_Str(Binary_Str,&flag);if(!flag)goto D;Output_Original_Message_Str(Original_Message_Str);}/**********************主函数**********************/void main(){char choice=' ';int flag=0;cout<<"\n";while(choice!='4'){C: cout<<" "<<"*************************山农—范诺编码/译码器*************************\n";cout<<" "<<"1.初始化"<<" "<<"2.编码"<<" "<<"3.译码"<<" "<<"4.退出\n";cout<<"请输入您要操作的步骤:";cin>>choice;if(choice=='1'){if(!flag){//初次执行初始化操作flag=1;}//信源初始化Init_Message_Source();//获取消息字符码字Set_Code(0,Message_Num-1);//效率分析结果输出Output();}else if(choice=='2'){if(!flag){cout<<"操作错误!请执行初始化操作后再进行本操作!"<<endl;goto C;}//编码Encoding();}else if(choice=='3'){if(!flag){cout<<"操作错误!请执行初始化操作后再进行本操作!"<<endl;goto C;}//译码Decoding();}else if(choice=='4'){exit(0);//退出}else//如果选了选项之外的就让用户重新选择{cout<<"您没有输入正确的步骤,请重新输入!"<<endl;}cout<<endl;}}运行结果:1、输入消息及相应概率,建立编码/译码系统,并对此系统作出评价计算机科学与工程系2、编码:输入的消息字符串中应只含信源能够发出的几个字符,否则,报错3、译码:注意区分可译序列和不可译序列4、退出系统11。
一设计目的信息论与编码是我们电子信息工程的一门重要的专业课,通过对本次课程设计,学习将学到的理论知识用于实践,同时也学习了用软件编写程序,进一步对本课程知识的巩固和理解。
学习分析问题,解决问题的方法和途径,提高对本专业的学习兴趣。
二设计任务与要求(1)统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。
(2)哈夫曼编码要求:任意输入消息概率,利用哈夫曼编码方法进行编码,并计算信源熵和编码效率。
三理论简介3.1通信系统的模型通信系统的模型通信系统的性能指标主要是有效性、可靠性、安全性和经济性,通信系统优化就是使这些指标达到最佳,除了经济性,这些指标正是信息论的研究对象,可以通过各种编码处理来使通信系统的性能最优化。
根据信息论的各种编码定理和上述通信系统的指标,编码问题可以分为3类:信源编码、信道编码和加密编码。
3.1.1 信源编码由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余度,提高编码效率。
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。
前者适用于离散信源或数字信号;后者主要用于连续信源或模拟信号。
本次课程设计就是利用的无失真信源编码。
3.1.2 信道编码信源编码器的作用:把信源发出的消息变换成由二进制码元(或多进制码元)组成的代码组,这种代码组就是基带信号。
同时通过信源编码可以压缩信源的冗余度,以提高通信系统传输消息的效率。
信源译码器的作用:把信道译码器输出的代码组变换成信宿所需要的消息形式,它的作用相当于信源编码器的逆过程。
3.1.3 加密编码加密编码是研究如何隐蔽消息中的信息内容,以便在传输过程中不被窃听,提高通信系统的安全性。
3.2 信源熵3.2.1 信源的描述和分类& 按信源在时间和幅度上的分布情况离散信源:文字、数据、电报连续信源:语音、图像& 按发出符号的数量单个符号信源:指信源每次只发出一个符号代表一个消息符号序列信源:指信源每次发出一组含二个以上符号的符号序列代表一个消息 & 按符号间的关系无记忆信源有记忆信源3.2.2 离散信源熵& 自信息量:随机事件的自信息量定义为其概率对数的负值,即在信息论中常用的对数底是2,信息量的单位为比特(bit);& 联合自信息量两个消息xi ,yj 同时出现的联合自信息量:& 条件自信息量在事件yj 出现的条件下,随机事件xi 发生的条件概率为p(xi / yj) ,则它的条件自信息量定义为条件概率对数的负值:& 离散信源熵为信源中各个符号不确定度的数学期望,即单位为:比特/符号 或者 比特/符号序列。
课程设计---费诺编码和自适应算术编码信息论课程设计信息论课程设计课题名称:四元费诺编码自适应算术编码专业班级:任课教师:姓名:学号:完成时间:2012-12合肥工业大学计算机与信息学院第 1 页信息论课程设计四元费诺编码1.问题描述费诺编码方法属于概率匹配编码。
这种编码方法不是最佳的编码方法,但有时也可得到最佳码的性能。
设计一个程序对输入的一个字符串实现费诺编码。
2.基本要求书本上大多讲解的二元的费诺编码,但是多元的费诺编码也能实现。
请设计程序用以对输入字符串实现4元费诺编码,并且设计译码函数使满足根据编码的结果,输入任意的4进制数字串能够正确唯一的译码,最后计算编码效率。
3.二元费诺编码基本原理首先,将信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号。
依次下去,直至每一个小组只剩下一个信源符号为止。
这样,信源符号所对应的码符号序列则为编得的码字。
译码原理,按照编码的二叉树从树根开始,按译码序列进行逐个的向其叶子结点走,直到找到相应的信源符号为止。
之后再把指示标记回调到树根,按照同样的方式进行下一序列的译码到序列结束。
如果整个译码序列能够完整的译出则返回成功,否则则返回译码失败。
编码方法:1.将信源消息符号按其出现的概率大小依次排列。
2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
4.如此重复,直至每个组只剩下一个信源符号为止。
5.信源符号所对应的码字即为费诺码。
4.费诺编码特点费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率达,合肥工业大学计算机与信息学院第 2 页信息论课程设计编码效率高,但它属于概率匹配编码它不是最佳的编码方法。
实验二Huffman编码一实验目的1 通过本实验实现信源编码——Huffman编码2 编写M文件实现,掌握Huffman编码方法二实验要求1 了解matlab中M文件的编辑、调试过程2 编写程序实现Huffman编码算法三实验步骤1 输入Huffman编码程序2 运行程序,按照提示输入相应信息,并记录输入信息,及运行结果。
注:观察结果方法:data(1).Code显示a1的编码,同理显示data(2).Code,a2的编码结果。
3 思考:该程序编出的Huffman码是否是最小码方差的码?为什么?四报告要求五附Huffman编码程序clearN=input('请输入信源符号的个数:') ;for i=1:N%data(1).name=input('请输入各信源符号的名称:');data(i).p=input('请输入各信源符号发生的概率:');endfor i=1:Npp(i)=data(i).p;data(i).imap=i; %各符号在编码过程中的指针data(i).Code=''; %各符号的编码结果endfor j = 1:N % N——信源符号的个数for i = 1:N - jif (pp(i) > pp(i + 1))fT = pp(i);pp(i) = pp(i + 1);pp(i + 1) = fT;for k = 1:Nif data(k).imap == idata(k).imap = i + 1;elseif data(k).imap == i + 1data(k).imap = i;endendendendendp=pp;%%%%%%%%%%%%%%%%%%%%% %// 计算哈夫曼编码表%// 开始编码for i=1:N-1for k = 1:Nif data(k).imap== idata(k).Code = strcat('1',data(k).Code);elseif (data(k).imap== i + 1)data(k).Code = strcat('0',data(k).Code);endendp(i + 1) = p(i + 1)+p(i);for k = 1:Nif (data(k).imap == i)data(k).imap = i + 1;endendfor j = i + 1:N-1if p(j) >p(j + 1)fT =p(j);p(j) = p(j + 1);p(j + 1) = fT;for k = 1:Nif (data(k).imap == j)data(k).imap = j + 1;elseif (data(k).imap == j + 1)data(k).imap = j;endendendendend。
编码规范实验报告模板1. 引言编码规范是一种规范化和标准化的实践,旨在提高代码的可读性、可维护性、可测试性和可扩展性。
通过遵循编码规范,可以使团队成员在编写和维护代码时更加高效和一致。
本实验旨在研究编码规范的重要性和使用编码规范所带来的好处。
2. 实验目的本实验的主要目的如下:1. 研究编码规范的定义和特点。
2. 探讨编码规范遵循对软件开发的影响。
3. 了解并使用一种编码规范工具进行实践。
3. 实验过程3.1 学习编码规范的定义和特点首先,我们对编码规范的定义进行了学习和讨论。
编码规范是针对特定编程语言或开发平台的一套编码规则和约定。
它可以包括代码格式、命名规则、注释规范、代码结构等方面的规范。
编码规范的特点包括:- 一致性:通过统一的编码规范,使所有开发人员的代码风格一致,降低了阅读和理解代码的难度。
- 可读性:编码规范强调代码的可读性,使代码更易于理解和维护。
- 可维护性:遵循编码规范可以减少代码中的冗余、重复和错误,提高代码的可维护性。
- 可测试性:编码规范鼓励编写可测试的代码,使测试更容易进行和有效。
3.2 研究编码规范对软件开发的影响为了深入研究编码规范的影响,我们进行了一系列的讨论和实践。
我们比较了遵循编码规范和不遵循编码规范的代码,并分析了它们在可读性、可维护性和可测试性方面的差异。
结果表明,遵循编码规范的代码更易于阅读和理解,减少了开发人员之间的沟通成本。
同时,它们更易于维护和修改,减少了错误发生的概率。
此外,遵循编码规范的代码更容易进行单元测试和集成测试,提高了软件的质量和稳定性。
3.3 使用编码规范工具进行实践为了更好地使用编码规范,我们选择了一个常用的代码检查工具来帮助我们遵循编码规范。
我们使用了工具在我们的代码库中进行了静态检查,并修复了一些违反编码规范的问题。
通过使用编码规范工具,我们发现它可以帮助我们自动检测潜在的问题,并提供建议和修复方案。
这大大提高了我们的工作效率,并保证了代码的一致性和可读性。
信息论编码实验报告费诺编码附源代码信息论与编码实验报告选题: 费诺编码学生姓名:学号:专业班级: 通信工程指导老师:学院: 信息科学与工程学院时间: 2015一、实验目的二、实验原理2.1 费诺编码思想2.2 费诺编码流程图三、实验内容四、实验要求五、代码调试结果六、心得体会七、程序源代码一实验目的1. 掌握费诺编码的原理和过程。
2. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。
二、实验原理2.1 费诺编码思想设有离散无记忆信源nxx.....x,,12n,p(x),1,i,,p(x)p(x).....p(x)i,112n,, 1.按信源符号的概率从大到小的顺序排队p(x),p(x),......,p(x)12n不妨设2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
4.如此重复,直至每个组只剩下一个信源符号为止。
5.信源符号所对应的码字即为费诺码。
例:有一单符号离散无记忆信源1Xxxxxxx,,,,23456,,,,,()0.320.220.180.160.080.04PX,,,, 对该信源编二进制费诺码H(X),2.35(bit/sign)KR,logm2LH(x),,,97.92%R6K,p(x)k,2.4(比特/符号),iii,1 2.2 费诺编码流程图输入字符串序列直接输入打开文件概率计算及排序进行编码显示结果字信出编信符字平码概码源现码串符均源符次效长个码字率长号数率熵度数长三、实验内容使用C\C++实现费诺编码,并自己设计测试案例。
四、实验要求1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。
3.认真撰写实验报告,内容可以自己编排,可以考虑包括以下一些方面:原理概述、程序设计与算法描述、源程序及注释(程序太长可以只选取重要部分)、运行输出结果实例、调试和运行程序过程中产生的问题及采取的措施、对实验的讨论分析、总结。
建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:费诺编码专业班级学生:学号:指导教师:设计时间: 2014.11.24-2014.12.5第1章概述1.1设计的作用、目的《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。
其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。
通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。
1.2设计任务及要求1.理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2.根据费诺编码算法,考虑一个有多种可能符号(各种符号发生的概率不同)的信源,得到费诺编码;3.掌握费诺编码的优缺点;4.能够使用MATLAB或其他语言进行编程,编写的函数要有通用性,要理解每个函数的具体意义和适用围,对主要函数的功能和参数做详细说明。
1.3设计容费诺编码属于概率匹配编码,但不是最佳的编码方法。
在编N进制码时首先将信源消息符号按其出现的概率依次由小到大排列开来,并将排列好的信源符号按概率值分N大组,使N组的概率之和近似相同,并对各组赋予一个N进制码元0、1……N-1。
之后再针对每一大组的信源符号做如上的处理,即再分为概率和相同的N组,赋予N进制码元。
如此重复,直至每组只剩下一个信源符号为止。
此时每个信源符号所对应的码字即为费诺码。
针对同一信源,费诺码要比香农码的平均码长小,消息传输速率大,编码效率高。
一个有8个符号的信源X,各个符号出现的概率为:X P(X)X1, X2, X3, X4, X5, X6, X7, X80.19, 0.18, 0.17, 0.16, 0.13, 0.10, 0.06, 0.01进行费诺编码,并计算平均码长、编码效率、冗余度。
第2章费诺编码2.1设计原理1.编码与信源编码在学过信息论与编码以后,对这方面容已有了基础的了解。
为了进行更深入的了解,我查阅了很多资料,我认为通信的根本问题是如何将信源输出的信息在接收端的信宿精确地或近似地复制出来,而这最重要的一步就是信源的编码,一个好的开端才能为以后的传输及接受、解码提供有利得条件。
而我也对各种信源编码方式产生了浓厚的兴趣。
1.1首先要了解什么是信源编码为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对信源输出的符号序列所施行的变换。
具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列[8]。
既然信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在减少剩余度而对信源输出符号序列所施行的变换或处理,都可以在这种意义下归入信源编码的畴,例如过滤、预测、域变换和数据压缩等。
一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:①使序列中的各个符号尽可能地互相独立;②使序列中各个符号的出现概率尽可能地相等。
前者称为解除相关性,后者称为概率均匀化。
在通信过程中,如何在不失真或允许一定失真条件下,用尽可能少的符号来传送信源信息,提高信息传输率;在信道受干扰的情况下,如何增加信号的抗干扰能力,同时又使得信息传输率最大。
这就产生了多种信源编码方式[2]。
为了有效传播信息,最理想状态即为无失真传输。
在无失真信源编码中又分为定长编码、变长编码机最佳变长编码。
1.1.1定长编码在定长编码中,K是定值,编码的目的即为找到最小的K值。
要实现无失真的信源编码,不但要求信源符号与码字是一一对应的,而且还要求有码字组成的码符号序列的逆变换也是唯一的。
由定长编码定理可知,当编码器容许的输出信息率,也就是当每个信源符号必须输出的码长是K=Kl/logm。
由定理表明,只要码字所能携带的信息量大于信源序列输出的信息量,则可以使传输几乎无失真,但是条件是L足够大。
这就为传输带来了很大的麻烦,并且实现起来很困难,并且编码效率也不高。
而要达到编码效率接近1的理想编码器虽有存在性,但在实际上时不可能的,因为L非常大,无法实现。
由此而产生了变长编码。
1.1.2变长编码在变长编码中,码长K是变化的,可根据信源各个符号的统计特性,对概率大的符号用短码,而对概率小的符号用长码。
这样大量信源符号编成码后,平均每个信源符号所需的输出符号数就可以降低,从而提高编码效率。
用变长编码来达到相当高的编码效率,一般所要求的符号长度L可以比定长编码小得多的多。
很明显,定长码需要的信源序列长,这使得码表很大,且总存在译码差错。
而变长码要求编码效率达到96%时,只需L=2.因此用变长码编码时,L不需要很大就可达到相当高的编码效率,而且可实现无失真编码。
并且随着信源序列长度的增加,编码效率越来越接近于1,编码后的信息传输率R也越来越接近于无噪无损二元对称信道的信道容量C=1bit/二元码符号,达到信源与信道匹配,使信道得到充分利用。
但变长编码方式也有优劣的区分,下面就讨论几种不同的变长编码方式[1]。
1、香农编码方法香农第一定理指出了平均码长与信源之间的关系,同时也指出了可疑通过编码使平均码长达到极限值,这是一个很重要的极限定理。
香农第一定理指出,选择每个码字的长度Ki满足下式:I(xi)<Ki<I(xi)+1就可以得到这种码。
编码方式如下:首先将信源消息符号按其出现的概率大小依次从大到小排列,为了编成唯一可译码,计算第i个消息的累加概率P=∑p(a),并将累加概率Pi变换成二进制数。
最后去Pi二进制数的小数点后Ki位提取出,即为给出符号的二进制码字。
由此可见香农编码法冗余度稍大,实用性不强,但他是依据编码定理而来,因此具有重要的理论意义。
1.2费诺编码方法费诺编码属于概率匹配编码,但不是最佳的编码方法。
在编N进制码时首先将信源消息符号按其出现的概率依次由小到大排列开来,并将排列好的信源符号按概率值分N大组,使N组的概率之和近似相同,并对各组赋予一个N进制码元0、1……N-1。
之后再针对每一大组的信源符号做如上的处理,即再分为概率和相同的N组,赋予N进制码元。
如此重复,直至每组只剩下一个信源符号为止。
此时每个信源符号所对应的码字即为费诺码。
针对同一信源,费诺码要比香农码的平均码长小,消息传输速率大,编码效率高。
1.3哈夫曼编码方法编码方法:也是先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值顺序固定),再将这两个概率想家作为一个新字母的概率,与未分配的二进制符号的字母重新排队。
并不断重复这一过程,直到最后两个符号配以0和1为止。
最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为相应的码字。
哈夫曼编码方式得到的码并非唯一的。
在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减信源中的排序将会导致不同码字,但不同的排序将影响码字的长度,一般将合并的概率放在上面,这样可获得较小的码方差。
哈夫曼码的平均码长最小,消息传输效率最大,编码效率最高。
鉴于以上编码的特点与我所掌握的知识下面我将着重介绍费诺编码。
2. 费诺编码的描述费诺编码是一种信源编码.信源编码分为无失真信源编码和限失真信源编码。
一般称无失真信源编码为第一机械定理;限失真信源编码定理称为第三极限定理。
由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。
具体说,就是针对信源输出符号序列的统计特性,寻找一定的方法把信源输出符号序列变换为最短码字序列的方法。
信源编码的基本途径有两个:使编码中各个符号出现的概率尽可能地相等,即概率均匀化。
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。
其中无失真编码定理是可逆编码的基础。
可逆是指当信源符号转换成代码后,可从代码无失真地恢复信源符号。
当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载有的信息量。
编码定理不但证明了必定存在一种编码方法,可使代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,就是使概率与码长匹配。
无失真编码或可逆编码只适用于离散信源。
对于连续信源,编成代码后就无法无失真地恢复原来的连续值,因为后者的取值可有无限多个。
此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。
信源编码定理出现后,编码方法就趋于合理化。
凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。
能获得最佳码的编码方法主要有:香农码(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。
3. 费诺编码步骤1.将信源消息符号按其出现的概率大小依次排列:P1>=P2>=…>=Pn。
2.依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
3.使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
4.如此重复,直至每个组只剩下一个信源符号为止。
5.信源符号所对应的码字即为费诺码。
4. 费诺编码特点费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率大,编码效率高,但它属于概率匹配编码它不是最佳的编码方法[1]。
费诺编码方法属于概率匹配编码,具有如下特点:1、概率大,则分解次数小;概率小则分解次数多。
这符合最佳码原则。
2、码字集合是唯一的。
3、分解完了,码字出来了,码长也有了,即先有码字后有码长。
因此,费诺编码方法又称为子集分解法。
2.2设计步骤1.费诺编码过程框图图1费诺码编码过程图2.费诺编码过程表表1费诺码编码过程表3. 计算平均码长、编码效率、冗余度。
符号码元平均码长:/85.2)(K 81i ==∑=i i K a p码元传输速率:/bit 916.085.261.2)(R ===KX H 0.916=η编码效率:4. 冗余度在数据传输中,由于衰减或干扰会使数据代码发生突变,此时就要提高数据代码的抗干扰能力.这必须在原二进制代码长度的基础上增加几位二进制代码的长度,使相应数据具有一定的冗余度,也称做富裕度.简单地说,所谓冗余度,就是从安全角度考虑多余的一个量,这个量就是为了保障仪器、设备或某项工作在非正常情况下也能正常运转。
目前大多现代产品和工程设计中都应用了冗余度这个思想和理论。