《信息论与编码》课程实验报告.docx
- 文档编号:10196657
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:27
- 大小:101.23KB
《信息论与编码》课程实验报告.docx
《《信息论与编码》课程实验报告.docx》由会员分享,可在线阅读,更多相关《《信息论与编码》课程实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
《信息论与编码》课程实验报告
《信息论与编码》
课程实验报告1
项目名称:
二维随机变量信息量的计算
学生姓名:
学生学号:
指导教师:
完成日期:
2011年12月24日
1、实验目的
通过上机实习实现对信源及其熵的运算对课本知识的认识上加于运用并熟悉其算法过程;熟悉二变量多种信息量的计算方法,设计实验的数据结构和算法。
2、实验内容
(1)利用random函数和归一化方法构造一个二维离散随机变量(X,Y);
(2)分别计算X与Y的熵、联合熵、条件熵:
H(X)、H(Y)、H(X,Y)H(X|Y)、I(X|Y);
3、数据结构与算法描述
(1)函数及子函数的定义
for(i=0;i for(j=0;j { arr[i][j]=(double)(rand()%100+1); sum+=arr[i][j]; } for(i=0;i for(j=0;j arr[i][j]/=sum;实现N维随机变量 hx+=log2(x[i])*x[i]x熵的计算 hy+=log2(y[i])*y[i]y熵的计算 hxy+=arr[i][j]*log2(arr[i][j])联合熵的计算公式 (2)主函数main()实现初始化操作,完成对子函数的调用 (3)子函数 doublelog2(doublex)实现将二的对数的转换 voidgetarr(intn,intm)随机产生N维离散变量(X,Y) voiddisparr(intn,intm)实现输出并归一化的联合矩阵 doublegeth_x(intn,intm)求X的熵 doublegeth_y(intn,intm)求Y的熵 doublegeth_xy(intn,intm)求XY的联合熵 doubleget_y_x(intn,intm)求H(Y|X) doubleget_x_y(intn,intm)求H(X|Y) voidIu()求平均互信息 4、实验结果 5、实验结果分析与体会 对该实验结果进行分析并没有发现大的问题,实验结果还趋于正常;通过本次试验使我更加了解了信源及其熵的数学模型和计算方法并通过在计算机编程培养了我们的动手能力为我们以后的工作起了一定的作用。 6、源程序: #include #include #include #include #defineN100 doublearr[N][N]={0}; intn,m; doublelog2(double); voidgetarr(int,int); voiddisparr(int,int); doublegeth_x(int,int); doublegeth_y(int,int); doublegeth_xy(int,int); doubleget_y_x(int,int); doubleget_x_y(int,int); voidIu(); voidmain() { doublehx,hy,hxy,hx_y,hy_x; printf("输入矩阵的行数: n="); scanf("%d",&n); printf("输入矩阵的列数: m="); scanf("%d",&m); getarr(n,m); disparr(n,m); hx=geth_x(n,m); printf("x的熵: H(X)=%f",hx); hy=geth_y(n,m); printf("\ny的熵: H(Y)=%f",hy); hxy=geth_xy(n,m); printf("\nxy联合熵: H(XY)=%f",hxy); hx_y=get_y_x(n,m); printf("\ny|x的熵: H(x|y)=%f",hx_y); hy_x=get_x_y(n,m); printf("\nx|y的熵: H(y|x)=%f",hy_x); Iu(); } doublelog2(doublex) { return(log(1./x)/log (2)); } voidgetarr(intn,intm) { inti,j; doublesum=0; srand((unsignedint)(time(NULL))); for(i=0;i for(j=0;j { arr[i][j]=(double)(rand()%100+1); sum+=arr[i][j]; } for(i=0;i for(j=0;j arr[i][j]/=sum; } voiddisparr(intn,intm) { inti,j; printf("联合矩阵: P(x,y)=\n"); for(i=0;i { for(j=0;j printf("%f",arr[i][j]); printf("\n\n"); } } doublegeth_x(intn,intm) { inti,j; doublehx=0; doublex[N]={0}; for(i=0;i for(j=0;j x[i]+=arr[j][i]; for(i=0;i hx+=log2(x[i])*x[i]; returnhx; } doublegeth_y(intn,intm) { inti,j; doublehy=0; doubley[N]={0}; for(i=0;i for(j=0;j y[i]+=arr[i][j]; for(i=0;i hy+=log2(y[i])*y[i]; returnhy; } doublegeth_xy(intn,intm) { inti,j; doublehxy=0; for(i=0;i for(j=0;j hxy+=arr[i][j]*log2(arr[i][j]); returnhxy; } doubleget_y_x(intn,intm) { doublexx,yy; xx=geth_xy(n,m); yy=geth_x(n,m); return(xx-yy); } doubleget_x_y(intn,intm) { doublexx,yy; xx=geth_xy(n,m); yy=geth_y(n,m); return(xx-yy); } voidIu() { printf("\n平均互信息: I(X: Y)=%f\n",(geth_x(n,m)-get_x_y(n,m))); } ………………………… 上课纪律(20%) 实验过程及结果(40%) 实验报告质量(40%) 总分: 教师签字: 《信息论与编码》 课程实验报告2 项目名称: 简单信源编码方法实现 学生姓名: 学生学号: 指导教师: 完成日期: 2011年12月24日 1、实验目的 掌握香农编码方法并用程序实现。 2、实验内容 (1)对已知的信源相应的概率进行编码; (2)分别对X中的字符进行香农编码; (3)有能力的同学,完成对X中的字符进行Huffman编码。 3、数据结构与算法流程 d[i]=(int)(-log(a[i])/log (2))对计算相应信源符号的码长 for(i=1;i { pp[i]=pp[i-1]+a[i-1]; }计算各对应信源符号的累加概率 for(i=0;i { printf("a[%d]\t",i); for(j=0;j { if(2*pp[i]>=1) { printf("1"); pp[i]=2*pp[i]-1; } else { printf("0"); pp[i]=2*pp[i]; } } printf("\n"); }计算各对应信源符号的码字 4、实验数据与实验结果 5、实验结果分析与体会 本程序通过输入N个信源的概率对其进行香农编码,并运用书上的例题结果并无差异,但是并没有对概率进行排序还有待于提高;通过这次试验让我更加了解了香农编码的过程及其的算法。 6、源程序: #include #include #include #include #include voidmain() { floata[100],p=0.0,pp[100]; doublec[100]; intb[100],d[100]; intn,i,j; printf("输入信源符号的个数: "); scanf("%d",&n); printf("输入各信源对应的概率并按0结束: \n"); for(i=0;i scanf("%f\n",&a[i]); printf("输入的信源概率是: \n"); for(i=0;i printf("a[%d]=%f\t",i,a[i]); printf("\n"); for(i=0;i { c[i]=(-log(a[i])/log (2)); d[i]=(int)(-log(a[i])/log (2)); if((c[i]-d[i])>0) b[i]=(int)c[i]+1; else b[i]=d[i]; } printf("各信源对应码长: \n"); for(i=0;i printf("b[%d]=%d\t",i,b[i]); pp[0]=0.0; for(i=1;i { pp[i]=pp[i-1]+a[i-1]; } printf("\n"); printf("各信源对应累加概率: \n"); for(i=0;i printf("pp[%d]=%f\t",i,pp[i]); printf("\n"); printf("各信源对应的码字: \n"); for(i=0;i { printf("a[%d]\t",i); for(j=0;j { if(2*pp[i]>=1) { printf("1"); pp[i]=2*pp[i]-1; } else { printf("0"); pp[i]=2*pp[i]; } } printf("\n"); } } ………………………… 上课纪律(20%) 实验过程及结果(40%) 实验报告质量(40%) 总分: 教师签字: 《信息论与编码》 课程实验报告3 项目名称: 典型信道容量计算方法实现 学生姓名: 学生学号: 指导教师: 完成日期: 2011年12月24日 1、实验目的 掌握用递推算法计算典型信道的容量的方法并用程序实现。 2、实验内容 (1)利用random函数和归一化方法构造一个N维离散随机变量(X,Y)概率转移矩阵; (2)用递推算法计算(或直接计算)各种二进信道的容量; 3、数据结构与算法描述 double*sum1=NULL; sum1=(double*)calloc(r,sizeof(double));定义指针变量并为该变量申请向的空间 for(i=0;i {for(j=0;j { p_ji[i][j]=(double)(rand()%100+1); sum1[i]+=p_ji[i][j]; } } for(i=0;i for(j=0;j { p_ji[i][j]/=sum1[i]; printf("%f\t",p_ji[i][j]); } printf("\n"); free(sum1);用rand和归一化的方法产生随机N维信道转移概率矩阵并输出后释放空间 for(i=0;i { sum[i]=0.0; for(j=0;j { if(fabs(q_ij[i][j]>=DEL)) sum[i]+=p_ji[i][j]*log(q_ij[i][j])/log(2.0); } sum[i]=pow(2.0,sum[i]); p_j+=sum[i]; } for(i=0;i { p_i[i]=sum[i]/p_j; }运用迭代方法计算信道容量 4、实验数据与实验结果 5、实验结果分析与体会 在本次实验中我遇到很多问题不管是指针的运算,随机转移矩阵输出规范还有就是信道容量的计算;虽然有些问题解决了,但是还有些问题不知道咋办。 就是在输出的时候不知道哪有错虽然输出了结果但是要出错希望以后能够提高。 、 通过这次实验了解了信道容量的计算和程序的实现,虽然在实验中遇到了很大麻烦但是它们让我进步了不少,也增进了知识。 6、源程序: #include #include #include #defineDEL1e-6 #include voidmain() { registerinti,j; registerintk; intr,s; double*sum1=NULL; double*p_i=NULL; double**p_ji=NULL; double**q_ij=NULL; doubleC,C_pre,validate; double*sum=NULL; doublep_j; printf("输入概率转移矩阵的行数r="); scanf("%d",&r); printf("输入概率转移矩阵的列数s="); scanf("%d",&s); p_i=(double*)calloc(r,sizeof(double)); p_ji=(double**)calloc(r,sizeof(double)); for(i=0;i { p_ji[i]=(double*)calloc(s,sizeof(double)); } q_ij=(double**)calloc(r,sizeof(double*)); for(i=0;i { q_ij[i]=(double*)calloc(s,sizeof(double)); } sum1=(double*)calloc(r,sizeof(double)); srand((unsignedint)(time(NULL))); printf("随机转移矩阵为: \n"); printf("\n"); for(i=0;i {for(j=0;j { p_ji[i][j]=(double)(rand()%100+1); sum1[i]+=p_ji[i][j]; } } for(i=0;i for(j=0;j { p_ji[i][j]/=sum1[i]; printf("%f\t",p_ji[i][j]); } printf("\n"); free(sum1); for(i=0;i { validate=0.0; for(j=0;j {validate+=p_ji[i][j];} } for(i=0;i {p_i[i]=1.0/(double)r;} C=-200; k=0; sum=(double*)calloc(r,sizeof(double)); do { k++; for(j=0;j { p_j=0.0; for(i=0;i p_j+=p_i[i]*p_ji[i][j]; if(fabs(p_j)>=DEL) for(i=0;i q_ij[i][j]=p_i[i]*p_ji[i][j]/p_j; else for(i=0;i q_ij[i][j]=0.0; } p_j=0.0; for(i=0;i { sum[i]=0.0; for(j=0;j { if(fabs(q_ij[i][j]>=DEL)) sum[i]+=p_ji[i][j]*log(q_ij[i][j])/log(2.0); } sum[i]=pow(2.0,sum[i]); p_j+=sum[i]; } for(i=0;i { p_i[i]=sum[i]/p_j; } C_pre=C; C=log(p_j)/log(2.0); }while(fabs(C-C_pre)/C>DEL); free(sum); sum=NULL; printf("\n"); //printf("迭代次数: %d\n\n",k); printf("信道容量: %.6fbit/symblo\n\n",C); printf("最大入口分布: "); for(i=0;i printf("%.6f",p_i[i]); printf("\n"); for(i=s-1;i>=0;i--) { free(q_ij[i]); q_ij[i]=NULL; } free(q_ij); q_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); } ……………………… 上课纪律(20%) 实验过程及结果(40%) 实验报告质量(40%) 总分: 教师签字: 《信息论与编码》 课程实验报告4 项目名称: CRC_32的生成与校验 学生姓名: 学生学号: 指导教师: 完成日期: 2011年12月24日 1、实验目的 通过对书上循环冗余校验码(CRC)的认识推广到16位、32位校验码的生成,并通过实验巩固理论知识。 2、实验内容 1、生成Crc32的查询表 2、计算CRC32校验值 3、数据结构与算法描述 函数名: GetCrc32 函数原型: unsignedintGetCrc32(char*InStr,unsignedintlen) 参数: InStr---指向需要计算CRC32值的字符串 len---为InStr的长度 返回值为计算出来的CRC32结果。 函数名: GetCrc16 函数原型: unsignedshortGetCrc16(char*InStr,unsignedintlen) 参数: InStr---指向需要计算CRC32值的字符串 len---为InStr的长度 返回值为计算出来的CRC16结果。 unsignedintCrc32Table[256]; inti,j; unsignedintCrc; for(i=0;i<256;i++) { Crc=i; for(j=0;j<8;j++){ if(Crc&1) Crc=(Crc>>1)^0xEDB88320; else Crc>>=1; } Crc32Table[i]=Crc; }生成Crc32的查询表 Crc=0xffffffff; for(i=0;i { Crc=(Crc>>8)^Crc32Table[(Crc&0xFF)^InStr[i]]; } Crc^=0xFFFFFFFF; returnCrc; }开始计算CRC32校验值 CRC16方法和CRC32的方法一样 4、实验数据与实验结果 5、实验结果分析与体会 通过网上查阅资料和对课本知识的理解,其实本程序只是按照相应的算法对要进行循环冗余校验码的字符进行校验的,结果应该没什么差异。 通过本次实验加强了对循环冗余校验码知识的理解并通过上机实习加强了动手能力,提高了自己知识水平。 6、源程序: unsignedintGetCrc32(char*InStr,unsignedintlen) { //生成Crc32的查询表 unsignedintCrc32Table[256]; inti,j; unsignedintCrc; for(i=0;i<256;i++) { Crc=i; for(j=0;j<8;j++){ if(Crc&1) Crc=(Crc>>1)^0xEDB88320; else Crc>>=1; } Crc32Table[i]=Crc; } //开始计算CRC32校验值 Crc=0xffffffff; for(i=0;i { Crc=(Crc>>8)^Crc32Table[(Crc&0xFF)^InStr[i]]; } Crc^=0xFFFFFFFF; returnCrc; } unsignedshortGetCrc16(char*InStr,unsignedintlen) { //生成Crc16的查询表 unsignedshortCrc16Table[256]; unsignedinti,j; unsignedshortCrc; for(i=0;i<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论与编码 信息论 编码 课程 实验 报告