信息论实验报告李红莲实验一

合集下载

信息论实验报告

信息论实验报告

信息论实验报告班级:姓名:学号:实验一:信道容量的迭代算法1.实验目的(1)进一步熟悉信道容量的迭代算法;(2)学习如何将复杂的公式转化为程序;(3)掌握C 语言数值计算程序的设计和调试技术。

2、实验要求(1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。

(2)输入:任意的一个信道转移概率矩阵。

信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。

(3)输出:最佳信源分布P*,信道容量C 。

3.算法分析1:procedure CHANNEL CAPACITY(r,s,(ji p )) 2:initialize:信源分布i p =1/r ,相对误差门限σ,C=—∞3:repeat4:5:6: C 2211log [exp(log )]r s ji ij r j p φ==∑∑7:until C Cσ∆≤8:output P*= ()i r p ,C9:end procedure4.程序调试21211exp(log )exp(log )sji ij j r s ji ij r j p p φφ===∑∑∑i p 1i ji r i ji i p p p p =∑ijφ1、头文件引入出错f:\visualc++\channel\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory————#include<unistd.h>纠错://#include<unistd.h>f:\visualc++\channel\cpp1.cpp(5) : fatal error C1083: Cannot open include file: 'values.h': No such file or directory————#include<values.h>纠错://#include<values.h>2、变量赋值错误f:\visualc++\channel\cpp1.cpp(17) : error C2065: 'ij' : undeclared identifierf:\visualc++\channel\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'int' to 'float ** ' Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast————float **phi_ij=ij=NULL;纠错:float **phi_ij=NULL;3、常量定义错误f:\visualc++\channel\cpp1.cpp(40) : error C2143: syntax error : missing ';' before 'for' ————for(i=0;i<r;i++)phi_ij[i]=(float *)calloc(s,sizeof(float));f:\visualc++\channel\cpp1.cpp(52) : error C2021: expected exponent value, not ' '————if(fabs(validate -1.0)>DELTA)f:\visualc++\channel\Cpp1.cpp(84) : error C2021: expected exponent value, not ' '————if(fabs(p_j)>=DELTA)f:\visualc++\channel\Cpp1.cpp(100) : error C2021: expected exponent value, not ' '————if(fabs(phi_ij[i][j])>=DELTA)f:\visualc++\channel\Cpp1.cpp(116) : error C2021: expected exponent value, not ' ' ————while(fabs(C-C_pre)/C>DELTA);纠错:#define DELTA 0.000001;F:\visualc++\channel\Cpp1.cpp(68) : error C2065: 'MAXFLOAT' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(68) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data————C=-MAXFLOAT;纠错:#define MAXFLOAT 1000000;3、引用中文逗号f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'f:\visualc++\channel\cpp1.cpp(60) : error C2065: 'Starting' : undeclared identifierf:\visualc++\channel\cpp1.cpp(60) : error C2059: syntax error : '.'f:\visualc++\channel\cpp1.cpp(60) : error C2017: illegal escape sequencef:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'————fprintf(stdout,”Starting..\n”);纠错:fprintf(stdout,"Starting..\n");4、没有进行强制转换F:\visualc++\channel\Cpp1.cpp(65) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————p_i[i]=1.0/(float)r;纠错:p_i[i]=(float)(1.0/(float)r);F:\visualc++\channel\Cpp1.cpp(101) : warning C4244: '+=' : conversion from 'double' to 'float', possible loss of data————sum[i]+=p_ji[i][j]*log( phi_ij[i][j])/ log(2.0);纠错:sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0));F:\visualc++\channel\Cpp1.cpp(103) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————sum[i]=pow(2.0,sum[i]);纠错:sum[i]=(float)(pow(2.0,sum[i]));F:\visualc++\channel\Cpp1.cpp(114) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————C= log(p_j)/ log(2.0);纠错:C= (float)(log(p_j)/ log(2.0));4、表达式错误F:\visualc++\channel\Cpp1.cpp(86) : error C2065: 'phi_ji' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer typeF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer type ————phi_ij[i][j]=p_i[i]* phi_ji[i][j]/p_j;纠错:phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'fprint' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'The' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2146: syntax error : missing ')' before identifier 'iteration'F:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'————fprint(stdout,”The iteration number is %d.\n\n”,k);纠错:fprintf(stdout,"The iteration number is %d.\n\n",k);F:\visualc++\channel\Cpp1.cpp(145) : error C2143: syntax error : missing ')' before ';' ————free((p_i);纠错:free(p_i);5、没有返回值F:\visualc++\channel\Cpp1.cpp(149) : warning C4508: 'main' : function should return a value; 'void' return type assumed、纠错:return 0;5.改进程序/*引入头文件*/#include<stdio.h>#include<math.h>#include<stdlib.h>/*定义常量*/#define DELTA 0.0000001//DELTA为相对误差门限#define MAXFLOAT 1000000;//MAXFLOAT为初始化信道容量值int main( void){/*定义全局变量*//*register允许直接从寄存器中读取变量,提高速率*/register int i,j;//i、j为整型变量register int k;//信道容量迭代计算次数int r,s;//r为信源符号个数,s为新宿符号个数float *p_i=NULL;//r个信源符号发生的概率float **p_ji=NULL;//信源到新宿的信道转移概率矩阵Pfloat **phi_ij=NULL;float C,C_pre,validate;//C为信道容量,C_pre为信道最大容量,validate为判定输入转移概率矩阵是否合法float * sum=NULL;//信源符号所带的全部信息量float p_j;//条件概率/*输入信源符号和新宿符号个数*/printf("请输入信源符号个数r、信宿符号个数s...\n");printf("+++++注意!!!r必须大于等于s!!+++++\n");fscanf(stdin,"%d",&r);fscanf(stdin,"%d",&s);/*为 p_i,p_ji 和 phi_ij 分配内存空间*/p_i=(float *)calloc(r,sizeof(float));p_ji=(float **)calloc(r,sizeof(float));/*为每个p_ji分配大小为s的内存空间*/for(i=0;i<r;i++)p_ji[i]=(float *)calloc(s,sizeof(float));phi_ij=(float **)calloc(r,sizeof(float*));/*输入转移概率矩阵*/for(i=0;i<r;i++)/*为每个phi_ij分配大小为s的内存空间*/phi_ij[i]=(float *)calloc(s,sizeof(float));printf("信道转移概率矩阵P...\n");for(i=0;i<r;i++)for(j=0;j<s;j++)fscanf(stdin,"%f",&p_ji[i][j]);/*判定输入的转移概率矩阵是否正确*/for(i=0;i<r;i++){validate=0.0;for(j=0;j<s;j++){validate +=p_ji[i][j];}if((validate-1.0)>=0)//如果转移概率矩阵的概率和大于1,输入数据不合法{fprintf(stdout,"invalid input data.\n");exit(-1);}}/*显示开始计算..*/fprintf(stdout,"Starting..\n");/*初始化 p_i 和 phi_ij*/for(i=0;i<r;i++){/* p_i为等概率,即概率为1/r*/p_i[i]=(float)(1.0/(float)r);}/*初始化信道容量c,迭代次数k和临时变量variable*/C=-MAXFLOAT;k=0;/* 为sum分配大小为r的内存空间*/sum=(float *)calloc(r,sizeof(float));/*开始迭代计算*/do{k++;//每进行一次迭代,迭代次数k加1/* 计算phi_ij(k)*/for(j=0;j<s;j++){p_j=0.0;for(i=0;i<r;i++)p_j+=p_i[i]*p_ji[i][j];if(fabs(p_j)>=DELTA)for(i=0;i<r;i++)phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;elsefor(i=0;i<r;i++)phi_ij[i][j]=0.0;}/*计算p_i(k+1)*/p_j=0.0;for(i=0;i<r;i++){sum[i]=0.0;for(j=0;j<s;j++){/*相对误差门限为0*/if(fabs(phi_ij[i][j])>=DELTA)sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0)); }sum[i]=(float)(pow(2.0,sum[i]));p_j+=sum[i];}for(i=0;i<r;i++){p_i[i]=sum[i]/p_j;}C_pre=C;C= (float)(log(2.0)/log(p_j) );}while(fabs(C-C_pre)/C>DELTA);free(sum);sum=NULL;/*显示结果*/fprintf(stdout,"The iteration number is %d.\n\n",k);//迭代次数fprintf(stdout,"The capacity of the channel is %.6f bit/symbol:\n\n",C);//信道容量fprintf(stdout,"The best input probability distribution is :\n");//最佳信源分布 for(i=0;i<r;i++)fprintf(stdout,"%.6f\n",p_i[i]);fprintf(stdout,"\n");/* 释放指针空间*/for(i=s-1;i>=0;i--){free(phi_ij[i]);phi_ij[i]=NULL;}free(phi_ij);phi_ij=NULL;for(i=r-1;i>=0;i--){free(p_ji[i]);p_ji[i]=NULL;}free(p_ji);p_ji=NULL;free(p_i);p_i=NULL;exit(0);return 0;}6.实验结果6.实验二:唯一可译码判决准则1.实验目的(1)进一步熟悉唯一可译码判决准则;(2)掌握C语言字符串处理程序的设计和调试技术。

信息论与编码技术实验报告

信息论与编码技术实验报告

《信息论与编码技术》实验报告实验一:请根据公式-plogp ,说明小概率事件和大概率事件对熵的贡献。

解:先做图,然后分析。

将公式写为)(log )(2p p p f -=对它编写计算和画图程序如下:p=0:0.01:1;x=-p.*log2(p);plot(p,x);从图中曲线看出,小概率事件和大概率事件的情况下,熵值都很低,贡献很小,在概率为0.5附近时熵值最大,故此时对熵的贡献最大。

实验二:请对a 、b 、c 霍夫曼编码,它们的概率是0.6、0.3、0.1。

并以此对符号串ababaacbaa 编码和译码。

解:编码步骤分为:事件排序,符号编码,信源编码,信道编码。

MATLAB 程序:clc;a=0.3;b=0.3;c=0.4; %%%霍夫曼编码A=[a,b,c];A=fliplr(sort(A)); %%%降序排序if (a==b)&(a>c), %%实现了当a,b,c 其中两概率相同时的编码,及3值均不同时的编码 u='a';x=a;v='b';y=b;w='c';z=c;elseif (a==b)&(a<c),u='c';x=c;v='a';y=a;w='b';z=b;elseif (c==b)&(c>a),u='b';x=b;v='c';y=c;w='a';z=a;elseif (c==b)&(c<a),u='a';x=a;v='b';y=b;w='c';z=c;elseif(a==c)&(a>b),u='a',x=a;v='c',y=c;w='b',z=b;elseif(a==c)&(a<b),u='b';x=b;v='a';y=a;w='c';z=c;elseif A(1,1)==a,u='a';x=a;elseif A(1,1)==b,u='b';x=b;elseif A(1,1)==c,u='c';x=c;endif A(1,2)==a,v='a';y=a;elseif A(1,2)==b,v='b';y=b;elseif A(1,2)==c,v='c';y=c;endif A(1,3)==a,w='a';z=a;elseif A(1,3)==b,w='b';z=b;elseif A(1,3)==c,w='c';z=c;endend %%%x,y,z按从大到小顺序存放a,b,c的值,u,v,w存对应字母if x>=(y+z),U='0';V(1)='0';V(2)='1';W(1)='1';W(2)='1';else U='1';V(1)='0';V(2)='0';W(1)='1';W(2)='0';enddisp('霍夫曼编码结果:')if u=='a',a=fliplr(U),elseif u=='b',b=fliplr(U),else c=fliplr(U),end if v=='a',a=fliplr(V),elseif v=='b',b=fliplr(V),else c=fliplr(V),end if w=='a',a=fliplr(W),elseif w=='b',b=fliplr(W),else c=fliplr(W),end %%%编码步骤为:信源编码,信道编码disp('信源符号序列:')s='ababaacbaa' %%%信源编码q=[];for i=s;if i=='a',d=a;elseif i=='b';d=b;else d=c;end;q=[q,d];endm=[]; %%%符号变数字for i=q;m=[m,str2num(i)];endP=[1,1,1,0;0,1,1,1;1,1,0,1];G=[eye(3),P];%%%信道编码%%%接下来的for循环在程序中多次使用,此处作用是将已编码组m每3个1组放入mk中进行运算之后存入Ck数组中,每次mk中运算结束之后清空,再进行下一组运算,而信道编码结果数组C则由C=[C,Ck]存入每组7个码。

信息论与编码实验报告

信息论与编码实验报告

NANCHANG UNIVERSITY信息论与编码实验报告(2018年11月27日)学院:信息工程学院系电子信息工程系专业班级:学生姓名:学号:指导教师:目录实验一自信息量和熵源.............................................................................................. 实验二准对称信道容量.............................................................................................. 实验三费诺不等式...................................................................................................... 实验四香农编码.......................................................................................................... 实验五费诺编码.......................................................................................................... 实验六霍夫曼编码......................................................................................................实验一自信息量和熵源一、实验要求1、画出I=-的函数图;2、画出H(p)=-p-(1-p)函数图。

二、实验原理及理论分析自信息量:一个事件的自信息量就是对其不确定性的度量。

信息论实验报告-

信息论实验报告-

信息论实验报告学生:班级:学号:实验一香农编码一、程序设计的流程图二、程序清单#include <iostream>#include<math.h>#include<string>using namespace std;void swap(double *x,double *y);int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double S[N]; //注意变量在数组中的影响cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];for(int i=0;i<N;i++){for(int j=i;j<N;j++)if(S[i]<S[j])swap(S[i],S[j]);}int nm[N];for(int i=0;i<N;i++){nm[i]=int(-(log(S[i])/log(2)))+1;if(nm[i]==(-(log(S[i])/log(2)))+1)nm[i]--;}double AA[N];AA[0]=S[0];for(int i=1;i<N;i++ )AA[i]=AA[i-1]+S[i];string MM[N];for(int i=0;i<N;i++){double tem=0;double aa=AA[i];for(int j=0;j<N;j++){tem=aa*2;if(tem>1){MM[i]+='1';aa=tem-1;}else{MM[i]+='0';aa=tem;}}}string BB[N];for(int i=0;i<N;i++){for(int j=0;j<nm[i];j++)BB[i]+=MM[i][j];}cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<BB[i]<<endl;}void swap(double &x,double &y){double a;a=x;x=y;y=a;}实验二.费洛编码.一、 流程图二、程序清单#include <iostream>#include<string>#include<math.h>using namespace std;void dw(int n,int H,int W,double *si,string *m); int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double S[N];cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];for(int i=0;i<N;i++){for(int j=i;j<N;j++){if(S[i]<S[j]){double a;a=S[i];S[i]=S[j];S[j]=a;}}}string MM[N];dw(N,0,N-1,S,MM);cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<MM[i]<<endl;}void dw(int n,int H,int W,double *si,string *m ) {double sum=0,sm=0;int a1=W-H;if(a1>=1){for(int j=H;j<=W;j++)sum+=*(si+j);double b[n];for(int i=H;i<=W;i++){sm+=*(si+i);b[i]=fabs(2*sm-sum)/sum;}int ZH;double a=b[H];for(int i=H;i<=W;i++)if(b[i]<=a){a=b[i];ZH=i;}for(int i=H;i<=W;i++){if(i<=ZH) m[i]+='0';else m[i]+='1';}int nn=n;double *ss;ss=si;string *mm;mm=m;if(ZH==H)dw(nn,ZH+1,W,ss,mm);else if(ZH==W-1)dw(nn,H,ZH,ss,mm);else{dw(nn,H,ZH,ss,mm);dw(nn,ZH+1,W,ss,mm);}}}实验三.霍夫曼一、程序流程图二、 程序清单#include<iostream>#include<string>using namespace std;struct HNode{double weight;int parent;int lchild;int rchild;};void HuffmanTree(HNode *HuffNode,int n,double *si,string *m); int hc(string m);void nv(string *m,int n);int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double *S=new double[N];cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];string *MM=new string[N];for(int i=0;i<N;i++){for(int j=i;j<N;j++){if(S[i]<S[j]){double a;a=S[i];S[i]=S[j];S[j]=a;}}}HNode *node=new HNode[2*N-1];HuffmanTree(node,N,S,MM);nv(MM,N);cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<MM[i]<<endl;}void HuffmanTree(HNode *HuffNode,int n,double *si,string *m) {int i,j,x1,x2,c,p;float m1,m2;for (i=0;i<2*n-1;i++){HuffNode[i].weight=0;HuffNode[i].parent=-1;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;}for (i=0;i<n;i++){HuffNode[i].weight=si[i];}for (i=0;i<n-1;i++){m1=m2=1;x1=x2=0;for (j=0;j<n+i;j++){if (HuffNode[j].parent==-1&&HuffNode[j].weight<m1){m2=m1;x2=x1;m1=HuffNode[j].weight;x1=j;}else if (HuffNode[j].parent==-1&&HuffNode[j].weight<m2){m2=HuffNode[j].weight;x2=j;}}HuffNode[x1].parent=n+i;HuffNode[x2].parent=n+i;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++){c=i;p= HuffNode[c].parent;while(p!=-1){if(HuffNode[p].lchild ==c)m[i]+='0';elsem[i]+='1';c=p;p=HuffNode[c].parent;}}}int hc(string m){int a=0;for(int i=0;m[i]!='\0';i++)a++;return a;}void nv(string *m,int n){char mn[n];int b;for(int i=0;i<n;i++){b=hc(m[i]);for(int j=0;j<b;j++){mn[j]=m[i][b-j-1];}m[i]=mn;}}实验四.信道一、程序流程图三、程序清单#include <stdlib.h>#include <iostream>#include <math.h>using namespace std;int main(){int ni,no;int i,j;cout<<"输入信源个数"<<endl;cin>>ni;cout<<"输出信源个数"<<endl;cin>>no;double *Si=new double[ni];double *So=new double[no];cout<<"输入信源概率"<<endl;for (i=0;i<ni;i++){cin>>Si[i];}cout<<endl;//再输入信道转移概率矩阵//注意进行判断,某行如果总概率大于1,则出现错误应从新输入cout<<"输入转移概率:"<<endl;float **p; //转移条件概率p=new float *[ni];for (i=0;i<ni;i++){p[i]=new float[no];}for (i=0;i<ni;i++){for (j=0;j<no;j++){cin>>p[i][j];}}for (i=0;i<ni;i++){float a=0;for (j=0;j<no;j++){a+=p[i][j];}if (a!=1.0){cout<<"输入数据有误,请检查后再次输入。

信息论实习报告

信息论实习报告

实习报告实习单位:某某信息科技有限公司实习时间:2023年2月18日至2023年3月18日实习岗位:信息论实习生一、实习背景及目的随着信息技术的快速发展,信息论作为一门研究信息传输和处理的理论基础,在各领域中发挥着越来越重要的作用。

为了加深我对信息论知识的理解,提高实际操作能力,我选择了某某信息科技有限公司进行为期一个月的实习。

实习目的在于将所学理论知识与实际工作相结合,拓宽知识面,培养实践操作技能。

二、实习内容及收获1. 实习内容(1)参与公司项目研发,负责信息传输过程中的信号处理和编码工作。

(2)协助工程师进行实验室测试,收集实验数据,分析实验结果。

(3)学习公司内部技术文档,了解公司的信息论技术应用和发展方向。

(4)参加公司组织的培训课程,提升自己在信息论方面的专业知识。

2. 实习收获(1)理论知识应用:通过实际参与项目研发,我将所学的信息论知识应用于实际工作中,提高了理论知识的实际运用能力。

(2)实践操作技能:在实验室测试过程中,我学会了使用各种测试设备,掌握了实验数据的收集和分析方法。

(3)团队协作:与公司同事共同完成项目任务,我学会了如何进行有效沟通,提高了团队协作能力。

(4)行业认识:通过实习,我更加了解了信息论在实际应用中的重要性,以及对相关行业的发展趋势有了更深入的认识。

三、实习中遇到的问题及解决办法在实习过程中,我遇到了一些问题,主要包括:(1)理论知识与实际应用的衔接:在实际工作中,我发现所学理论知识并不能直接应用于实际问题,需要不断地学习和摸索。

(2)技术难题:在项目研发过程中,遇到了一些技术难题,需要向工程师请教和寻求帮助。

解决办法:(1)加强学习:通过阅读相关资料和参加公司培训,提高自己的理论水平和实际操作能力。

(2)积极请教:遇到问题时,主动向工程师请教,争取他们的指导和帮助。

四、实习总结通过本次实习,我对信息论在实际应用中的重要性有了更深入的认识,同时自己的实践操作能力和团队协作能力也得到了锻炼和提高。

信息论课程实验报告

信息论课程实验报告

中国地质大学(武汉)CHINA UNIV ERSIT Y OF GEOSCIENCES信息论课程实验报告指导老师:严军姓名:刘一龙班级:71082-14学号:20081002007中国地质大学(武汉)2011年6月实验一构造(7,4)系统码一、实验题目Construct a systematic (7,4) linear block code. Y ou can use c / MA TLAB / HDL (VHDL or Verilog-HDL) to describe it. Please write the detail of how to realize it in computer language. And list the program lines.二、实验程序算法设计:利用H的线性独立,通过n的二进制形式构造出H,然后利用H构造出G。

本算法具有通用性,不仅可以计算出(7,4)的生成矩阵,还可以构造出(15,11),(31,26)的生成矩阵。

Matlab程序:clc;disp('请输入系统码n的值');n = input('n=');disp('请输入系统码k的值');k = input('k=');r = n-k;temp=[];for i=1:ny=dec2bin(i,r);for j=1:rtemp(i,j)=mod(y(j),2);endendfor i=1:rt = temp(i,:);temp(i,:)=temp(2^(i-1),:);temp(2^(i-1),:)=t;endfor i=1:(fix(r/2))t = temp(:,i);temp(:,i)=temp(:,r-i+1);temp(:,r-i+1)=t;endH = temp';%-----构造矩阵G--------%P=H(:,r+1:n);G=[P',eye(k)];disp('生成矩阵');Gdisp('校验矩阵');H三、实验结果请输入系统码n的值n=7请输入系统码k的值k=4生成矩阵G =1 1 0 1 0 0 01 0 1 0 1 0 00 1 1 0 0 1 01 1 1 0 0 0 1校验矩阵H =1 0 0 1 1 0 10 1 0 1 0 1 10 0 1 0 1 1 1请输入系统码n的值n=15请输入系统码k的值k=11生成矩阵G =Columns 1 through 81 0 1 0 1 0 0 00 1 1 0 0 1 0 01 1 1 0 0 0 1 01 1 0 0 0 0 0 11 0 0 1 0 0 0 00 1 0 1 0 0 0 01 1 0 1 0 0 0 00 0 1 1 0 0 0 01 0 1 1 0 0 0 00 1 1 1 0 0 0 01 1 1 1 0 0 0 0 Columns 9 through 150 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 01 0 0 0 0 0 00 1 0 0 0 0 00 0 1 0 0 0 00 0 0 1 0 0 00 0 0 0 1 0 00 0 0 0 0 1 00 0 0 0 0 0 1校验矩阵H =Columns 1 through 81 0 0 0 1 0 1 10 1 0 0 0 1 1 10 0 1 0 1 1 1 00 0 0 1 0 0 0 0Columns 9 through 151 0 1 0 1 0 10 1 1 0 0 1 10 0 0 1 1 1 11 1 1 1 1 1 1实验二循环码一、实验题目We have already learned how to encode and decode cyclic codes. Please use the generator polynomial g(x)=1+x+x2+x4to construct a (7,3) code. And if the received code vector is [1 1 0 0 1 1 1], how to decode it? Use c / MATLAB / HDL language to realize the encoding and decoding system.二、实验程序算法设计:通过计算自己将生成矩阵G输入到计算机,然后输入要传输的信息m,利用c=mG 自动生成码字c。

信息论实验报告

信息论实验报告

一、实验目的1. 理解信息论的基本概念和原理;2. 掌握信息熵、条件熵、互信息等基本概念的计算方法;3. 学会使用 MATLAB 进行信息论实验,并分析实验结果;4. 提高编程能力和数据分析能力。

二、实验原理信息论是一门研究信息传输、处理和存储的学科,其核心是信息熵。

信息熵是衡量信息不确定性的度量,表示信息中所包含的平均信息量。

信息熵的计算公式如下:H(X) = -Σ p(x) log2(p(x))其中,H(X) 表示随机变量 X 的熵,p(x) 表示 X 取值为 x 的概率。

条件熵是衡量在已知另一个随机变量 Y 的条件下,随机变量 X 的不确定性。

条件熵的计算公式如下:H(X|Y) = -Σ p(x,y) log2(p(x|y))其中,H(X|Y) 表示在 Y 已知的条件下 X 的熵,p(x,y) 表示 X 和 Y 同时取值为x 和 y 的概率,p(x|y) 表示在 Y 已知的情况下 X 取值为 x 的条件概率。

互信息是衡量两个随机变量之间相互依赖程度的度量。

互信息的计算公式如下:I(X;Y) = H(X) - H(X|Y)其中,I(X;Y) 表示随机变量 X 和 Y 之间的互信息。

三、实验内容1. 使用 MATLAB 编写程序,计算给定信源的概率分布,并计算其熵;2. 使用 MATLAB 编写程序,计算给定两个随机变量的联合概率分布,并计算其条件熵和互信息;3. 分析实验结果,验证信息熵、条件熵和互信息之间的关系。

四、实验步骤1. 输入信源的概率分布,使用 MATLAB 计算 H(X);2. 输入两个随机变量的联合概率分布,使用 MATLAB 计算 H(X,Y)、H(X|Y) 和I(X;Y);3. 分析实验结果,比较 H(X)、H(X|Y) 和 I(X;Y) 之间的关系。

五、实验结果与分析1. 信源概率分布及其熵输入信源的概率分布为:p(x) = [0.2, 0.3, 0.5]计算得到:H(X) = -0.2 log2(0.2) - 0.3 log2(0.3) - 0.5 log2(0.5) ≈ 1.5852. 两个随机变量的联合概率分布及其条件熵和互信息输入两个随机变量的联合概率分布为:p(x,y) = [0.1, 0.2, 0.3, 0.4]计算得到:H(X,Y) = -0.1 log2(0.1) - 0.2 log2(0.2) - 0.3 log2(0.3) - 0.4log2(0.4) ≈ 2.097H(X|Y) = -0.1 log2(0.1) - 0.2 log2(0.2) - 0.3 log2(0.3) - 0.4log2(0.4) ≈ 1.585I(X;Y) = H(X) - H(X|Y) ≈ 0.512分析实验结果,可以发现:(1)信息熵 H(X) 表示信源中包含的平均信息量,当信源概率分布越均匀时,信息熵越大;(2)条件熵 H(X|Y) 表示在已知随机变量 Y 的条件下,随机变量 X 的不确定性,当 X 和 Y 之间的依赖程度越高时,条件熵越小;(3)互信息 I(X;Y) 表示随机变量 X 和 Y 之间的相互依赖程度,当 X 和 Y 之间的依赖程度越高时,互信息越大。

北京邮电大学信息论实验1

北京邮电大学信息论实验1

信息论实验·第一次实验报告题目一:掷毂子游戏的熵实验步骤:(程序见附件)我们首先计算掷毂子游戏熵的理论值:首先可以得到加和为2、3、…12的概率分别为1/36、2/36….6/36、5/36…1/36,然后利用公式:可以得到掷毂子游戏的熵的理论值为3.27bit/符号。

然后计算熵的仿真值:首先设定N=100:100:100000,然后做N次试验,统计最后加和的值所出现的频率,用频率近似概率,再次利用以上公式,得到仿真熵。

最后对不同的N得到的仿真熵与理论值的差别作图,寻找规律。

实验结论:经过理论分析,我们可知加和为2、3、…12的概率分别为1/36、2/36….6/36、5/36…1/36,进而得到掷毂子游戏的熵的理论值为3.27bit/符号。

下图为N取不同值时仿真熵的变化曲线(N=100:100:100000):根据观察可以得到,当N逐渐增大时,仿真熵逐渐趋近于理论计算得到的熵3.27bit/符号。

题目一(可选):计算英文文本的熵实验步骤:(程序见附件)首先,我们导入了一段样本文本,节选自欧亨利的小说《警察与赞美诗》(文本见附件),统计这段文本中英文字母(区分大小写)和空格出现的个数,进而得到各个字母出现的概率p(x),然后利用公式:计算样本的熵H(X)。

然后,我们统计了文本中相邻两个字符出现的概率p(xy),通过计算边缘概率分布可得p(x),然后利用公式p(y|x)=p(xy)/p(x)条件分布概率p(y|x),最后利用公式:计算得到样本的相邻两个字符的条件熵H(Y|X)。

最后,我利用生成了一组独立等概分布的英文随机序列,重新计算H(X)、H(Y|X),以检验模型的正确性。

实验结论:首先,我们可得实验的结果列表:输入文本测试项目实验值理论值小说节选H(X) 4.21bit/symbol 4.03bit/symbol小说节选H(Y|X) 3.14bit/symbol 3.32bit/symbol随机序列H(X) 5.72bit/symbol 5.73bit/symbol随机序列H(Y|X) 5.51bit/symbol 5.73bit/symbol 在上表中,实验值是通过matlab仿真得到,小说节选的两项理论值是通过查阅《信息论基础》(田宝玉、杨洁等编著,57页)得到,随机序列的理论值是通过计算:得到,随机序列共有53个符号,等概出现,我们认为H(Y|X)=H(Y)=。

信息论实验报告

信息论实验报告

前言信息论是现代通信与信息工程的理论基础。

作为电子信息科学与技术专业本科生的学科基础课,本课程主要讲授:信息的定义和测度、信源和信息熵、连续熵和信息变差、信道和互信息、平均互信息和信道容量、数据处理和信息测量理论、无失真信源编码理论和编码方法等内容。

本课程按“单符号离散信息系统”、“多符号离散信息系统”、“连续信息系统”三个“系统”层面,逐步深入展开,以严密的数学分析贯串始终。

通过教学,使学生掌握信息理论的基本概念和信息分析方法,为今后进一步研究信息科学和信息技术打下坚实的理论基础。

实验一:唯一可译码判断实验学时:3实验类型:(演示、验证、综合、√设计、研究)实验要求:(√必修、选修)一、实验目的通过本次试验了解唯一可译码地判断原理;实现用C语言编写判断唯一可译码地程序二、实验内容编程实现唯一可译码的判决准则―――Sardinas-Patterson算法三、实验原理、方法和手段Sardinas-Patterson算法描述:设C为码字集合,按以下步骤构造此码的尾随后缀集合F:(1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;(2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;(3)F=∪Fi即为码C的尾随后缀集合;(4) 若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。

在我们设计的算法中,需要注意的是我们需要的是先输出所有尾随后缀的集合,然后再判断该码是否是唯一可译码,即如F中出现了C中的元素,则C不是唯一可译码,否则若F中没有出现新的元素,则C为唯一可译码。

而不是F中出现C中的元素就终止,这也是在本题的要求中需要注意的问题。

1、概要设计:由于需要判断尾随后缀,所以我们需要反复的比较C和F中的码字。

1)首先我们用一个b[30][30]的数组来存放所有的尾随后缀的集合;用Q记录所有尾随后缀的个数;2)用数组a[30][30]来存放输入的码字,L[30]来存放码字的长度;通过一个双重循环并调用houzhui(a[i],a[j],L[i],L[j])函数来找到a[30][30]中的为随后缀,即:for(i=0;i<n-1;i++){for(j=0;j<n;j++){if(i!=j&&L[i]<L[j])HuoZhui(a[i],a[j],L[i],L[j]);}}3)通过判断Q是否大于0,如果不大于0,即b[30][30]中没有码字,也就是不存在尾随后缀,那么可判断a[30][30]是唯一可译码,否则进行如下操作;4)计算b[30][30]中尾随后缀的长度,用k1表示;并调用HuoZhui(b[i],a[j],k1,L[j])其中k1<L[j]来a[30][30]中所存在的后缀,并加入到b[30][30]中,通过一个循环,找到a[30][30]中所有尾随后缀;即for(i=0;i<Q;i++){k1=strlen(b[i]);for(j=0;j<n;j++){if(k1<L[j])HuoZhui(b[i],a[j],k1,L[j]);}}5)寻找b[30][30]中的尾随后缀;用k2表示b[30][30]中码字的长度,并调用HuoZhui(a[i],b[j],L[i],k2)来实现,其中k2>L[j];通过循环调用即可找到b[30][30]中的所有尾随后缀,最后再将他们分别存放在b[30][30]中;即通过for(i=0;i<n;i++){for(j=0;j<Q;j++){k2=strlen(b[j]);if(k2>L[i]){HuoZhui(a[i],b[j],L[i],k2);}}}6)在反复调用HuoZhui(a[i],a[j],L[i],L[j])函数中如果b[30][30]中有重复出现的,即尾随后缀相同的不用再次放入b[30][30]中。

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告一、实验目的信息论与编码是一门涉及信息的度量、传输和处理的学科,通过实验,旨在深入理解信息论的基本概念和编码原理,掌握常见的编码方法及其性能评估,提高对信息处理和通信系统的分析与设计能力。

二、实验原理(一)信息论基础信息熵是信息论中用于度量信息量的重要概念。

对于一个离散随机变量 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|香农编码的平均码长较长,编码效率相对较低。

信息论课程实验报告—Shannon编码

信息论课程实验报告—Shannon编码

: 六、实验器材(设备、元器件) 实验器材(设备、元器件)
PC 机一台,装有 VC++6.0 或其它 C 语言集成开发环境。
七、实验步骤及操作: 实验步骤及操作:
1)排序; 2)计算码长; 3)递归调用香农算法得到相应的码字。
八、实验数据及结果分析: 实验数据及结果分析:
s 2 s3 s4 s5 s6 s 7 s8 S s1 题目:已知信源: = ,给出其一个 P 0.20, 0.18, 0.17, 0.15, 0.15, 0.05, 0.05, 0.05 香农码,并求其平均码长和编码效率。
else k[i]=temp+1; } } void code(int *k,double *pa,string *str,int n) { for(int i=0;i<n;i++) { double s=pa[i]; for(int j=0;j<k[i];j++) { s=2*s; if(s>=1) { str[i]+="1"; s=s-1; } else str[i]+="0"; } } } void main() { int n; cout<<"信源符号个数 n= "; cin>>n; double *p=new double[n]; cout<<"信源符号的概率依次为(以回车表示概率的结束): "; for(int i=0;i<n;i++) { cin>>p[i]; } bubble(p,n); double *pa=new double[n]; leijia(p,pa,n); int *k=new int[n]; length(p,k,n); string *str=new string[n]; code(k,pa,str,n); cout<<setw(10)<<"pa(i)"<<setw(10)<<"Pa(a,j)"<<setw(10)<<"Ki"<<setw(10)<<"码字"<<endl; for(i=0;i<n;i++) { cout<<setw(10)<<p[i]<<setw(10)<<pa[i]<<setw(10)<<k[i]<<setw(10)<<str[i]<<endl; } }

《信息论与编码》课程实验报告

《信息论与编码》课程实验报告

本科生实验报告实验课程信息论与编码学院名称管理科学学院专业名称信息与计算科学学生姓名章乾学生学号201207020114指导教师范安东实验地点6C402实验成绩二〇一四年十月二〇一四年十一月实验一离散信源信息量的计算(一)1 实验内容(1)熟悉利用srand()函数产生随机离散信源概率空间的方法;(2)计算随机离散信源的各种信息量:H(X)、H(XY)、H(Y);2 数据结构与算法描述3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据随机生成数据2)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)实验二离散信源信息量的计算(二)1 实验内容(1)熟悉利用srand()函数产生随机离散信源概率空间的方法;(2)计算随机离散信源的各种信息量:H(X|Y)、H(Y|X)、I(X;Y);2 数据结构与算法描述1)变量及函数的定义3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据随机生成数据2)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)实验三典型信道容量的计算1 实验内容(1)熟悉利用srand()函数产生随机离散信道概率空间的方法;(2)计算随机离散信道的信道容量;2 数据结构与算法描述1)变量及函数的定义3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据0.6 0.2 0.20.5 0.3 0.22)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)实验四香农编码1 实验内容(1)熟悉理解香农编码的过程(2)将给定的数据进行香农编码2 数据结构与算法描述3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据0.25 0.25 0.2 0.15 0.1 0.052)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)实验五 Huffman编码1 实验内容(1)熟悉理解Huffman编码的过程(2)将给定的数据进行Huffman编码2 数据结构与算法描述1)变量及函数的定义3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据0.2 0.1 0.3 0.1 0.1 0.22)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)实验六 循环冗余校验码1 实验内容(1)理解循环冗余校验的基本程序; (2)对给出的数据进行循环冗余校验;2 数据结构与算法描述1)变量及函数的定义3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据信息码:321x x x +++ 生成码:431x x x +++2)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)语。

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告一、实验目的本实验旨在通过实践,使学生们对信息论与编码理论有一个更深入的理解,掌握信息论与编码的基本原理和应用方法。

二、实验环境本次实验使用MATLAB软件来实现相关编码算法。

三、实验内容1.信息熵的计算信息熵是信息理论中的一个重要概念,用来度量一些信息源的不确定性。

在实验中,我们将计算给定的一组消息的信息熵。

首先,我们将给定的消息编码为二进制序列。

然后,我们根据信息熵的定义,使用公式计算信息熵:H(X) = -Σ(p(x) * log2(p(x)))其中,H(X)表示信息熵,p(x)表示消息x发生的概率。

2.香农编码的实现香农编码是一种无失真的编码方法,用于将离散的符号序列编码为二进制码字。

在实验中,我们将实现香农编码算法。

首先,我们需要计算给定符号序列中各个符号的概率。

然后,根据概率大小,将概率最高的符号分配最短的二进制码字,将概率较低的符号分配较长的二进制码字。

实现香农编码算法后,我们将计算编码后的码字的平均码长,并与信息熵进行比较,了解香农编码的效率。

3.赫夫曼编码的实现赫夫曼编码是一种常用的无失真编码方法,也被广泛应用于数据压缩中。

在实验中,我们将实现赫夫曼编码算法。

首先,我们需要计算给定符号序列中各个符号的概率。

然后,根据概率大小,使用最小堆数据结构构建赫夫曼树。

最后,根据赫夫曼树的性质,将每个符号的编码确定下来。

实现赫夫曼编码算法后,我们将计算编码后的码字的平均码长,并与信息熵进行比较,了解赫夫曼编码的效率。

四、实验结果与分析1.实验一结果我们选取了一个包含1000个等概率的二进制消息的序列进行实验。

通过计算,我们得到了该消息序列的信息熵为12.实验二结果我们选取了一个包含1000个符号的序列进行实验。

通过计算,我们得到了编码后的平均码长为2.8、与信息熵的比较发现,香农编码的效率很高。

3.实验三结果我们选取了一个包含1000个符号的序列进行实验。

通过计算,我们得到了编码后的平均码长为2.6、与信息熵的比较发现,赫夫曼编码的效率也很高。

信息论实验报告实验1

信息论实验报告实验1

信息论实验报告一实验一1、实验内容(1)英文信源由26个英文字母和1个空格组成,假定字符从中等概选取,那么一条100个字符的信息提供的信息量为多少?(2)若将27个字符分为三类,9个出现概率占2/7,13个出现概率占4/7,5个出现占1/7,而每类中符号出现等概,求该字符信源的信息熵。

2、设计思路及步骤I=log2P iH(X)=∑−P i log2Pii26个字母和一个空格,因等概选取可以先求得其中一个字符的信息量,通过扩展实现计算100个字符的信息量。

对于第二问,可以将字符分为三组,又因每组字符的概率相等,因此可以求出每组每一个字符的概率。

通过信息熵的定义可以求出结果。

3、程序代码及调试过程4、出现的问题及解决方法(1)没有看清题目要求,漏掉空格(2)是否可以将三组字符看作整体5、结果及说明通过实验结果可以看出100个字符的信息量,以及字符信源熵。

比较H2与H3可以看出,并不可以简单的将三组数据看作整体。

6、实验总结本实验通过计算多字符的信息量与分组信息熵,让我们加深了信息论中有关信息量与信息熵的概念与定义,同时也让我们熟悉了matlab的基本操作。

实验二1、实验内容绘制二进制信源熵函数曲线。

2、设计思路及步骤根据信源熵的定义以及公式计算出熵,通过matlab的矩阵运算计算出熵数组,然后通过plot函数画出图像。

3、程序代码及调试过程4、出现的问题及解决方法矩阵乘法出错,,需要使用matlab中的点乘5、结果及说明信源熵的图像为凸形曲线,熵在信源等概分布时取最大值,先增大再减小。

6、实验总结本实验通过对信源熵的作图让我们熟悉了matlab中图像生成函数,以及矩阵运算。

实验三,四1、实验内容求信源的熵和其二次、三次扩展信源的熵。

离散二维平稳信源的概率空间:求:(a)信源符号之间无依赖性时,信源X的信息熵H(X);(b)信源符号有依赖性时的条件熵H(X2|X1);(c)联合熵H(X1X2);(d)根据以上三者之间的关系,验证结果的正确性。

实验1-信息论相关实验实验报告

实验1-信息论相关实验实验报告

信息论与编码实验一实验报告学生姓名周群创指导教师张祖平学号 0909110814 专业班级电子信息1101实验一关于信源熵的实验一、实验目的1. 掌握离散信源熵的原理和计算方法。

2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。

3. 自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具求解图像熵。

4. 掌握Excel 的绘图功能,使用Excel 绘制散点图、直方图。

二、实验原理1. 离散信源相关的基本概念、原理和计算公式产生离散信息的信源称为离散信源。

离散信源只能产生有限种符号。

随机事件的自信息量I(x i)为其对应的随机变量x i 出现概率对数的负值。

即:I(x i)= -log2 p(x i)随机事件X 的平均不确定度(信源熵)H(X)为离散随机变量x i 出现概率的数学期望,即:H(X )=-∑p(x )I (x ) =-∑p(x ) log p(x )2. 二元信源的信息熵设信源符号集X={0,1},每个符号发生的概率分别为p(0)=p,p(1)=q,p+ q=1,即信源的概率空间为则该二元信源的信源熵为:H(X) = - p log p –q log q = - p log p – (1- p) log (1- p)即:H (p) = - p log p – (1- p) log (1- p) 其中 0 ≤p ≤13. MATLAB 二维绘图用matlab 中的命令plot(x, y)就可以自动绘制出二维图来。

例1-2,在matlab 上绘制余弦曲线图,y = cos x,其中0 ≤x ≤2。

>>x=0:0.1:2*pi; %生成横坐标向量,使其为0,0.1,0.2,…,6.2>>y=cos(x); %计算余弦向量>>plot(x,y) %绘制图形4. MATLAB 求解离散信源熵求解信息熵过程:1) 输入一个离散信源,并检查该信源是否是完备集。

信息论实验

信息论实验

北京科技大学UNIVERSITY OF SCIENCE AND TECHNOLOGY BEIJING 信息论实验报告学院:计算机与通信工程学院一1.实验目的(1)进一步熟悉唯一可译码判决准则(2)掌握C语言字符串处理程序的设计和调试技术2.实验要求(1)已知:信源符号个数q、码字集合C(2)输入:任意的一个码。

码字个数和每个具体的码字在运行时从键盘输入(3)输出:判决(是唯一可译码/不是唯一可译码)3.实验代码#include<stdio.h>#include<string.h>#define MAX 100char c[MAX][MAX];char f[MAX][MAX];int N,sum=0;int flag;void patterson(char c[],char d[]){int i,j,k;for(i=0;;i++){if(c[i]=='\0'&&d[i]=='\0') //2字符串一样,就跳出break;if(c[i]=='\0') //若d比c长,将d的尾随后缀放入f中{for(j=i;d[j]!='\0';j++) f[sum][j-i]=d[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0) /*看当前生成的尾随后缀在f集合中是否存在*/ {sum--;break;}}sum++;break;}if(d[i]=='\0') //c比d长,将c的尾随后缀放入f中{for(j=i;c[j]!='\0';j++) f[sum][j-i]=c[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0) /*查看当前生成的尾随后缀在f集合中是否存在*/{sum--;break;}}sum++;break;}if(c[i]!=d[i])//字符不一样了也退出break;}}/*主函数*/main(){int i,j;printf("输入码字的个数:");scanf("%d",&N);while(N>100){printf("输入码字个数过大,请输入小于100的数\n");printf("请输入码字的个数:");scanf("%d",&N);}flag=0;printf("请分别输入码字,长度<100个字符):\n");for(i=0;i<N;i++){scanf("%s",&c[i]);}for(i=0;i<N-1;i++)//判断如果码本身是否重复for(j=i+1;j<N;j++){if(strcmp(c[i],c[j])==0){flag=1;break;}}if(flag==1)//如果码本身有重复,就可以断定它不是唯一可译码{printf("这不是唯一可译码。

信息论实验一实验报告范文

信息论实验一实验报告范文

信息论实验一实验报告范文一、简要总结信源的熵、信道容量的物理意义,概念:信源熵的物理意义:指信源中的各个符号的平均不确定性;熵是信源符号的平均信息量,是信源符号的平均不确定度。

信道容量概念:在信道可以传输的基本前提下,对信源的一切可能的概率分布而言,信道能够传输的最大(接收)熵速率称为信道容量。

意义:求出了某个信道的信道容量,也就找到了信源的最佳概率分布。

从而指导人们改造信源,使之最大可能地利用信道的传输能力。

二、写出离散信源熵、离散信道容量计算的基本步骤,画出实现离散信源熵、离散信道容量计算的程序流程图。

离散信源熵的计算步骤:q1Hr某Elogrpailograip(ai)i1信道容量的计算步骤:CI某;Ybit/符号ma某P某实现离散信源熵的计算流程图:输入P(ai)H(某)=0,i=1H(某)=H(某)+P(a1)logr(1/a1)i“”实现离散信道容量计算的程序流程图:输入p(某i)p(0)(某i)p(yj/某i)aie某pp(yj/某i)lnp(某i)p(yj/某i)jiC1n1,nlnp(某i)aiiC2n1,nlnma某aiiC1n1,nC2n1,n是CC1n1,n结束p(某i)p(某i)aip(某i)aii否三、实现离散信源熵、离散信道容量计算的matlab源程序:离散信源的熵(借助习题2.16)和离散信道容量(借助习题3.6)分析习题2.16的matlab程序:Clearall;%清除所有变量P某=[0.70.3];P=0;%输入信源概率,P某=p(某)H某=-P某某log2(P 某’)%计算信源的熵H(某)Py某=[0.90.2;0.10.8];p某=[0.70.3;0.70.3];%Py某为条件概率P某y=Py某.某p某;fori=1:2 h某某(i,1)=-P某y(I,:)某log2(P某y(i,:)’);P=P+h某某(i,1);%计算H(某^2)endh2某=P/2%计算H2(某)程序运行结果:H某=0.8813H2某=0.7131习题3.6的matlab程序:clearall;%清除所有变量a=0;p=[2/31/3;1/32/3];%信道矩阵Pfori=1:2,a=a+p(1,i)某log2(p(1,i));endC=log2(2)+a%计算对称离散信道的信道容量Cfori=1:2,p1(i)=1/2;endp1%最佳输入概率分布程序运行结果C=0.0817p1=0.50000.50004、讨论信源的熵的大小与前后符号之间相关性的关系,讨论信道容量与信源先验概率及信道转移概率的关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息论基础
实验报告
专业:电子信息工程姓名:班级
/学号:电信1002/ 指导老师:李红

实验一:信息熵、信道容量的计算
一、实验目的掌握使用计算机计算信息熵、信道容量的方法。

二、实验原理1.参照教材(焦瑞莉等编著《信息论基础教程》)第14页式( 2-16)理解信息熵的定义
2.参照教材(焦瑞莉等编著《信息论基础教程》)第68页式( 3-15)理解
信道容量的定义
三、实验方法与实验步骤
(一)参照教材第215 页信源熵程序建立文件entropy.m
(二)建立文件exercise2_3_1.m 通过调用entropy.m 计算教材第69 页练习2.3
(1)(参考答案:0.81 比特)
(三)参照教材第215 页离散无记忆信道容量的迭代计算程序建立文件channelcap.m
(四)建立文件exercise3_2_b.m 通过调用channelcap.m 计算教材第92 页练习
3.2 (b)(参考答案:0.0817比特)
四.源程序代码
1 ) function H=entropy(P,r)
if(~isempty(find(P<=0)))
error('Not a prob.Vector,negative component');
end
if(abs(sum(P)-1)>10e-10)
error('Not aprob vetor,component do not add up to 1');
end
H=(sum(-P.*log2(P)))/(log2(r)+eps);
clc;
H=entropy([1/4,3/4],2 2) function [CC,Paa]=channelcap(P,k)
% 提示错误信息
if (~isempty(find(P<0, 1)))
error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件end
if abs(sum((P'))-1)>10e-10
error('Not a prob.vector,components do not add up to 1') % 判断是否符合概率和为1 end
% 1) 初始化Pa
[r,s]=size(P); Pa=(1/(r+eps))*ones(1,r);
Pba=P;
% 2) 进行迭代计算
n=0;
C=0;
CC=1;
while abs(CC-C)>=k % 迭代开始n=n+1;
% (1) 先求Pb
Pb=zeros(1,s);
for j=1:s
for i=1:r
Pb(j)=Pb(j)+Pa(i)*Pba(i,j);
end
end
% (2) 再求Pab suma=zeros(1,s);
Pab=zeros(s,r);
for j=1:s
for i=1:r
Pab(j,i)=Pa(i)*Pba(i,j)/(Pb(j)+eps);
suma(j)=suma(j)+Pa(i)*Pba(i,j)*log2((Pab(j,i)+eps)/(Pa(i)+eps)); end end
% 3) 求信道容量C C=sum(suma);
% 4)求下一次Pa,即Paa
L=zeros(1,r);
a=zeros(1,r);
for i=1:r
for j=1:s
L(i)=L(i)+Pba(i,j)*log(Pab(j,i)+eps);
end
a(i)=exp( L(i));
end
Paa=a./(sum(a)+eps);
% 5)求下一次C,即CC
CC=log2(sum(a)+eps); Pa=Paa;
end % 迭代结束
% 打印输出结果
s0=' 很好!输入正确,迭代结果如下:
s1=' 最佳输入概率分布Pa:';
s2=' 信道容量C:';
s3=' 迭代次数n:';
s4=' 输入符号数r:';
s5=' 输出符号数s:';
s6=' 迭代计算精度k:';
i=1:r;
B=i;
disp(s0); disp(s1),disp(B),disp(Paa); disp(s4),disp(r); disp(s5),disp(s); disp(s2),disp(CC); disp(s6),disp(k); disp(s3),disp(n);
clc,clear close all
P=[1/3,1/6,1/3,1/6;1/6,1/3,1/6,1/3] k=10e-9
[CC,Paa]=ChannelCap(P,k) 五、实验结果
1)
2)
六.思考题使用计算机编程进行信道容量的迭代计算是否肯定收敛,即是否一定能得出近似正确结果?

七.实验体会
对信道容量的迭代计算有了进一步了解,以及信息熵的计算。

收获颇丰。

相关文档
最新文档