信息论编码实验报告-费诺编码附源代码
信息论编码实验报告 费诺编码附源代码
中南大学信息论与编码实验报告选题:费诺编码学生姓名:学号:专业班级:通信工程指导老师:学院:信息科学与工程学院时间: 2015目录一、实验目的二、实验原理2.1 费诺编码思想2.2 费诺编码流程图三、实验内容四、实验要求五、代码调试结果六、心得体会七、程序源代码一实验目的1. 掌握费诺编码的原理和过程。
2. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。
二、实验原理2.1 费诺编码思想设有离散无记忆信源∑==⎥⎦⎤⎢⎣⎡ni i n n x p x p x p x p x x x 121211)(,)(.....)()(.....1.按信源符号的概率从大到小的顺序排队 不妨设)(......)()(21n x p x p x p ≥≥≥2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
4.如此重复,直至每个组只剩下一个信源符号为止。
5.信源符号所对应的码字即为费诺码。
例:有一单符号离散无记忆信源⎭⎬⎫⎩⎨⎧=⎥⎦⎤⎢⎣⎡04.008.016.018.022.032.0)(654321x x x x x x X P X对该信源编二进制费诺码)i /(35.2)(gn s bit X H = m L KR 2log =%92.97)(==R x H η∑===61)/(4.2)(i i i k x p K 符号比特2.2 费诺编码流程图三、实验内容使用C\C++实现费诺编码,并自己设计测试案例。
四、实验要求1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。
3.认真撰写实验报告,内容可以自己编排,可以考虑包括以下一些方面:原理概述、程序设计与算法描述、源程序及注释(程序太长可以只选取重要部分)、运行输出结果实例、调试和运行程序过程中产生的问题及采取的措施、对实验的讨论分析、总结。
实验五_费诺编码
实验名称:实验五费诺编码一、实验目的:加深对费诺编码的理解及其具体的实现过程二、实验内容与原理: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)六、其他:实验总结、心得体会及对本实验方法、手段及过程的改进建议等。
信息论与编码实验2-实验报告
信息论与编码实验2-实验报告信息论与编码实验 2 实验报告一、实验目的本次信息论与编码实验 2 的主要目的是深入理解和应用信息论与编码的相关知识,通过实际操作和数据分析,进一步掌握信源编码和信道编码的原理及方法,提高对信息传输效率和可靠性的认识。
二、实验原理(一)信源编码信源编码的目的是减少信源输出符号序列中的冗余度,提高符号的平均信息量。
常见的信源编码方法有香农编码、哈夫曼编码等。
香农编码的基本思想是根据符号出现的概率来分配码字长度,概率越大,码字越短。
哈夫曼编码则通过构建一棵最优二叉树,为出现概率较高的符号分配较短的编码,从而实现平均码长的最小化。
(二)信道编码信道编码用于增加信息传输的可靠性,通过在发送的信息中添加冗余信息,使得在接收端能够检测和纠正传输过程中产生的错误。
常见的信道编码有线性分组码,如汉明码等。
三、实验内容与步骤(一)信源编码实验1、选取一组具有不同概率分布的信源符号,例如:A(02)、B (03)、C(01)、D(04)。
2、分别使用香农编码和哈夫曼编码对信源符号进行编码。
3、计算两种编码方法的平均码长,并与信源熵进行比较。
(二)信道编码实验1、选择一种线性分组码,如(7,4)汉明码。
2、生成一组随机的信息位。
3、对信息位进行编码,得到编码后的码字。
4、在码字中引入随机错误。
5、进行错误检测和纠正,并计算错误纠正的成功率。
四、实验结果与分析(一)信源编码结果1、香农编码的码字为:A(010)、B(001)、C(100)、D (000)。
平均码长为 22 比特,信源熵约为 184 比特,平均码长略大于信源熵。
2、哈夫曼编码的码字为:A(10)、B(01)、C(111)、D (00)。
平均码长为 19 比特,更接近信源熵,编码效率更高。
(二)信道编码结果在引入一定数量的错误后,(7,4)汉明码能够成功检测并纠正大部分错误,错误纠正成功率较高,表明其在提高信息传输可靠性方面具有较好的性能。
信息论与编码实验报告
信息论与编码实验报告一、实验目的本实验主要目的是通过实验验证信息论与编码理论的基本原理,了解信息的产生、传输和编码的基本过程,深入理解信源、信道和编码的关系,以及各种编码技术的应用。
二、实验设备及原理实验设备:计算机、编码器、解码器、信道模拟器、信噪比计算器等。
实验原理:信息论是由香农提出的一种研究信息传输与数据压缩问题的数学理论。
信源产生的消息通常是具有统计规律的,信道是传送消息的媒体,编码是将消息转换成信号的过程。
根据信息论的基本原理,信息的度量单位是比特(bit),一个比特可以表示两个平等可能的事件。
信源的熵(Entropy)是用来衡量信源产生的信息量大小的物理量,熵越大,信息量就越多。
信道容量是用来衡量信道传输信息的极限容量,即信道的最高传输速率,单位是比特/秒。
编码是为了提高信道的利用率,减少传输时间,提高传输质量等目的而进行的一种信号转换过程。
常见的编码技术有霍夫曼编码、香农-费诺编码、区块编码等。
三、实验步骤1.运行编码器和解码器软件,设置信源信息,编码器将信源信息进行编码,生成信道输入信号。
2.设置信道模拟器的信道参数,模拟信道传输过程。
3.将信道输出信号输入到解码器,解码器将信道输出信号进行解码,恢复信源信息。
4.计算信道容量和实际传输速率,比较两者的差异。
5.改变信道参数和编码方式,观察对实际传输速率的影响。
四、实验结果与分析通过实验,我们可以得到不同信道及编码方式下的信息传输速率,根据信道参数和编码方式的不同,传输速率有时会接近信道容量,有时会低于信道容量。
这是因为在真实的传输过程中,存在信噪比、传输距离等因素导致的误码率,从而降低了实际传输速率。
在实验中,我们还可以观察到不同编码方式对传输速率的影响。
例如,霍夫曼编码适用于信源概率分布不均匀的情况,可以实现数据压缩,提高传输效率。
而区块编码适用于数据容量较大的情况,可以分块传输,降低传输错误率。
此外,通过实验我们还可以了解到信息论中的一些重要概念,如信源熵、信道容量等。
中南大学信息论与编码编码部分实验报告
信息论与编码编码部分实验报告课程名称:信息论与编码实验名称:关于香农码费诺码Huffman码的实验学院:信息科学与工程学院班级:电子信息工程1201姓名:viga学号:指导老师:张祖平日期:2014年1月3日目录⊙实验目的及要求1.1 实验目的 (4)1.2 开发工具及环境 (4)1.3 需求分析与功能说明 (4)⊙实验设计过程2.1 用matlab实现香农码、费诺码和Huffman编码2.1.1 说明 (6)2.1.2 源代码 (7)2.1.3 运行结果(截图) (19)2.2 用C\C++ 实现香农码2.2.1 说明 (22)2.2.2 源代码 (23)2.2.3 运行结果(截图) (26)2.3 用C\C++ 实现Huffman码2.3.1 说明 (26)2.3.2 源代码 (29)2.3.3 运行结果(截图) (36)2.4 用C\C++ 实现费诺码2.4.1 说明 (37)2.4.2 源代码 (37)2.4.3运行结果结果(截图) (40)⊙课程设计总结 (42)⊙参考资料4.1 课程设计指导书 (43)实验目的及要求1.1 实验目的1.掌握香农码、费诺码和Huffman编码原理和过程。
2.熟悉matlab软件的基本操作,练习使用matlab实现香农码、费诺码和Huffman编码。
3.熟悉C/C++语言,练习使用C/C++实现香农码、费诺码和Huffman编码。
4.应用Huffman编码实现文件的压缩和解压缩。
1.2 开发工具及环境MATLAB 7.0、wps文字、红精灵抓图精灵2010Windows7 系统环境1.3 需求分析与功能说明1、使用matlab实现香农码、费诺码和Huffman编码,并自己设计测试案例。
2、使用C\C++实现香农码、费诺码和Huffman编码,并自己设计测试案例。
3、可以用任何开发工具和开发语言,尝试实现Huffman编码应用在数据文件的压缩和解压缩中,并自己设计测试案例。
信息论与编码--费诺编码与哈弗曼编码比较
信源编码的比较——哈弗曼编码与费诺编码姓名:班级:学号:一、实验目的:1、实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。
2、课程实验主要为设计性实验,要求掌握Matlab使用方法。
3、通过信源编译码,理解信源编码的主要目的,掌握信源编码的方法和手段,掌握费诺编码和霍夫曼编码方法二、实验设备:装有matlab的计算机三、实验原理:信源编码主要可分为无失真信源编码和限失真信源编码。
无失真信源编码主要适用于离散信源或数字信号,如文本、表格及工程图纸等信源,它们要求进行无失真地数据压缩,要求完全能够无失真地可逆恢复。
香农码、费诺码、哈夫曼码都考虑了信源的统计特性,使经常出现的信源符号对应较短的码字,使信源的平均码长缩短,从而实现了对信源的压缩。
费诺码比较适合于对分组概率相等或接近的信源编码。
哈夫曼码对信源的统计特性没有特殊要求,编码效率比较高,对编码设备的要求也比较简单,因此综合性能优于香农码和费诺码。
(1)费诺码属于概率匹配编码,编码过程如下:1、将信源发出的N个消息符号按其概率的递减次序依次排列。
2、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制码就分成m组)。
3、将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1”4、如此重复,直至每组值只剩下一个信源符号为止5、信源符号所对应的码符号序列即为费诺码(2)霍夫曼编码过程:1、将信源发出的N个消息符号按其概率的递减次序依次排列。
2、取概率最小的两个符号分别配以0和1两个码元,并将这两个符号的概率相加作为一个新概率,与未分配码元的符号重新按概率排队3、对重排后的两个概率最小符号重复步骤24、不断重复上述过程,直到最后两个符号配以0和1为止5、重最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
信息论与编码理论课程实验报告
二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)
设备:PC机
软件:matlab 2007
0.0055 0.0115 0.0061 0.0176 0
构建信源模型如下:
h i j k l m n
0.0267 0.0672 0.0042 0.0030 0.0521 0.0212 0.0733
o p q r s t u
0.0842 0.0254 0.0048 0.0648 0.0933 0.0739 0.0327
9.实验报告独立完成,无抄袭现象,并按时提交,格式规范。
综合评定:
附录(程序源代码)
1.编写MATLAB程序
clc
clear all
%随机输入一组数据
string='abdddssdsssdabaabaddkkidkidkdiakdjjaidjaid';
%将上述中所有英文字母化为小写
string=lower(string);
自评/互评成绩:100(评阅者签名:熊萌萌)
2、教师评价
评价标准
评语等级
优
良
中
及格
不合格
1.实验态度认真,实验目的明确
2.实验方案或流程图思路清晰、合理
3.实验程序设计合理,能运行
4.实验步骤记录详细,具备可读性
5.实验数据合理
6.实验结论正确
7.实验总结分析合理、透彻
8.实验报告完整、文字叙述流畅,逻辑性强
信息论与编码实验报告
#include<iostream>#include<string>#include<instdio.h>using namespace std;typedef struct{int weight;int flag;int parent;int lchild;int rchild;}hnodetype;typedef struct{int bit[10];int start;char leaf;}hcodetype;void huf(char cha[],int m[],int n){int i,j,m1,m2,x1,x2,c,p;hnodetype *huffnode=new hnodetype[2*n-1];hcodetype *huffcode=new hcodetype[n],cd;for(i=0;i<2*n-1;i++){ //初始化哈夫曼树 huffnode[i].weight=0;huffnode[i].parent=0;huffnode[i].flag=0;huffnode[i].lchild=-1;huffnode[i].rchild=-1;}for(i=0;i<n;i++){ //哈夫曼结点赋初值 huffnode[i].weight=m[i];huffcode[i].leaf=cha[i];}for(i=0;i<n-1;i++){ //对结点进行编码m1=m2=10000000;x1=x2=0;for(j=0;j<n+i;j++){if(huffnode[j].weight<=m1&&huffnode[j].flag==0) {m2=m1;x2=x1;m1=huffnode[j].weight;x1=j;}else if(huffnode[j].weight<=m2&&huffnode[j].flag==0){m2=huffnode[j].weight;x2=j;}}huffnode[x1].parent=n+i;huffnode[x2].parent=n+i;huffnode[x1].flag=1;huffnode[x2].flag=1;huffnode[n+i].weight=huffnode[x1].weight+huffnode[x2].weight; huffnode[n+i].lchild=x1;huffnode[n+i].rchild=x2;}for(i=0;i<n;i++){ //生成哈夫曼树cd.start=n-1;c=i;p=huffnode[c].parent;while(p!=0){if(huffnode[p].lchild==c)cd.bit[cd.start]=0;elsecd.bit[cd.start]=1;cd.start--;c=p;p=huffnode[c].parent;}cout<<huffcode[i].leaf<<":";for(j=cd.start+1;j<n;j++){huffcode[i].bit[j]=cd.bit[j];cout<<cd.bit[j];}cout<<endl;huffcode[i].start=cd.start;}delete[] huffcode;delete[] huffnode;}void main(){int i=0;// int m[10]={30,23,10,10,9,8,7,3};char cha[10]="abcdefgh";float f;int m[10];printf("请输入概率的小数点后两位值");for(i=0,i<10,i++)scanf("%d",&a[i]);cout<<"该字符串为:\t";for (i=0;i<strlen(cha);i++){ cout<<cha[i]<<"\t"; }cout<<"字符加权为:\t";for (i=0;i<strlen(cha);i++){f=(float)m[i]/100;cout<<f<<"\t";}cout<<"各字符的哈夫曼码为:"<<endl;i=strlen(cha);huf(cha,m,i);}求信息量的流程图:开始获取离散信息源参数P(X)和P(Y/X)计算联合概率P(xiyj)=P(xi)*P(yj/xi)计算P(yj)及后验概率P(xi/yj)=P(xiyj)/P(yj)根据定义求信源熵H(X)和H(Y)根据定义求条件熵H(X/Y)和H(Y/X)根据定义求联合熵H(XY)求交互熵I(X;Y)=H(X)+H(Y)-H(XY)输出已知条件、信源熵、条件熵、联合熵和交互熵求信道容量C(不会)求信息量关键代码:float pX[2]={0.5,0.5},pY_X[2][2]={{0.98,0.02},{0.2,0.8}}; float pXY[2][2],pY[2],pX_Y[2][2];float hX,hY,hXY=0.0,hY_X=0.0,hX_Y=0.0;float iXY=0.0,iYX=0.0;int i,j;//计算联合概率for(i=0;i<2;i++)for(j=0;j<2;j++)pXY[i][j]=pX[i]*pY_X[i][j];//计算Y的概率for(i=0;i<2;i++)pY[i]=pXY[0][i]+pXY[1][i];//计算X的后验概率for(i=0;i<2;i++)for(j=0;j<2;j++)pX_Y[j][i]=pXY[i][j]/pY[j];//求信源熵hX=-(pX[0]*(log(pX[0])/log(2))+pX[1]*(log(pX[1])/log(2))); cout<<"信源熵H(X)="<<hX<<endl;hY=-(pY[0]*(log(pY[0])/log(2))+pY[1]*(log(pY[1])/log(2))); cout<<"信源熵H(Y)="<<hY<<endl;//求条件熵for(i=0;i<2;i++)for(j=0;j<2;j++)hY_X+=-(pXY[i][j]*log(pY_X[i][j])/log(2));cout<<"条件熵H(Y/X)="<<hY_X<<endl;for(i=0;i<2;i++)for(j=0;j<2;j++)hX_Y+=-(pXY[i][j]*log(pX_Y[j][i])/log(2));cout<<"条件熵H(X/Y)="<<hX_Y<<endl;//求联合熵for(i=0;i<2;i++)for(j=0;j<2;j++)hXY+=-(pXY[i][j]*log(pXY[i][j])/log(2));cout<<"联合熵H(XY)="<<hXY<<endl;//交互熵iXY=hX+hY-hXY;cout<<"交互熵I(X;Y)=I(Y;X)="<<iXY<<endl;float beta[2],C; //求信道容量香农编码流程图:开始输入符号个数N和相应概率X[i]按概率由大到小排序按公式求码长求出对应位的概率累加和按乘2取余法则,将累加概率转换为二进制结合求得的对应码长,将二进制的累加概率取对应长度的作为相应码字输出信源、概率、累加概率、码长和码字结束香农编码关键源代码:int main(){int N;cout<<"请输入信源符号个数:";cin>>N;cout<<"请输入各符号的概率:"<<endl;double *X=new double[N]; //离散无记忆信源int i,j;for(i=0;i<N;i++){cout<<"X["<<i+1<<"]="; cin>>X[i];}//由大到小排序for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)if(X[i]<X[j]){ double temp=X[i];X[i]=X[j];X[j]=temp; }int *K=new int[N]; //确定码长for(i=0;i<N;i++){K[i]=int(-(log(X[i])/log(2)))+1; //默认码长为1-log2(p(xi))if(K[i]==(-(log(X[i])/log(2))+1)) //当K[i]=-log2(p(xi))时,K[i]--K[i]--;}//累加概率double *Pa=new double[N]; Pa[0]=0.0;for(i=1;i<N;i++)Pa[i]=Pa[i-1]+X[i-1];//将累加概率转换为二进制string *code=new string[N];for(i=0;i<N;i++)for(j=0;j<N;j++) //这里默认最大码长不超过信源符号个数{double temp=Pa[i]*2;if(temp>=1) //累加概率乘2大于1时,对应码字加1,累加概率自身取余{code[i]+="1"; Pa[i]=Pa[i]*2-1;}else //累加概率乘2小于1时,对应码字加0,累加概率自身取余{code[i]+="0"; Pa[i]*=2;}}for(i=0;i<N;i++)code[i]=code[i].substr(0,K[i]); //求码字//输出码字cout<<setw(12)<<"信源"<<setw(12)<<"概率p(x)"<<setw(12)<<"累加概率Pa(x)"<<setw(8)<<"码长K"<<setw(8)<<"码字"<<endl;for(i=0;i<N;i++)cout<<setw(12)<<i+1<<setw(12)<<X[i]<<setw(12)<<Pa[i]<<setw(8)<<K[i]<<setw(8)<<co de[i]<<endl;delete []X; delete []Pa; delete []K; delete []code;return 0;}香农编码测试结果截图:求信息量实验结果截图:费诺编码流程图:输入信源符号个数n 、信源符号sign 及对应的概率p按概率从大到小排列,对应的符号也重新排列信源个数大于2?通过求累加和确定分组后每组概率累加和尽可能相近或相等。
信息论与编码课程实验报告
福建农林大学计算机与信息学院信息工程类信息论与编码课程实验报告实验项目列表实验名称1:信源建模一、实验目的和要求(1)进一步熟悉信源建模;(2)掌握MATLAB程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。
二、实验内容(1)假设在一个通信过程中主要传递的对象以数字文本的方式呈现。
(2)我们用统计的方式,发现这八个消息分别是由N1,N2,…,N8个符号组成的。
在这些消息是中出现了以下符号(符号1,符号2,…,符号M)每个符号总共现了(次数1,次数2,…,次数M)我们认为,传递对象的信源模型可表示为:X为随机变量(即每次一个字符);取值空间为:(符号1,符号2,…,符号M);其概率分布列为:(次数1/(N1+…+N8),…,次数M/( N1+…+N8))三、实验环境硬件:计算机软件:MATLAB四、实验原理图像和语声是最常用的两类主要信源。
要充分描述一幅活动的立体彩色图像,须用一个四元的随机矢量场X(x,y,z,t),其中x,y,z为空间坐标;t 为时间坐标;而X是六维矢量,即表示左、右眼的亮度、色度和饱和度。
然而通常的黑白电视信号是对平面图像经过线性扫描而形成。
这样,上述四元随机矢量场可简化为一个随机过程X(t)。
图像信源的最主要客观统计特性是信源的幅度概率分布、自相关函数或功率谱。
关于图像信源的幅度概率分布,虽然人们已经作了大量的统计和分析,但尚未得出比较一致的结论。
至于图像的自相关函数,实验证明它大体上遵从负指数型分布。
其指数的衰减速度完全取决于图像类型与图像的细节结构。
实际上,由于信源的信号处理往往是在频域上进行,这时可以通过傅里叶变换将信源的自相关函数转换为功率谱密度。
功率谱密度也可以直接测试。
语声信号一般也可以用一个随机过程X(t)来表示。
语声信源的统计特性主要有语声的幅度概率分布、自相关函数、语声平均功率谱以及语声共振峰频率分布等。
实验结果表明语声的幅度概率分布可用伽玛(γ)分布或拉普拉斯分布来近似。
信息论与编码实验报告材料
本科生实验报告-实验课程信息理论与编码学院名称信息科学与技术学院专业名称学生姓名学生学号/指导教师实验地点实验成绩;二〇一六年九月----二〇一六年十一月填写说明1、适用于本科生所有的实验报告(印制实验报告册除外);2、专业填写为专业全称,有专业方向的用小括号标明;3、@4、格式要求:①用A4纸双面打印(封面双面打印)或在A4大小纸上用蓝黑色水笔书写。
②打印排版:正文用宋体小四号,倍行距,页边距采取默认形式(上下,左右,页眉,页脚)。
字符间距为默认值(缩放100%,间距:标准);页码用小五号字底端居中。
③具体要求:题目(二号黑体居中);;摘要(“摘要”二字用小二号黑体居中,隔行书写摘要的文字部分,小4号宋体);关键词(隔行顶格书写“关键词”三字,提炼3-5个关键词,用分号隔开,小4号黑体);正文部分采用三级标题;第1章××(小二号黑体居中,段前行)×××××小三号黑体×××××(段前、段后行)¥小四号黑体(段前、段后行)参考文献(黑体小二号居中,段前行),参考文献用五号宋体,参照《参考文献著录规则(GB/T 7714-2005)》。
实验一:香农(Shannon )编码一、实验目的掌握通过计算机实现香农编码的方法。
二、实验要求对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
三、实验基本原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码1.将信源消息符号按其出现的概率大小排列)()()(21n x p x p x p ≥≥≥2.确定满足下列不等式的整数码长K i ;1)(log )(log 22+-<≤-i i i x p K x p3.为了编成唯一可译码,计算第i 个消息的累加概率∑-==11)(i k k i x p p4.将累加概率P i 变换成二进制数。
信息论 实验五 费诺编码
实验五 费诺编码一、实验目的:掌握费诺编码的方法二、实验内容:对信源123456,,,,,()0.250.250.020.150.10.05a a a a a a X P X ⎧⎫⎛⎫=⎨⎬ ⎪⎝⎭⎩⎭进行二进制费诺编码。
并计算其平均码长,编码效率。
三、实验步骤(1)将概率按从大到小的顺序排列,不失一般性,令12()()......()n P a P a P a ≥≥ (2)按编码进制数将概率分组,使每组概率和尽可能接近或相等。
(3)给每组分配一位码元。
(4)将每一分组再按同样原则划分,重复步骤2和3,直至概率不再可分为止。
四、实验数据及结果分析(1)将信源符号按概率从大到小的顺序排列。
P=(0.25 0.250.2 0.15 0.1 0.05);(2)输出每个灰度级的编码第1个编码为:00第2个编码为:01第3个编码为:10第4个编码为:110第5个编码为:1110第6个编码为:1111(3)计算其平均码长和编码效率平均码长 L=2.4500编码效率 xiaolv=0.9891(4)运行截图如下所示:图一运行及结果五、代码附录N=input('N=');%输入信源符号的个数L=0; H=0; s=0;for i=1:NP(i)=input('P=');%输入信源符号概率分布s=s+P(i);endif s~=1error('不符合概率分布');endP=sort(P,'descend');for i=1:N %对N个概率逐一编码x=i; j=1; now_P=P;while 1[next_P,num,next_x]=compare(now_P,x);x=next_x;now_P=next_P;W(i,j)=num;j=j+1;if(length(now_P)==1)break;endendl(i)=j-1;L=L+P(i)*l(i); %计算平均码长H=H-P(i)*log2(P(i));%计算信源熵endxiaolv=H/L; %计算编码效率disp('输出每个灰度级的编码');for i=1:Nfprintf('第%d个编码为:',i);for j=1:l(i)fprintf('%d',W(i,j));endfprintf('\n');enddisp('输出平均码长L:');disp(L);disp('输出编码效率xiaolv:');disp(xiaolv);%自定义compare函数function [next_P,num,next_x]=compare(P,x) %P为某一组概率,x是概率值下标N=length(P);Pa(1)=P(1);for i=2:N %求概率的依次累加和Pa(i)=Pa(i-1)+P(i);endS=Pa(N);for i=1:Ntemp(i)=abs(S-2*Pa(i));end[c,k]=min(temp);%返回最小元素所在的位置if x<=knext_x=x;num=0;next_P=P(1:k);elsenext_x=x-k;num=1;next_P=P((k+1):N);end六,实验总结:通过该实验,掌握了费诺编码。
信 息 论 实 习 报 告
信息论实习报告一、香农编码1. 程序设计题目:对某一个信源Y用香农编码编成二元变长唯一可译码。
例如:取信源Y=(y0,y1,y2,y3,y4,y5,y6,y7,y8).相应的概率为P=(0.49,0.14,0.14,0.07,0.07,0.04,0.02,0.02,0.01)。
2. 程序设计方法:第一步:按概率从大到小的顺序输出信源Y。
第二步:利用公式Li=「-㏒p(yi)」(「」取上整)确定码长。
第三步:为编成唯一可译码求p(yi)的累加概率P[i]。
第四步:把P[i]化为二进制数,乘2取整。
第五步:根据码长Li确定第四步中for循环的次数,最终得到码字。
3. 程序的设计中遇到的问题及解决办法:本程序设计最关键在于码长公式的C语言编码实现和如何在编程中实现小数向二进制数的转换。
在一开始意识到-㏒p(yi)= -㏒p(yi)/ ㏒(2)的问题后,我在编程中首先遇到的问题是如何取整的问题。
一开始因为对C语言编程的不熟悉在这句代码中没有对int加括号。
4. 程序中的主要函数:(1)主函数main().且香农编码的实现比较简单所以没有用到子函数。
(2)求码长的编程实现:(3)利用累加概率P[i]求的码字的编程实现:5. 流程图:6. 源程序如下:7.运行结果截图:二、费诺码1.程序设计题目:对某一个信源X用香农编码编成二元变长唯一可译码。
例如:取信源X=(x0,x1,x2,x3,x4,x5,x6,x7,x8).相应的概率为P=(0.14, 0.49, 0.07, 0.04, 0.14,0.02, 0.07,0.02,0.01)。
2. 程序设计方法:第一步:将信源X发出的n个消息符号按其概率的递减次序依次排列。
第二步:将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制码就分成m组)。
第三步:将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1”第四步:如此重复,直至每组值只剩下一个信源符号为止第五步:信源符号所对应的码符号序列即为费诺码3. 程序的设计中遇到的问题及解决办法:在进行费诺编码的过程中首先遇到的问题是如何进行分组,利用变量i从的值把信源符号分为两组,前i个信源符号序列为一组进行概率求和s1,剩下的信源符号为一组进行概率求和s2。
信源编码实验报告
电子科技大学实验报告课程名称信息论与编码实验名称信源编码任课教师姓名学号时间2018 年11月28 日一、实验目的和要求1.掌握对信源变长编码定理的理解;2.掌握信源编码技术,如香农编码,费诺编码,哈夫曼编码或其他无失真信源编码技术;3.对英文小说“Game of Thrones”中出现的26个英文字母和空格符号(一共27个符号)进行信源编码。
4.至少对前两章“Prologue”和“Bran”中出现的符号进行统计。
5.任意选择一种编程平台,C++,Java,Python,Matlab等等。
6.运行程序后,能够在屏幕上显示每一个符号对应的码字,原始信源的熵,平均码字长度,码字长度的方差,以及编码效率。
二、 实验内容1. 对英文小说“Game of Thrones ”中出现的26个英文字母和空格符号(一共27个符号)进行信源编码。
2. 在屏幕上显示每一个符号对应的码字,原始信源的熵,平均码字长度,码字长度的方差,以及编码效率。
三、 实验原理1. 采用哈夫曼编码完成实验要求2.哈夫曼(Haveman )编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。
算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。
这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。
这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。
从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。
离散无记忆信源:例如Uu 1u 2u 3u 4u 5P (U ) = 0.4 0.2 0.2 0.1 0.1通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼码。
四、实验步骤1.主函数为sourcecoding,用fopen打开text文本,并用fread读取文本,得到ASCII码向量seq;2.利用自己编写statistic.m函数统计seq向量中出现的符号和概率,并通过处理得到所需向量seq2. statistic函数采用了对seq处理的三种形式。
信息论与编码实验报告
信息论与编码实验报告一、实验目的信息论与编码是一门涉及信息的度量、传输和处理的学科,通过实验,旨在深入理解信息论的基本概念和编码原理,掌握常见的编码方法及其性能评估,提高对信息处理和通信系统的分析与设计能力。
二、实验原理(一)信息论基础信息熵是信息论中用于度量信息量的重要概念。
对于一个离散随机变量 X,其概率分布为 P(X) ={p(x1), p(x2),, p(xn)},则信息熵H(X) 的定义为:H(X) =∑p(xi)log2(p(xi))。
(二)编码原理1、无失真信源编码:通过去除信源中的冗余信息,实现用尽可能少的比特数来表示信源符号,常见的方法有香农编码、哈夫曼编码等。
2、有噪信道编码:为了提高信息在有噪声信道中传输的可靠性,通过添加冗余信息进行纠错编码,如线性分组码、卷积码等。
三、实验内容及步骤(一)信息熵的计算1、生成一个离散信源,例如信源符号集为{A, B, C, D},对应的概率分布为{02, 03, 01, 04}。
2、根据信息熵的定义,使用编程语言计算该信源的信息熵。
(二)香农编码1、按照香农编码的步骤,首先计算信源符号的概率,并根据概率计算每个符号的编码长度。
2、确定编码值,生成香农编码表。
(三)哈夫曼编码1、构建哈夫曼树,根据信源符号的概率确定树的结构。
2、为每个信源符号分配编码,生成哈夫曼编码表。
(四)线性分组码1、选择一种线性分组码,如(7, 4)汉明码。
2、生成编码矩阵,对输入信息进行编码。
3、在接收端进行纠错译码。
四、实验结果与分析(一)信息熵计算结果对于上述生成的离散信源,计算得到的信息熵约为 184 比特/符号。
这表明该信源存在一定的不确定性,需要一定的信息量来准确描述。
(二)香农编码结果香农编码表如下:|信源符号|概率|编码长度|编码值|||||||A|02|232|00||B|03|174|10||C|01|332|110||D|04|132|111|香农编码的平均码长较长,编码效率相对较低。
实验三 费诺编码
实验三、费诺编码实验目的掌握费诺编码方法,加深理解实验环境C语言读文件写文件实验内容设有一离散信源,概率分布P(x)保存在一文件中,实现对文件的读取,并根据P(x)给出对应的费诺编码,将结果保存在另一文件中。
源代码实验结果实验总结源代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>static char p[7][7];static int flag1=0;static int ncount1;void main(){void Fano(int m,int n,float y[7]);int i,j,ncount=6;float temp,s=0.0,code_length=0.0, a[7];//float a[7];//={0,0.05,0.1,0.15,0.2,0.25,0.25};FILE *fp1,*fp2;if((fp1=fopen("H:\\study\\C++\\file\\dufeinuo.txt","r"))==NULL){printf("不能打开文件!\n");exit(1);}if(!(fp2=fopen("H:\\study\\C++\\file\\xiefeinuo.txt","w"))) {printf("不能打开文件!\n");exit(1);}for(i=0;i<=ncount;i++)fscanf(fp1,"%f",&a[i]);fseek(fp1,0,2);printf("按从大到小排序后的数组:\n");fprintf(fp2,"按从大到小排序后的数组:\n");for(i=1;i<ncount;i++)for(j=i+1;j<ncount+1;j++)if(a[i]<a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}for(i=1;i<ncount+1;i++){ printf("a[%d]=%.2f ",i,a[i]);fprintf(fp2,"a[%d]=%.2f ",i,a[i]);}Fano(1,ncount,a);printf("\n\n费诺编码是:\n\n");printf("概率为\t\t费诺编码\t编码长度\n\n");fprintf(fp2,"\n\n费诺编码是:\n\n");fprintf(fp2,"概率为\t\t费诺编码\t编码长度\n\n");for(i=1;i<ncount+1;i++){printf(" %.2f\t\t",a[i]);printf("%s",p[i]);printf(" \t\t %d\n",strlen(p[i]));fprintf(fp2," %.2f\t\t",a[i]);fprintf(fp2,"%s",p[i]);fprintf(fp2," \t\t %d\n",strlen(p[i]));code_length=code_length+strlen(p[i]);}printf("\n 平均编码长度K=%.3f \n",code_length/ncount);printf("\n");fprintf(fp2,"\n 平均编码长度K=%.3f \n",code_length/ncount);fprintf(fp2,"\n");fclose(fp1);fclose(fp2);}void Fano(int m,int n,float y[7]){int j,k;float sum=0.0,s=0.0,s1,z[7];flag1++;if(flag1==1)ncount1=n;if(m==n) {return;}for(j=1;j<ncount1+1;j++)z[j]=y[j];for(j=m;j<=n;j++)sum=sum+z[j];k=m;do{s1=s;s=s+y[k++];}while(s<=sum-s);if((sum-2*s1)<=(2*s-sum)) k--;for(j=m;j<k;j++)strcat(p[j],"0");for(j=k;j<=n;j++)strcat(p[j],"1");Fano(m,k-1,y);Fano(k,n,y);}测试结果:Dufeinuo.Txt:0 0.05 0.1 0.15 0.2 0.25 0.25Xiefeinuo.txt:按从大到小排序后的数组:a[1]=0.25 a[2]=0.25 a[3]=0.20 a[4]=0.15 a[5]=0.10 a[6]=0.05 费诺编码是:概率为费诺编码编码长度0.25 00 20.25 01 20.20 10 20.15 110 30.10 1110 40.05 1111 4平均编码长度K=2.833。
实验三 费诺编码
第 N=input('输入信源符号 的个数:'); s=0; l=0; H=0; for i=1:N fprintf('第%d 个',i); p(i)=input('p='); if (p(i)<=0)||(p(i)>=1) error('不符合分布概率'); end s=s+p(i); H=H+(- p(i)*log2(p(i))); end if (s<=0.999999||s>=1.000001) error('不符合分布概率') end for i=1:N-1 for j=i+1:N if p(i)<p(j) m=p(j); p(j)=p(i); p(i)=m; end end end x=f1(1,N,p,1); for i=1:N L(i)=length(find(x(i,:))); l=l+p(i)*L(i); end n=H/l; fprintf(' 按 概 率 降 序 排 列 的 码 子:\n'); disp(x) fprintf('平均码长:\n'); disp(l) fprintf('编码效率:\n'); disp(n) function x=f1(i,j,p,r) global x; x=char(x); if(j<=i) return; else q=0; for t=i:j q=p(t)+q; y(t)=q; end for t=i:j v(t)=abs(y(t)-(q-y(t))); end for t=i:j if(v(t)==min(v)) for k=i:t x(k,r)='0'; end for k=(t+1):j x(k,r)='1'; end d=t; f1(i,d,p,r+1); f2(d+1,j,p,r+1); f1(d+1,j,p,r+1); f2(i,d,p,r+1); else end end end return; function x=f2(i,j,p,r) global x; x=char(x); if(j<=i) return; else q=0; for t=i:j q=p(t)+q;y(t-i+1)=q; end for t=1:j-(i-1) v(t)=abs(y(t)-(q-y(t))); end for t=1:j-(i-1) if(v(t)==min(v)) d=t+i-1;
信息论实验报告2信源编码
function [W,L,q]=shannon(p)
if (length(find(p<=0)) ~=0)
error('Not a prob.vector,negative component'); end
if (abs(sum(p)-1)>10e-10)
error('Not a prob.vector,component do not add up to 1'); end
n=length(P); %计算输入元素个数
p=P; mark=zeros(n-1,n);
% mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序
% 1)确定概率大小值的排列,得到mark矩阵。
for i=1:n-1
[p,num]=sort(p); mark(i,:)=[num(1:n-i+1),zeros(1,i-1)];
s2='Shannon编码平均码字长度L:'; s3='Shannon编码的编码效率q:';
disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);
function H=entropy(P,r)
if (length(find(P<=0))~=0) %判断是否符合概率分布条件
[c,k]=min(temp);
if (current_index<=k)
next_index=current_index; code_num=48;
next_P=current_P(1:k);
else
费诺编码代码说明
信息论与编码上机作业二进制Fano编码姓名:学号:班级:一、题目要求已知:信源符号个数q、信源符号s0,...,sq−1、信源概率分布p0,...,pq−1。
算法:(a) 将q 个信源符号按其概率递减排序:p0 ≥p1 ≥... ≥pq−1(b) 将依次排列的信源符号依概率分为两组,使两组的概率和之差最小。
并对各组分别赋予二进制码符号“0” 和“1”。
(c) 将每一组的信源符号进一步再分成两组,使划分后的两个组的概率和之差最小。
再次分别赋予各组二进制码符号“0” 和“1”。
(d) 如此重复,直至每组只剩下一个信源符号为止。
(e) 信源符号si 所对应的从左至右的码符号序列即为码字wi。
要求:(a) 输入:信源符号个数q,信源概率分布p0,...,pq−1。
(b) 输出:信源符号si 与码字wi 的对应关系表(编码表)。
二、 程序运行流程N三、费诺编码流程图四、运行结果正确结果:错误提示:五、代码及注释1.#include<stdio.h>2.#include<string.h>3.#include<stdlib.h>4.#include<math.h>5.6.int num1; //费诺编码中使用的信源符号个数7.char code[50][50];//费诺编码8.int flag1=0;//是否已经编码9.10.void main()11.{12.int num;//信源符号个数13.float p[50];//信源符号的概率14.float sum=0.0;//概率之和15.float temp;//排序所使用的中间变量16.int i,j;17.int flag=0;//是否已经输入完毕概率18.int err1=0,err2=0;//错误类型19.void err(int e1, int e2);//错误函数20.void fano(int m,int n,float p[50]);//费诺编码21.22. printf("\n---------------费诺编码----------------\n\n输入信源符号个数和概率可以得到费诺编码。
费诺编码实验报告
费诺编码实验报告引言费诺编码(Huffman Coding)是一种常用的数据压缩算法,广泛应用于各类数据传输和存储场景中。
本实验旨在通过实际编码和解码的过程,加深对费诺编码算法原理的理解,并探究其在数据压缩中的优势。
实验步骤1. 构建字符频率统计表:从待压缩的文本文件中读取字符,并统计每个字符出现的频率。
将字符及其频率记录在字符频率统计表中。
2. 构建哈夫曼树:将字符频率统计表中的记录作为树节点,以频率最小的两个节点作为子节点构建哈夫曼树。
将新生成的节点插入树中,并重新调整节点顺序。
重复上述过程,直到只剩下一个节点,即为哈夫曼树根节点。
3. 生成编码表:从哈夫曼树根节点开始,按照编码规则,递归生成每个字符的编码。
将字符及其对应的编码记录在编码表中。
4. 编码:根据编码表将待压缩的文本文件中的字符转换成对应的编码。
将编码后的二进制数据保存在新的文件中。
5. 解码:根据哈夫曼树和编码表,将编码后的二进制数据转换回原始的字符数据。
将解码后的字符保存在新的文件中。
实验结果在实验中,我们使用了一篇大小为1MB的文本文件进行测试。
以下是实验结果的统计数据:- 待压缩文件大小:1MB- 压缩后文件大小:743KB- 压缩比:0.743实验分析通过实验结果可以看出,费诺编码在压缩数据方面具有显著的优势。
通过对字符频率的统计,费诺编码根据字符出现的频率分配不同长度的编码,使得频率较高的字符使用较短的编码,频率较低的字符使用较长的编码。
这样做的好处是,出现频率高的字符使用较少的二进制位来表示,而出现频率低的字符使用较多的二进制位来表示,从而实现了对数据的压缩。
在实验中,对于频率较高的字符,其编码位数相对较短,可以显著减少压缩后数据的大小。
而对于频率较低的字符,其编码位数较长,但是其出现的次数较少,对整体压缩比影响较小。
因此,通过费诺编码可以在一定程度上对数据进行有效压缩,减少存储和传输的空间开销。
然而,费诺编码也存在一些限制。
信息论与编码实验
信息论与编码实验.txt等待太久得来的东西多半已经不是当初自己想要的了。
一层秋雨一阵凉,一瓣落花一脉香,一样流年自难忘,一把闲愁无处藏。
幸福生活九字经:有希望,有事干,有人爱。
女人和女人做朋友,要之以绿叶的姿态,同时也要暗藏红花的心机。
费诺编码:一种信源编码。
设有离散无记忆信源X,P(X).二进制费诺编码为:1.将信源符号按概率从大到小的顺序排列2.将信源分成两组――按两组概率之差为最小分.3.上面一组编码为0,下面一组编码为1,一直分到一组只有一个信源为止.4.将一个信源分组得到的0和1全部连接起来,组成该信源的码字,信源即得到自己的费诺编码.该程序采用费诺编码算法,通过调用函数递归实现。
调用用f1函数将输入变量赋初值,f1函数完成第一次分组后,并对字符数组x(存放码字)第一列赋值得到第一个分界点d,再用f1,f2函数相互调用和自身调用分别实现第一分界点以上和以下的符号再次分组并赋值给字符数组x;因为f1,f2函数分别每次,实现分界点以上和以下寻找下一个分界点所采用的算法不同,两个函数相互调用;本程序的难点是字符数组x如何存放码字,程序采用每次调用增加存放码字数组x的列数r,在寻得分界点后即赋值,可是最后程序输出只有第一列的值,原来变量x每次的值被冲了,采用global全局变量解决了上问题,不过采用global全局变量定义x后,x的类型需要转换为char最关键的是程序开头必须用clear all把global定义的变量归零,不然global定义的变量中存放的还是上次所存的值.clc;clear all;N=input('N=');%输入信源符号的个数s=0;l=0;H=0;for i=1:Nfprintf('第%d个',i);p(i)=input('p=');%输入信源符号概率分布矢量,p(i)<1if p(i)<=0error('不符合概率分布')ends=s+p(i)H=H+(- p(i)*log2(p(i)));%计算信源信息熵endif (s<=0.999999||s>=1.000001)error('不符合概率分布')endtic;for i=1:N-1 %按概率分布大小对信源排序for j=i+1:Nif p(i)<p(j)m=p(j);p(j)=p(i);p(i)=m;endendendx=f1(1,N,p,1);for i=1:N %计算平均码长L(i)=length(find(x(i,:)));l=l+p(i)*L(i);endn=H/l; %计算编码效率fprintf('按概率降序排列的码字:\n');disp(x) %显示按概率降序排列的码字fprintf('平均码长:\n');disp(l)% 显示平均码长fprintf('编码效率:\n');disp(n) %显示编码效率fprintf('计算耗时time= %f\n',toc);%函数f1存放于f1.mfunction x=f1(i,j,p,r)global x;x=char(x);if(j<=i)return;elseq=0;for t=i:j %对于区间[i,j]自上而下求累加概率值q=p(t)+q;y(t)=q;endfor t=i:j%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组v(t)=abs(y(t)-(q-y(t)));endfor t=i:jif(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置for k=i:t %赋值码字x(k,r)='0';endfor k=(t+1):jx(k,r)='1';endd=t;f1(i,d,p,r+1); %递归调用及相互调用f2(d+1,j,p,r+1);f1(d+1,j,p,r+1);f2(i,d,p,r+1);elseendendendreturn;%函数f2存放于f2.mfunction x=f2(i,j,p,r)global x;x=char(x);if(j<=i)return;elseq=0;for t=i:j %对于区间[i,j]自上而下求累加概率值q=p(t)+q;y(t-i+1)=q;endfor t=1:j-(i-1)%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组v(t)=abs(y(t)-(q-y(t)));endfor t=1:j-(i-1)if(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置d=t+i-1;for k=i:d %赋值码字x(k,r)='0';endfor k=(d+1):jx(k,r)='1';endf2(d+1,j,p,r+1);%递归调用及相互调用f1(i,d,p,r+1);f2(i,d,p,r+1);f1(d+1,j,p,r+1);elseendendendreturn;运行结果:N=6第1个p=0.32s =0.3200第2个p=0.22s =0.5400第3个p=0.04s =0.5800第4个p=0.08s =0.6600第5个p=0.16s =0.8200第6个p=0.18s =1按概率降序排列的码字:00011011011101111平均码长:2.4000编码效率:0.9801计算耗时time= 0.094000信道容量的迭代算法:clc;clear all;N = input('输入信源符号X的个数N=');M = input('输出信源符号Y的个数M=');p_yx=zeros(N,M); %程序设计需要信道矩阵初始化为零fprintf('输入信道矩阵概率\n')for i=1:Nfor j=1:Mp_yx(i,j)=input('p_yx=');%输入信道矩阵概率if p_yx(i)<0error('不符合概率分布')endendendfor i=1:N %各行概率累加求和s(i)=0;for j=1:Ms(i)=s(i)+p_yx(i,j);endendfor i=1:N %判断是否符合概率分布if (s(i)<=0.999999||s(i)>=1.000001)error('不符合概率分布')endendb=input('输入迭代精度:');%输入迭代精度for i=1:Np(i)=1.0/N; %取初始概率为均匀分布endfor j=1:M %计算q(j)q(j)=0;for i=1:Nq(j)=q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算a(i)for j=1:Mif(p_yx(i,j)==0)d(i)=d(i)+0;elsed(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j));endenda(i)=exp(d(i));endu=0;for i=1:N %计算uu=u+p(i)*a(i);endIL=log2(u); %计算ILIU=log2(max(a));%计算IUn=1;while((IU-IL)>=b) %迭代计算for i=1:Np(i)=p(i)*a(i)/u; %重新赋值p(i)endfor j=1:M %计算q(j)q(j)=0;for i=1:Nq(j)=q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算a(i)d(i)=0;for j=1:Mif(p_yx(i,j)==0)d(i)=d(i)+0;elsed(i)=d(i)+p_yx(i,j)*log(p_yx(i,j)/q(j)); endenda(i)=exp(d(i));endu=0;for i=1:N %计算uu=u+p(i)*a(i);endIL=log2(u); %计算ILIU=log2(max(a));%计算IUendfprintf('信道矩阵为:\n');disp(p_yx);fprintf('迭代次数n=%d\n',n);fprintf('信道容量C=%f比特/符号',IL);运行结果:输入信源符号X的个数N=2输出信源符号Y的个数M=4输入信道矩阵概率p_yx=0.5p_yx=0.25p_yx=0.125p_yx=0.125p_yx=0.25p_yx=0.5p_yx=0.125p_yx=0.125输入迭代精度:0.0001信道矩阵为:0.5000 0.2500 0.1250 0.12500.2500 0.5000 0.1250 0.1250迭代次数n=1信道容量C=0.061278比特/符号>>Humff编码function [h,l]=huffman(p)if (length(find(p<0))~=0)error('Not a prob,negative component');endif (abs(sum(p)-1)>10e-10)error('Not a prob.vector,component do not add to 1') endn=length(p);q=p;m=zeros(n-1,n);for i=1:n-1[q,l]=sort(q);m(i,:)=[l(1:n-i+1),zeros(1,i-1)];q=[q(1)+q(2),q(3:n),1];endfor i=1:n-1c(i,:)=blanks(n*n);endc(n-1,n)='0';c(n-1,2*n)='1';for i=2:n-1c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))...-(n-2):n*(find(m(n-i+1,:)==1)));c(n-i,n)='0';c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='1';for j=1:i-1c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,...n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));endendfor i=1:nh(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);ll(i)=length(find(abs(h(i,:))~=32));endl=sum(p.*ll);[h,l]=huffman(p),输入为一维行矩阵p,p为各符号的概率分布,概率和为1,各元素值为正,输出H矩阵为对应每个符号概率的码字,L为输出码字的平均码长。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中南大学
信息论与编码实验报告
选题:费诺编码
学生姓名:
学号:
专业班级:通信工程
指导老师:
学院:信息科学与工程学院
时间: 2015
目录
一、实验目的
二、实验原理
费诺编码思想
费诺编码流程图
三、实验内容 四、实验要求 五、代码调试结果 六、心得体会 七、程序源代码
一实验目的
1. 掌握费诺编码的原理和过程。
2. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。
二、实验原理
费诺编码思想
设有离散无记忆信源
∑==⎥⎦⎤⎢⎣⎡n
i i n n x p x p x p x p x x x 1
21211)(,)(.....)()(.....
1.按信源符号的概率从大到小的顺序排队
不妨设
)
(......)()(21n x p x p x p ≥≥≥
2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
4.如此重复,直至每个组只剩下一个信源符号为止。
5.信源符号所对应的码字即为费诺码。
例:有一单符号离散无记忆信源
⎭⎬⎫⎩⎨⎧=⎥⎦⎤⎢⎣⎡04.008.016.018.022.032.0)(654321
x x x x x x X P X
对该信源编二进制费诺码
)i /(35.2)(gn s bit X H = m L K
R 2log =
%92.97)
(==
R x H η
∑===61
)
/(4.2)(i i i k x p K 符号比特
费诺编码流程图
三、实验内容
使用C\C++实现费诺编码,并自己设计测试案例。
四、实验要求
1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。
3.认真撰写实验报告,内容可以自己编排,可以考虑包括以下一些方面:原理概述、程序设计与算法描述、源程序及注释(程序太长可以只选取重要部分)、运行输出结果实例、调试和运行程序过程中产生的问题及采取的措施、对实验的讨论分析、总结。
五、代码调试结果
六、心得体会
通过本次试验,熟悉了c++的使用方法以及在信息论中的使用方法,加强了课程框架的理解。
在这次实验中,再次对信息论与编码有了更深层的理解,以前只是通过书上的理论推导,对相关的计算不是特别理解,通过这次的上机实际操作,以及函数图形的绘制,让我对熵函数有了更多的感性认识。
对费诺编码的理论了解得更透彻。
总的来说,不仅是实验的结果,更重要的是过程和思考,是我学到了很多的知识,真的是受益匪浅。
七、实验代码
#include<>
#include<>
#include<>
#define N 15
int pa[N][N];
void fano(float p[],int a[N][N],int n,int m,int k) 诺编码:"<<endl;
cout<<"2.退出:"<<endl;
}
void choose()
{
int a;
cin>>a;
if(a==1)
select();
else if(a==2)
exit(0);
else
{
cout<<"请重新选择:"<<endl;
choose();
}
}
void main()
{
cout<<"---------------------费诺编码实验------------------"<<endl<<endl;
display();
choose();
system("pause");
}。