




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科生实验报告实验课程信息论与编码学院名称管理科学学院专业名称信息与计算科学学生姓名学生学号指导教师实验地点6c402实验成绩 二 一四 年 十 月 二 一四 年 十一 月 实验一 离散信源信息量的计算(一)1 实验内容(1)熟悉利用srand()函数产生随机离散信源概率空间的方法;(2)计算随机离散信源的各种信息量:h(x)、h(xy)、h(y);2 数据结构与算法描述变量/函数名类 型说 明srand()生成随机随机数bijdouble联合概率矩阵px3double声明x的概率矩阵py4double声明y的概率矩阵3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据随机生成数据2)实验结果 4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)#includestdlib.h#includestdio.h#includetime.h#includeint i,j,k;int sum=0; /*求和,为单位化准备*/int a34; /*单位化前的准备矩阵,由随机数生成*/double b34; /*单位化矩阵*/double c34; /*声明条件矩阵1*/double d34; /*声明条件矩阵2*/double px3=0; /*声明x的概率矩阵*/double py4=0; /*声明y的概率矩阵*/double hxy=0; double hx=0; double hy=0; double yx=0; double xy=0; void main()srand(unsigned)time(null); /*为随机数的生成准备的种子*/ for(i=0;i3;i+) for(j=0;j4;j+)aij=rand()%8+1; /*+1是因为避免概率为0,熵为无穷大*/ sum+=aij; for(i=0;i3;i+) /*联合概率矩阵*/for(j=0;j4;j+)bij=(double)aij/(double)sum; printf(联合概率矩阵:n);for(i=0;i3;i+) /*输出联合概率矩阵*/for(j=0;j4;j+)printf(%f ,bij);for(i=0;i3;i+) /*x的概率矩阵*/for(j=0;j4;j+)pxi+=bij; printf(x的概率矩阵:n); for(i=0;i3;i+) /*输出x的概率矩阵*/ printf(px%d=%f ,i+1,pxi); printf(n); /*y的概率矩阵*/for(j=0;j4;j+)for(i=0;i3;i+) pyj+=bij;printf(y的概率矩阵:n); for(j=0;j4;j+) /*输出y的概率矩阵*/ printf(py%d=%f ,j+1,pyj); printf(n); for(i=0;i3;i+) /*求联合熵*/for(j=0;j4;j+)hxy+=-bij*log(bij)/log(double)2); printf(联合熵h(xy):n);printf(h(xy)=%fn,hxy); for(i=0;i3;i+) /*求x的熵*/ hx+=-pxi*log(pxi)/log(double)2); printf(x的熵:n);printf(h(x)=%fn,hx); for(j=0;j4;j+) /*求y的熵*/ hy+=-pyj*log(pyj)/log(double)2); printf(y的熵:n);printf(h(y)=%fn,hy); 实验二 离散信源信息量的计算(二)1 实验内容(1)熟悉利用srand()函数产生随机离散信源概率空间的方法;(2)计算随机离散信源的各种信息量:h(x|y)、h(y|x)、i(x;y);2 数据结构与算法描述1)变量及函数的定义变量/函数名类 型说 明idoublex,y的信息量h(x|y)double以y为条件x的熵h(y|x)double以x为条件y的熵3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据随机生成数据2)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)#includestdlib.h#includestdio.h#includetime.h#includeint i,j,k;int sum=0; /*求和,为单位化准备*/int a34; /*单位化前的准备矩阵,由随机数生成*/double b34; /*单位化矩阵*/double c34; /*声明条件矩阵1*/double d34; /*声明条件矩阵2*/double px3=0; double py4=0; double hxy=0; double hx=0; /*声明x的熵*/double hy=0; /*声明y的熵*/double yx=0; /*条件熵1*/double xy=0; /*条件熵2*/double i; /*定义自信息*/void main()srand(unsigned)time(null); /*为随机数的生成准备的种子*/ for(i=0;i3;i+) for(j=0;j4;j+)aij=rand()%8+1; /*+1是因为避免概率为0,熵为无穷大*/ sum+=aij; for(i=0;i3;i+) /*联合概率矩阵*/for(j=0;j4;j+)bij=(double)aij/(double)sum; printf(联合概率矩阵:n);for(i=0;i3;i+) /*输出联合概率矩阵*/for(j=0;j4;j+)printf(%f ,bij);printf(n);for(i=0;i3;i+) /*x的概率矩阵*/for(j=0;j4;j+)pxi+=bij; printf(x的概率矩阵:n); for(i=0;i3;i+) /*输出x的概率矩阵*/ printf(px%d=%f ,i+1,pxi); printf(n); /*y的概率矩阵*/for(j=0;j4;j+)for(i=0;i3;i+) pyj+=bij;printf(y的概率矩阵:n); for(j=0;j4;j+) /*输出y的概率矩阵*/ printf(py%d=%f ,j+1,pyj); printf(n); for(i=0;i3;i+) /*求联合熵*/for(j=0;j4;j+)hxy+=-bij*log(bij)/log(double)2); printf(联合熵h(xy):n);printf(h(xy)=%fn,hxy); for(i=0;i3;i+) hx+=-pxi*log(pxi)/log(double)2); printf(x的熵:n);printf(h(x)=%fn,hx); for(j=0;j4;j+) hy+=-pyj*log(pyj)/log(double)2); printf(y的熵:n);printf(h(y)=%fn,hy); for(i=0;i3;i+) /*条件矩阵1*/for(j=0;j4;j+)cij=bij/pxi;for(i=0;i3;i+) /*间接法1求互信息*/for(j=0;j4;j+)yx+=-bij*log(cij)/log(double)2); printf(信道条件熵:n); printf(h(y/x)=%fn,yx); for(j=0;j4;j+) /*间接法2求互信息*/for(i=0;i3;i+)dij=bij/pyj;for(i=0;i3;i+) /*条件矩阵2*/for(j=0;j4;j+)xy+=-bij*log(dij)/log(double)2); printf(条件熵2:n); printf(h(x/y)=%fn,xy); printf(h(xy)=h(x)+h(y)-h(xy)=%f+%f-%f=%fn,hx,hy,hxy,hx+hy-hxy); printf(x,y的信息量i(x;y):n); i=hx-xy; printf(hx-h(x|y)=%fn,i);实验三 典型信道容量的计算1 实验内容(1)熟悉利用srand()函数产生随机离散信道概率空间的方法;(2)计算随机离散信道的信道容量;2 数据结构与算法描述1)变量及函数的定义变量/函数名类 型说 明p_jiijfloat信道转移概率矩阵kint迭代次数cfloat信道容量deltafloat精度限制3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据0.6 0.2 0.20.5 0.3 0.22)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)#include #include #include #define delta 0.0001 #define maxfloat 1000; void main() register int i,j;register int k;int r,s;float *p_i=null;float *p_ji=null;float *phi_ij=null; float c,c_pre,validate; float * sum=null;float p_j;printf(请输入信源符号个数r、信宿符号个数s:n); fscanf(stdin,%d,&r); fscanf(stdin,%d,&s); p_i=(float *)calloc(r,sizeof(float); p_ji=(float *)calloc(r,sizeof(float); for(i=0;ir;i+) p_jii=(float *)calloc(s,sizeof(float); phi_ij=(float *)calloc(r,sizeof(float*); for(i=0;ir;i+) phi_iji=(float *)calloc(s,sizeof(float); printf(信道转移概率矩阵p:n); for(i=0;ir;i+) for(j=0;js;j+) fscanf(stdin,%f,&p_jiij); for(i=0;ir;i+) validate=0.0; for(j=0;j=0) fprintf(stdout,invalid input data.n); exit(-1); fprintf(stdout,starting.n); for(i=0;ir;i+) p_ii=(float)(1.0/(float)r); c=-maxfloat; k=0; sum=(float *)calloc(r,sizeof(float); do k+; for(j=0;js;j+) p_j=0.0; for(i=0;i=delta) for(i=0;ir;i+) phi_ijij=p_ii* p_jiij/p_j; else for(i=0;ir;i+) phi_ijij=0.0; p_j=0.0; for(i=0;ir;i+) sumi=0.0; for(j=0;j=delta) sumi+=(float)(p_jiij*log( phi_ijij)/ log(2.0); sumi=(float)(pow(2.0,sumi); p_j+=sumi; for(i=0;idelta); free(sum); sum=null; fprintf(stdout,迭代次数为 %d.nn,k); fprintf(stdout,信道容量为 %.6f bit/symbol:nn,c); fprintf(stdout,最佳信源分布为 :n); for(i=0;i=0;i-) free(phi_iji); phi_iji=null; free(phi_ij); phi_ij=null; for(i=r-1;i=0;i-) free(p_jii); p_jii=null; free(p_ji); p_ji=null; free(p_i); p_i=null; getchar(); 实验四 香农编码1 实验内容(1)熟悉理解香农编码的过程(2)将给定的数据进行香农编码2 数据结构与算法描述变量/函数名类 型说 明pndouble原始数组anndouble二进制存储的数组qidouble累加概率kliint码字长度3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据0.25 0.25 0.2 0.15 0.1 0.052)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)#include#include#include#define n 7main()int i,j;double pn=0,temp;double qn=0;/概率数组int kln;/码字长度数组double kn=0,ln=0;/求码字长度的中间数组int ann=0,;/二进制存储数组for(i=1;in;i+)scanf(%lf,&pi);printf(从文件中读取的概率为:n);/输出读取的概率for(i=0;in;i+) printf(p%d=,i);printf(%lf,pi);printf(n);printf(n);/将概率进行排序操作for(i=1;in;i+)for(j=i+1;jn;j+)if(pipj)temp=pi;pi=pj;pj=temp;/输出排序后的数组printf(排序后的概率为:n);for(i=0;in;i+) printf(p%d=,i);printf(%lf,pi);printf(n);printf(n);/求累加概率for(i=0;in;i+)j=i+1;qj=qi+pi;/输出累加概率数组printf(累加概率为:n);for(i=1;in;i+)printf(q%d=%lfn,i,qi);/求码字长度for(i=0,j=0;i(int)(kj+1)/香农编码的第三个步骤klj=lj;else klj=kj;/输出码字长度printf(码字长度为:n);for(i=1;in;i+)printf(kl%d=%d,i,kli);printf(n); /求累加概率的二进制形式,即码字for(i=1;in;i+)for(j=1;j=1)qi=qi-1;aij=1;else aij=0; /输出码字printf(码字为:);for(i=0;in;i+)for(j=1;jkli+1;j+)printf(%d,aij);if(i)printf(0.);for(j=1;jkli+1;j+)printf(%d,aij);if(i)printf()2);printf(n);实验五 huffman编码1 实验内容(1)熟悉理解huffman编码的过程(2)将给定的数据进行huffman编码2 数据结构与算法描述1)变量及函数的定义变量/函数名类 型说 明weightfloat权重parentint父结点lchildint左子结点3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据0.2 0.1 0.3 0.1 0.1 0.22)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中)#include #include #define maxvalue 100#define maxbit 100#define maxleaf 30#define maxnode maxleaf*2 -1typedef struct int bitmaxbit; int start; hcodetype; /* 编码结构体 */typedef struct float weight; int parent; int lchild; int rchild; hnodetype; /* 结点结构体 */void huffmantree (hnodetype huffnodemaxnode, int n) int i, j, m1, m2, x1, x2; /* 初始化存放哈夫曼树数组 huffnode 中的结点 */ for (i=0; i2*n-1; i+) huffnodei.weight = 0; huffnodei.parent =-1; huffnodei.lchild =-1; huffnodei.lchild =-1; /* 输入 n 个叶子结点的权值 */ for (i=0; in; i+) printf (输入叶子结点的权值: %d: n, i); scanf (%f, &huffnodei.weight); /* 循环构造 huffman 树 */ for (i=0; in-1; i+) m1=m2=maxvalue; /* m1、m2中存放两个无父结点且结点权值最小的两个结点 */ x1=x2=0; /* 找出所有结点中权值最小、无父结点的两个结点,并合并之为一棵二叉树 */ for (j=0; jn+i; j+) if (huffnodej.weight m1 & huffnodej.parent=-1) m2=m1; x2=x1; m1=huffnodej.weight; x1=j; else if (huffnodej.weight m2 & huffnodej.parent=-1) m2=huffnodej.weight; x2=j; /* 设置找到的两个子结点 x1、x2 的父结点信息 */ huffnodex1.parent = n+i; huffnodex2.parent = n+i; huffnoden+i.weight = huffnodex1.weight + huffnodex2.weight; huffnoden+i.lchild = x1; huffnoden+i.rchild = x2; int main(void) hnodetype huffnodemaxnode; /* 定义一个结点结构体数组 */hcodetype huffcodemaxleaf, cd; int i, j, c, p, n; printf (输入n的值:n); scanf (%d, &n); huffmantree (huffnode, n); for (i=0; i n; i+) cd.start = n-1; c = i; p = huffnodec.parent; while (p != -1) /* 父结点存在 */ if (huffnodep.lchild = c) cd.bitcd.start = 0; else cd.bitcd.start = 1; cd.start-; /* 求编码的低一位 */ c=p; p=huffnodec.parent; /* 设置下一循环条件 */ /* 保存求出的每个叶结点的哈夫曼编码和编码的起始位 */ for (j=cd.start+1; jn; j+) huffcodei.bitj = cd.bitj; huffcodei.start = cd.start; /* 输出已保存好的所有存在编码的哈夫曼编码 */ for (i=0; in; i+) printf (%d 的哈夫曼码为: , i); for (j=huffcodei.start+1; j n; j+) printf (%d, huffcodei.bitj); printf (n); getch(); return 0;实验六 循环冗余校验码1 实验内容(1)理解循环冗余校验的基本程序;(2)对给出的数据进行循环冗余校验;2 数据结构与算法描述1)变量及函数的定义变量/函数名类 型说 明newsxint信息码outxint生成码axintnewsx的多项式和outx的多项式的积所对应的码字crc()crc函数gnint生成码3 实验数据与实验结果(可用文字描述或贴图的方式进行说明)1)测试数据信息码:生成码:2)实验结果4 程序代码清单(可直接将可运行源代码粘贴在下面的方框中) #includevoid crc(int a,int g, int x,int n);/*对函数进行声明,此函数是crc校验算法的工作函数*/void main()int m;int n; int a20,news20,out20,i,j; printf(请输入newsx的长度m=);/*输入信息码的长度m*/scanf(%d,&m); printf(请输入outx的长度n=);/*输入生成码的长度n*/ scanf(%d,&n); printf(n请输入newsx=); /*输入信息码newsx*/ for(i=0;i=m-1;i+) scanf(%d,&newsi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论