信息论实验报告(共22页).doc

上传人:飞****2 文档编号:13872395 上传时间:2022-05-01 格式:DOC 页数:22 大小:362KB
返回 下载 相关 举报
信息论实验报告(共22页).doc_第1页
第1页 / 共22页
信息论实验报告(共22页).doc_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《信息论实验报告(共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;专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁