信息论实验报告_第1页
信息论实验报告_第2页
信息论实验报告_第3页
信息论实验报告_第4页
信息论实验报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、信息论实验报告学生: 班级:学号:实验一 香农编码一、 程序设计的流程图开始 输入N输入信源概率X(N)由大到小排序求累加概率累加概率转为二进制确定码长Ki求码字输出码字结束二、程序清单#include <iostream>#include<math.h>#include<string>using namespace std;void s *x,double *y);int main() int N; cout<<"输入信源个数"<<endl; cin>>N; double SN; /注意变量在数组中的

2、影响 cout<<"输入信源概率"<<endl; for(int i=0;i<N;i+) cin>>Si; for(int i=0;i<N;i+) for(int j=i;j<N;j+) if(Si<Sj) swap(Si,Sj); int nmN; for(int i=0;i<N;i+) nmi=int(-(log(Si)/log(2)+1; if(nmi=(-(log(Si)/log(2)+1) nmi-; double AAN; AA0=S0; for(int i=1;i<N;i+ ) AAi=A

3、Ai-1+Si; string MMN; for(int i=0;i<N;i+) double tem=0; double aa=AAi; for(int j=0;j<N;j+) tem=aa*2; if(tem>1) MMi+='1' aa=tem-1; else MMi+='0' aa=tem; string BBN; for(int i=0;i<N;i+) for(int j=0;j<nmi;j+) BBi+=MMij; cout<<"输出编码"<<endl; for(int i=0

4、;i<N;i+) cout<<BBi<<endl;void s &x,double &y) double a; a=x; x=y; y=a;实验二.费洛编码.一、 流程图 开始输入信源个数n输入信源符号sing【i】输入信源符号概率平p【i】按p【i】从小到大排序N-1>=1? N调用fano()进行编码 Y编码输出结束二、程序清单#include <iostream>#include<string>#include<math.h>using namespace std;void dw(int n,int

5、H,int W,double *si,string *m);int main() int N; cout<<"输入信源个数"<<endl; cin>>N; double SN; cout<<"输入信源概率"<<endl; for(int i=0;i<N;i+) cin>>Si; for(int i=0;i<N;i+) for(int j=i;j<N;j+) if(Si<Sj) double a; a=Si; Si=Sj; Sj=a; string MMN; d

6、w(N,0,N-1,S,MM); cout<<"输出编码"<<endl; for(int i=0;i<N;i+) cout<<MMi<<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 bn; for(int i=H;i<=W;i+) sm+=*(si+i); bi=fabs(2*s

7、m-sum)/sum; int ZH; double a=bH; for(int i=H;i<=W;i+) if(bi<=a) a=bi; ZH=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,

8、W,ss,mm); 实验三.霍夫曼 开始一、程序流程图输入lettersStrcmp(“%是”,是) 否 是计算字符个数与出现次数I+输出letersI<cnt? 是 否条用霍夫曼编码结束二、 程序清单#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 h

9、c(string m);void nv(string *m,int n);int main() int N; cout<<"输入信源个数"<<endl; cin>>N; double *S=new doubleN; cout<<"输入信源概率"<<endl; for(int i=0;i<N;i+) cin>>Si; string *MM=new stringN; for(int i=0;i<N;i+) for(int j=i;j<N;j+) if(Si<Sj)

10、 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;i<N;i+) cout<<MMi<<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;

11、i+) HuffNodei.weight=0; HuffNodei.parent=-1; HuffNodei.lchild=-1; HuffNodei.rchild=-1; for (i=0;i<n;i+) HuffNodei.weight=sii; for (i=0;i<n-1;i+) m1=m2=1; x1=x2=0; for (j=0;j<n+i;j+) if (HuffNodej.parent=-1&&HuffNodej.weight<m1) m2=m1; x2=x1; m1=HuffNodej.weight; x1=j; else if (Hu

12、ffNodej.parent=-1&&HuffNodej.weight<m2) 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;i<n;i+) c=i; p= HuffNodec.parent; while(p!=-1) if(HuffNodep.lch

13、ild =c) mi+='0' else mi+='1' c=p; p=HuffNodec.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;i<n;i+) b=hc(mi); for(int j=0;j<b;j+) mnj=mib-j-1; mi=mn; 实验四.信道一、程序流程图 开始均匀分布迭代计算器k=0C(K+1)输出结果K=k+1

14、结束否是三、 程序清单#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 doubleni; double *So=new doublen

15、o; cout<<"输入信源概率"<<endl; for (i=0;i<ni;i+) cin>>Sii; cout<<endl; /再输入信道转移概率矩阵/注意进行判断,某行如果总概率大于1,则出现错误应从新输入 cout<<"输入转移概率:"<<endl; float *p; /转移条件概率 p=new float *ni; for (i=0;i<ni;i+) pi=new floatno; for (i=0;i<ni;i+) for (j=0;j<no;j

16、+) cin>>pij; for (i=0;i<ni;i+) float a=0; for (j=0;j<no;j+) a+=pij; if (a!=1.0) cout<<"输入数据有误,请检查后再次输入。"<<endl; float *pp; /后验概率 pp=new float *ni; for (i=0;i<ni;i+) ppi=new floatno; float C_Pre,C; /当前信道容量和前一次循环信道容量 C=10.0; double Pe=0.000001; /两次信道容量相差的阈值 int r=0

17、; /迭代次数 float *p_up; /计算第r+1次循环输入分布p_in分子 p_up=new floatni; float p_down; /计算第r+1次循环输入分布p_in分母 do r+;/求第r次循环反条件概率p_ij for (j=0;j<no;j+) Soj=0.0; for (i=0;i<ni;i+) Soj+=pij*Sii; if (Soj>0) for (i=0;i<ni;i+) ppij=Sii*pij/Soj; /p(xy)/w(y),p(xy)=p(y/x)*p(x) else for (i=0;i<ni;i+) ppij=0;

18、/求第r+1次循环输入分布p_in p_down=0.0; for (i=0;i<ni;i+) p_upi=0.0; for (j=0;j<no;j+) if (ppij>=0.000001) p_upi+=pij*log(ppij)/log(2.0); p_upi=pow(2.0,p_upi); p_down+=p_upi; for (i=0;i<ni;i+) Sii=p_upi/p_down; /求C(r+1) C_Pre=C; C=log(p_down)/log(2.0); cout<<"第"<<r<<&qu

19、ot;次的容量为:"<<C<<endl; while (fabs(C-C_Pre)/C>Pe); cout<<"迭代的次数为:"<<r<<endl;实验五.循环码一、程序流程图退出输入码长nSwitch(n)生成多项式系数矩阵输入校验位输入信源信息向量cUx(g,c,r,n)X=1?X(g,c,r,n)开始选择编码方式序号二、 程序清单#include<iostream>#include <stdlib.h>using namespace std;int N;void UX(

20、int *g,int *c,int r,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)*n"<<endl; cout<<"t输入码长n:"<<endl; cin>>m; n=m; switch(n)/求生成多项式 case 1 :cout<<"输入校验位r<=%d:,"<<

21、n-1<<endl; cin>>r; switch(r) case 0:g0=1;break; break; case 2 :cout<<"输入校验位r<=%d:"<<n-1<<endl; cin>>r; switch(r) case 0:g0=1;break; case 1:g0=1;g1=1;break; break; case 3 :cout<<"输入校验位r<=%d:"<<n-1<<endl; cin>>r; swi

22、tch(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-1<<endl; cin>>r; 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

23、 :cout<<"输入校验位r<=%d:"<<n-1<<endl; cin>>r; switch(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-1<<endl; cin>>r; switch(r) case 0:g0=1;break; case 1:g

24、0=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;g3=1;g4=1;g5=1;break; break; case 7 :cout<<"输入校验位r<=%d:"<<n-1<<endl; cin>>r; switch(r) case 0 :g0=1;break; case 1 :g0=1;g1=

25、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-1<<endl; cin>>r; switch(r) case 0 :g0=1;break; case 1 :g0=1;g1=1;break; case 2 :g0=1;g1=0;

26、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 :cout<<"输入校验位r<=%d:"<<

27、n-1<<endl; cin>>r; 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;

28、g1=0;g2=1;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-1<<endl; cin>>r; 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=

29、0;g2=0;g3=1;break; case 4 :g0=1;g1=1;g2=1;g3=1;g4=1;break; case 5 :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<<

30、;"生成多项式系数矩阵为(幂次从低到高):n"<<endl; for(i=0;i<=n-1;i+) cout<<gi<<" "/生成多项式g(x) cout<<"输入信源信息向量c(%d位):n"<<n-r<<endl; for(i=0;i<=n-r-1;i+) cin>>ci; cout<<"t*选择编码方式及命令*n"<<endl; cout<<"t 1:系统编码n"<<endl; cout<<"t 2:非系统编码n"<<endl; cout<<"t 3:退出程序!n"<<endl; cout<<"t*n"<<endl; cin>>t; switch(t) case 1 :X(g,c,r,n);break; case 2 :UX(g,c,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论