《信息论与编码》课程实验报告_第1页
《信息论与编码》课程实验报告_第2页
《信息论与编码》课程实验报告_第3页
《信息论与编码》课程实验报告_第4页
《信息论与编码》课程实验报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、信息论与编码课 程 实 验 报 告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;in;i+) for(j=0;jm;j+) arrij=

2、(double)(rand()%100+1); sum+=arrij; for(i=0;in;i+) for(j=0;jm;j+) arrij/=sum; 实现N维随机变量 hx+=log2(xi)*xi x 熵的计算hy+=log2(yi)*yi y 熵的计算hxy+=arrij*log2(arrij) 联合熵的计算公式 (2)主函数main() 实现初始化操作,完成对子函数的调用 (3)子函数 double log2(double x) 实现将二的对数的转换 void getarr(int n,int m) 随机产生N维离散变量(X,Y) void disparr(int n,int m)

3、 实现输出并归一化的联合矩阵 double geth_x(int n,int m) 求X的熵 double geth_y(int n,int m) 求Y的熵 double geth_xy(int n,int m) 求X Y的联合熵 double get_y_x(int n,int m) 求H(Y|X) double get_x_y(int n,int m) 求H(X|Y)void Iu() 求平均互信息4、实验结果5、实验结果分析与体会 对该实验结果进行分析并没有发现大的问题,实验结果还趋于正常;通过本次试验使我更加了解了信源及其熵的数学模型和计算方法并通过在计算机编程培养了我们的动手能力为我

4、们以后的工作起了一定的作用。6、 源程序:#include #include #include #include #define N 100double arrNN=0;int n,m;double log2(double);void getarr(int,int);void disparr(int,int);double geth_x(int,int);double geth_y(int,int);double geth_xy(int,int);double get_y_x(int,int);double get_x_y(int,int);void Iu();void main() doub

5、le hx,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

6、_y); hy_x=get_x_y(n,m); printf(nx|y的熵: H(y|x)= %f,hy_x); Iu();double log2(double x) return (log(1./x)/log(2);void getarr(int n,int m) int i,j; double sum=0; srand(unsigned int)(time(NULL); for(i=0;in;i+) for(j=0;jm;j+) arrij=(double)(rand()%100+1); sum+=arrij; for(i=0;in;i+) for(j=0;jm;j+) arrij/=su

7、m; void disparr(int n,int m) int i,j;printf(联合矩阵:P(x,y)=n); for(i=0;in;i+) for(j=0;jm;j+) printf(%f ,arrij); printf(nn); double geth_x(int n,int m) int i,j; double hx=0; double xN=0; for(i=0;im;i+) for(j=0;jn;j+)xi+=arrji;for(i=0;im;i+) hx+=log2(xi)*xi; return hx; double geth_y(int n,int m) int i,j;

8、 double hy=0; double yN=0; for(i=0;in;i+) for(j=0;jm;j+) yi+=arrij; for(i=0;in;i+) hy+=log2(yi)*yi;return hy; double geth_xy(int n,int m) int i,j; double hxy=0; for(i=0;in;i+) for(j=0;jm;j+) hxy+=arrij*log2(arrij); return hxy; double get_y_x(int n,int m) double xx,yy; xx=geth_xy(n,m); yy=geth_x(n,m)

9、;return (xx-yy);double get_x_y(int n,int m) double xx,yy; xx=geth_xy(n,m); yy=geth_y(n,m);return (xx-yy); void Iu() printf(n平均互信息:I(X:Y)= %fn,(geth_x(n,m)-get_x_y(n,m);上课纪律(20%)实验过程及结果(40%)实验报告质量(40%)总分:教师签字:信息论与编码课 程 实 验 报 告2 项目名称:简单信源编码方法实现学生姓名: 学生学号:指导教师:完成日期:2011年12月24日1、实验目的掌握香农编码方法并用程序实现。2、 实验

10、内容(1)对已知的信源相应的概率进行编码;(2)分别对X中的字符进行香农编码;(3)有能力的同学,完成对X中的字符进行Huffman编码。3、 数据结构与算法流程 开始输入符号个数N和相应概率Xi按概率由大到小排序按公式求码长求出对应位的概率累加和按乘2取余法则,将累加概率转换为二进制结合求得的对应码长,将二进制的累加概率取对应长度的作为相应码字输出信源、概率、累加概率、码长和码字结束di=(int)(-log(ai)/log(2) 对计算相应信源符号的码长for(i=1;in;i+)ppi=ppi-1+ai-1; 计算各对应信源符号的累加概率for(i=0;in;i+)printf(a%dt

11、,i);for(j=0;j=1)printf(1);ppi=2*ppi-1;elseprintf(0);ppi=2*ppi;printf(n); 计算各对应信源符号的码字4、 实验数据与实验结果5、实验结果分析与体会本程序通过输入N个信源的概率对其进行香农编码,并运用书上的例题结果并无差异,但是并没有对概率进行排序还有待于提高;通过这次试验让我更加了解了香农编码的过程及其的算法。6、源程序:#include#include#include#include#includevoid main()float a100,p=0.0,pp100;double c100;int b100,d100;int

12、 n,i,j;printf(输入信源符号的个数:);scanf(%d,&n);printf(输入各信源对应的概率并按0结束:n);for(i=0;in;i+)scanf(%fn,&ai);printf(输入的信源概率是:n);for(i=0;in;i+)printf(a%d=%ft,i,ai);printf(n);for(i=0;i0)bi=(int)ci+1;elsebi=di;printf(各信源对应码长:n);for(i=0;in;i+)printf(b%d=%dt,i,bi);pp0=0.0;for(i=1;in;i+)ppi=ppi-1+ai-1;printf(n);printf(各

13、信源对应累加概率:n);for(i=0;in;i+)printf(pp%d=%ft,i,ppi);printf(n);printf(各信源对应的码字:n);for(i=0;in;i+)printf(a%dt,i);for(j=0;j=1)printf(1);ppi=2*ppi-1;elseprintf(0);ppi=2*ppi;printf(n);上课纪律(20%)实验过程及结果(40%)实验报告质量(40%)总分:教师签字:信息论与编码课 程 实 验 报 告3 项目名称:典型信道容量计算方法实现学生姓名:学生学号:指导教师:完成日期:2011年12月24日1、实验目的掌握用递推算法计算典型信

14、道的容量的方法并用程序实现。2、 实验内容(1)利用random函数和归一化方法构造一个N维离散随机变量(X,Y)概率转移矩阵;(2)用递推算法计算(或直接计算)各种二进信道的容量;3、 数据结构与算法描述 double *sum1=NULL; sum1=(double *)calloc(r,sizeof(double); 定义指针变量并为该 变量申请向的空间 for(i=0;ir;i+) for(j=0;js;j+) p_jiij=(double)(rand()%100+1); sum1i+=p_jiij; for(i=0;ir;i+) for(j=0;js;j+) p_jiij/=sum1

15、i; printf(%ft,p_jiij); printf(n);free(sum1); 用rand和归一化的方法产生随机N维信道转移概率矩阵并输出后释放空间 for(i=0;ir;i+) sumi=0.0; for(j=0;j=DEL) sumi+=p_jiij*log(q_ijij)/log(2.0); sumi=pow(2.0,sumi); p_j+=sumi; for(i=0;ir;i+) p_ii=sumi/p_j; 运用迭代方法计算信道容量4、 实验数据与实验结果5、实验结果分析与体会在本次实验中我遇到很多问题不管是指针的运算,随机转移矩阵输出规范还有就是信道容量的计算;虽然有些问

16、题解决了,但是还有些问题不知道咋办。就是在输出的时候不知道哪有错虽然输出了结果但是要出错希望以后能够提高。、 通过这次实验了解了信道容量的计算和程序的实现,虽然在实验中遇到了很大麻烦但是它们让我进步了不少,也增进了知识。6、 源程序: #include #include #include #define DEL 1e-6#include void main()register int i,j;register int k;int r,s;double *sum1=NULL;double *p_i=NULL;double *p_ji=NULL;double *q_ij=NULL;double C

17、,C_pre,validate;double *sum=NULL;double p_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;ir;i+) p_jii=(double *)calloc(s,sizeof(double);q_ij=(double *)calloc(r,sizeof(double*);for(i=0;ir;i

18、+) q_iji=(double *)calloc(s,sizeof(double); sum1=(double *)calloc(r,sizeof(double); srand(unsigned int)(time(NULL); printf(随机转移矩阵为:n); printf(n); for(i=0;ir;i+) for(j=0;js;j+) p_jiij=(double)(rand()%100+1); sum1i+=p_jiij; for(i=0;ir;i+) for(j=0;js;j+) p_jiij/=sum1i; printf(%ft,p_jiij); printf(n);fre

19、e(sum1);for(i=0;ir;i+) validate=0.0; for(j=0;js;j+) validate+=p_jiij;for(i=0;ir;i+)p_ii=1.0/(double)r;C=-200;k=0;sum=(double *)calloc(r,sizeof(double);do k+; for(j=0;js;j+) p_j=0.0; for(i=0;i=DEL) for(i=0;ir;i+) q_ijij=p_ii*p_jiij/p_j; else for(i=0;ir;i+) q_ijij=0.0; p_j=0.0; for(i=0;ir;i+) sumi=0.0

20、; for(j=0;j=DEL) sumi+=p_jiij*log(q_ijij)/log(2.0); sumi=pow(2.0,sumi); p_j+=sumi; for(i=0;iDEL);free(sum);sum=NULL;printf(n);/printf(迭代次数: %d nn,k);printf(信道容量: %.6f bit/symblo nn,C);printf(最大入口分布: );for(i=0;i=0;i-) free(q_iji); q_iji=NULL;free(q_ij);q_ij=NULL;for(i=r-1;i=0;i-) free(p_jii); p_jii=N

21、ULL;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 函数原型:unsigned int GetCrc32

22、(char* InStr,unsigned int len) 参数:InStr -指向需要计算CRC32值的字符串 len -为InStr的长度 返回值为计算出来的CRC32结果。 函数名:GetCrc16 函数原型:unsigned short GetCrc16(char* InStr,unsigned int len) 参数:InStr -指向需要计算CRC32值的字符串 len -为InStr的长度 返回值为计算出来的CRC16结果。 unsigned int Crc32Table256; int i,j; unsigned int Crc; for (i = 0; i 256; i+)

23、 Crc = i; for (j = 0; j 1) 0xEDB88320; else Crc = 1; Crc32Tablei = Crc; 生成Crc32的查询表Crc=0xffffffff; for( i=0; i 8) Crc32Table(Crc & 0xFF) InStri; Crc = 0xFFFFFFFF; return Crc; 开始计算CRC32校验值CRC16方法和CRC32的方法一样4、 实验数据与实验结果5、实验结果分析与体会通过网上查阅资料和对课本知识的理解,其实本程序只是按照相应的算法对要进行循环冗余校验码的字符进行校验的,结果应该没什么差异。通过本次实验加强了对循环冗余校验码知识的理解并通过上机实习加强了动手能力,提高了自己知识水平。6、源程序:unsigned int GetCrc32(char* InStr,unsigned int len) /生成Crc32的查询表 unsigned int Crc32Table256; int i,j; unsigned int Crc; for (i = 0; i 256; i+) Crc = i; for (j = 0; j 1) 0xEDB88320; else Crc = 1; Crc32Tablei = Crc; /开始计算CRC32校验值 Crc=0xffffffff; for(

温馨提示

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

最新文档

评论

0/150

提交评论