《信息论实验报告(共22页).doc》由会员分享,可在线阅读,更多相关《信息论实验报告(共22页).doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上信息论实验报告学生: 班级:学号:实验一 香农编码一、 程序设计的流程图开始 输入N输入信源概率X(N)由大到小排序求累加概率累加概率转为二进制确定码长Ki求码字输出码字结束二、程序清单#include #include#includeusing namespace std;void swap(double *x,double *y);int main() int N; cout输入信源个数N; double SN; /注意变量在数组中的影响 cout输入信源概率endl; for(int i=0;iSi; for(int i=0;iN;i+) for(int j=i
2、;jN;j+) if(SiSj) swap(Si,Sj); int nmN; for(int i=0;iN;i+) nmi=int(-(log(Si)/log(2)+1; if(nmi=(-(log(Si)/log(2)+1) nmi-; double AAN; AA0=S0; for(int i=1;iN;i+ ) AAi=AAi-1+Si; string MMN; for(int i=0;iN;i+) double tem=0; double aa=AAi; for(int j=0;j1) MMi+=1; aa=tem-1; else MMi+=0; aa=tem; string BBN;
3、 for(int i=0;iN;i+) for(int j=0;jnmi;j+) BBi+=MMij; cout输出编码endl; for(int i=0;iN;i+) coutBBi=1? N调用fano()进行编码 Y编码输出结束二、程序清单#include #include#includeusing namespace std;void dw(int n,int H,int W,double *si,string *m);int main() int N; cout输入信源个数N; double SN; cout输入信源概率endl; for(int i=0;iSi; for(int i
4、=0;iN;i+) for(int j=i;jN;j+) if(SiSj) double a; a=Si; Si=Sj; Sj=a; string MMN; dw(N,0,N-1,S,MM); cout输出编码endl; for(int i=0;iN;i+) coutMMi=1) for(int j=H;j=W;j+) sum+=*(si+j); double bn; for(int i=H;i=W;i+) sm+=*(si+i); bi=fabs(2*sm-sum)/sum; int ZH; double a=bH; for(int i=H;i=W;i+) if(bi=a) a=bi; ZH
5、=i; for(int i=H;i=W;i+) if(i=ZH) mi+=0; else mi+=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); 实验三.霍夫曼 开始一、程序流程图输入lettersStrcmp(“%是”,是) 否 是计算字符个数与出现次数I+输出letersIcnt? 是 否条用霍夫曼编码结束二、 程序清单#inc
6、lude#includeusing 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输入信源个数N; double *S=new doubleN; cout输入信源概率endl; for(int i=0;iSi; string *MM=new
7、 stringN; for(int i=0;iN;i+) for(int j=i;jN;j+) if(SiSj) double a; a=Si; Si=Sj; Sj=a; HNode *node=new HNode2*N-1; HuffmanTree(node,N,S,MM); nv(MM,N); cout输出编码endl; for(int i=0;iN;i+) coutMMiendl;void HuffmanTree(HNode *HuffNode,int n,double *si,string *m) int i,j,x1,x2,c,p; float m1,m2; for (i=0;i2*
8、n-1;i+) HuffNodei.weight=0; HuffNodei.parent=-1; HuffNodei.lchild=-1; HuffNodei.rchild=-1; for (i=0;in;i+) HuffNodei.weight=sii; for (i=0;in-1;i+) m1=m2=1; x1=x2=0; for (j=0;jn+i;j+) if (HuffNodej.parent=-1&HuffNodej.weightm1) m2=m1; x2=x1; m1=HuffNodej.weight; x1=j; else if (HuffNodej.parent=-1&Huf
9、fNodej.weightm2) m2=HuffNodej.weight; x2=j; HuffNodex1.parent=n+i; HuffNodex2.parent=n+i; HuffNoden+i.weight=HuffNodex1.weight+HuffNodex2.weight; HuffNoden+i.lchild=x1; HuffNoden+i.rchild=x2; for(i=0;in;i+) c=i; p= HuffNodec.parent; while(p!=-1) if(HuffNodep.lchild =c) mi+=0; else mi+=1; c=p; p=Huff
10、Nodec.parent; int hc(string m) int a=0; for(int i=0;mi!=0;i+) a+; return a;void nv(string *m,int n)char mnn; int b; for(int i=0;in;i+) b=hc(mi); for(int j=0;jb;j+) mnj=mib-j-1; mi=mn; 实验四.信道一、程序流程图 开始均匀分布迭代计算器k=0C(K+1)输出结果K=k+1结束否是三、 程序清单#include #include #include using namespace std;int main() int
11、ni,no; int i,j; cout输入信源个数ni; cout输出信源个数no; double *Si=new doubleni; double *So=new doubleno; cout输入信源概率endl; for (i=0;iSii; coutendl; /再输入信道转移概率矩阵/注意进行判断,某行如果总概率大于1,则出现错误应从新输入 cout输入转移概率:endl; float *p; /转移条件概率 p=new float *ni; for (i=0;ini;i+) pi=new floatno; for (i=0;ini;i+) for (j=0;jpij; for (i
12、=0;ini;i+) float a=0; for (j=0;jno;j+) a+=pij; if (a!=1.0) cout输入数据有误,请检查后再次输入。endl; float *pp; /后验概率 pp=new float *ni; for (i=0;ini;i+) ppi=new floatno; float C_Pre,C; /当前信道容量和前一次循环信道容量 C=10.0; double Pe=0.; /两次信道容量相差的阈值 int r=0; /迭代次数 float *p_up; /计算第r+1次循环输入分布p_in分子 p_up=new floatni; float p_dow
13、n; /计算第r+1次循环输入分布p_in分母 do r+;/求第r次循环反条件概率p_ij for (j=0;jno;j+) Soj=0.0; for (i=0;i0) for (i=0;ini;i+) ppij=Sii*pij/Soj; /p(xy)/w(y),p(xy)=p(y/x)*p(x) else for (i=0;ini;i+) ppij=0; /求第r+1次循环输入分布p_in p_down=0.0; for (i=0;ini;i+) p_upi=0.0; for (j=0;j=0.) p_upi+=pij*log(ppij)/log(2.0); p_upi=pow(2.0,p
14、_upi); p_down+=p_upi; for (i=0;ini;i+) Sii=p_upi/p_down; /求C(r+1) C_Pre=C; C=log(p_down)/log(2.0); cout第r次的容量为:CPe); cout迭代的次数为:rendl;实验五.循环码一、程序流程图退出输入码长nSwitch(n)生成多项式系数矩阵输入校验位输入信源信息向量cUx(g,c,r,n)X=1?X(g,c,r,n)开始选择编码方式序号二、 程序清单#include#include using namespace std;int N;void UX(int *g,int *c,int r,
15、int n);void X(int *g,int *c,int r,int n);int main() N=10; int i,n,m,t,r; int gN,cN; cout*循环码编码方法(码长n=10)*nendl; coutt输入码长n:m; n=m; switch(n)/求生成多项式 case 1 :cout输入校验位r=%d:,n-1r; switch(r) case 0:g0=1;break; break; case 2 :cout输入校验位r=%d:n-1r; switch(r) case 0:g0=1;break; case 1:g0=1;g1=1;break; break;
16、 case 3 :cout输入校验位r=%d:n-1r; switch(r) case 0:g0=1;break; case 1:g0=1;g1=1;break; case 2:g0=1;g1=1;g2=1;break; break; case 4 :cout输入校验位r=%d:n-1r; switch(r) case 0:g0=1;break; case 1:g0=1;g1=1;break; case 2:g0=1;g1=0;g2=1;break; case 3:g0=1;g1=1;g2=1;g3=1;break; break; case 5 :cout输入校验位r=%d:n-1r; swi
17、tch(r) case 0:g0=1;break; case 1:g0=1;g1=1;break; case 4:g0=1;g1=1;g2=1;g3=1;g4=1;break; break; case 6 :cout输入校验位r=%d:n-1r; switch(r) case 0:g0=1;break; case 1:g0=1;g1=1;break; case 2:g0=1;g1=1;g2=1;break; case 3:g0=1;g1=0;g2=0;g3=1;break; case 4:g0=1;g1=0;g2=1;g3=0;g4=1;break; case 5:g0=1;g1=1;g2=1
18、;g3=1;g4=1;g5=1;break; break; case 7 :cout输入校验位r=%d:n-1r; switch(r) case 0 :g0=1;break; case 1 :g0=1;g1=1;break; case 3 :g0=1;g1=0;g2=1;g3=1;break; case 4 :g0=1;g1=1;g2=1;g3=0;g4=1;break; case 6 :g0=1;g1=1;g2=1;g3=1;g4=1;g5=1; g6=1;break; break; case 8 :cout输入校验位r=%d:n-1r; switch(r) case 0 :g0=1;bre
19、ak; case 1 :g0=1;g1=1;break; case 2 :g0=1;g1=0;g2=1;break; case 3 :g0=1;g1=1;g2=1;g3=1;break; case 4 :g0=1;g1=0;g2=0;g3=0;g4=1;break; case 5 :g0=1;g1=1;g2=0;g3=0;g4=1;g5=1;break; case 6 :g0=1;g1=0;g2=1;g3=0;g4=1;g5=0; g6=1;break; case 7 :g0=1;g1=1;g2=1;g3=1;g4=1;g5=1;g6=1; g7=1;break; break; case 9
20、:cout输入校验位r=%d:n-1r; switch(r) case 0 :g0=1;break; case 1 :g0=1;g1=1;break; case 2 :g0=1;g1=0;g2=1;break; case 3 :g0=1;g1=0;g2=0;g3=1;break; case 4 :g0=1;g1=0;g2=1;g3=0;g4=1;break; case 5 :g0=1;g1=1;g2=1;g3=1;g4=1;g5=1;break; case 6 :g0=1;g1=1;g2=0;g3=1;g4=0;g5=1; g6=1;break; case 7 :g0=1;g1=0;g2=1;
21、g3=1;g4=1;g5=1; g6=0;g7=1;break; case 8 :g0=1;g1=1;g2=1;g3=1;g4=1;g5=1;g6=1; g7=1;g8=1;break; break; case 10 :cout输入校验位r=%d:n-1r; switch(r) case 0 :g0=1;break; case 1 :g0=1;g1=1;break; case 2 :g0=1;g1=0;g2=1;break; / case 3 :g0=1;g1=0;g2=0;g3=1;break; case 4 :g0=1;g1=1;g2=1;g3=1;g4=1;break; case 5 :
22、g0=1;g1=0;g2=0;g3=0;g4=0;g5=1;break; case 6 :g0=1;g1=1;g2=0;g3=0;g4=0; g5=1;g6=1;break; case 8 :g0=1;g1=0;g2=1;g3=0;g4=1; g5=0;g6=1;g7=0;g8=1;break; case 9 :g0=1;g1=1;g2=1;g3=1;g4=1;g5=1; g6=1;g7=1;g8=1;g9=1;break; break; cout生成多项式系数矩阵为(幂次从低到高):nendl; for(i=0;i=n-1;i+) coutgi ;/生成多项式g(x) cout输入信源信息向
23、量c(%d位):nn-rendl; for(i=0;ici; coutt*选择编码方式及命令*nendl; coutt 1:系统编码nendl; coutt 2:非系统编码nendl; coutt 3:退出程序!nendl; coutt*nt; switch(t) case 1 :X(g,c,r,n);break; case 2 :UX(g,c,r,n);break; case 3 :cout退出程序;exit(0);break; void UX(int *g,int *c,int r,int n) int aN2*N,xN; int i,j,k,sum=0; /二进制乘法 for(j=0;j
24、=n-r-1;j+) for(i=0;ij;i+) aji=0; for(i=0;i=n-1;i+) aji+j=cj*gi; for(k=i+j;k=2*n-r-2;k+) ajk=0; for(j=0;j=2*n-r-2;j+) sum=0; for(i=0;i=n-r-1;i+) sum=(aij+sum)%2; xj=sum; /输出 cout非系统编码的结果:nendl; for(j=0;j=n-1;j+) coutxjendl;void X(int *g,int *c,int r,int n) int degg,degc,i,k,j,t,e,u,sum=0; int dN2*N,C
25、N,RN,aN2*N,qN; degg=r; /求信息多项式的次幂 for(i=0;i=n-r-1;i+) if(ci!=0) degc=n-i-1;break; for(i=0;iN;i+) qi=gi; Ri=ci; k=degc-degg; e=k; /二进制除法实现 for(j=0;jN;j+) for(i=0;i=e;i-) t=qi;qi=qi-e;qi-e=t; for(i=0;i=n-1;i+) ci=(ci+qn-1-i)%2;for(i=0;i=n-1;i+) if(ci!=0) degc=n-i-1;break; e=degc-degg; u=j; if(e0)break; for(i=0;i=n-1;i+) Ci=(Ri+ci)%2; cout系统编码的结果为:nendl; for(j=0;j=n-1;j+) coutCjendl;专心-专注-专业