信息论实验一报告

合集下载

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告信息论与编码实验报告实验一:英文文本信息量的计算一、实验目的及要求a)实验目的1、通过本实验熟悉Matlab 软件编程环境2、编写M 文件实现对英文文本信息量的统计,掌握信息量、信源熵的计算方法b)实验要求1、了解matlab 中M 文件的编辑、调试过程2、编写程序实现对给定英文文本信息量的统计3、英文文本中字母不区分大小写,考虑空格的信息量,但不考虑标点符号的信息量4、建议英文文本采用txt 格式二、实验步骤及运行结果记录a)实验步骤1、查找各个英文字母及空格出现的频率2、在Matlab 中读取给定的英文文章3、计算英文文章的长度4、统计在该文章中各个字母及空格出现的次数并放入数组N 中5、计算各个字母和空格的信息量及整篇文章的信息量6、计算信源熵b)实验结果sumI = +003;H = 三、程序流程图四、程序清单,并注释每条语句五、实验小结通过本次实验熟悉了Matlab 软件编程环境和一些函数的功能及使用,掌握了信息量、信源熵的计算方法。

1 附一:开始读取英文文章计算文章的长度嵌套的for 循环语句假判断是否符合循环条件真if 否elseif 判断字是否为大写母输入相应的频率否elseif 判断是否为小写字母计算各个字母、空格及整篇文章的信息量是判断是否为小写字母是计算信源熵是放入数组N 中对应的位置放入数组N 中对应的位置放入数组N 中对应的位置结束附二: wenzhang=textread(‘实验一:english ‘,’\’); M=size(wenzhang); row=M(1,1); line=M(1,2); N=zeros(1,27); for i=1:row for j=1:line %读取英文文章%文章的长度ifdouble(wenzhang(i,j))>96&&double(wenz hang(i,j))double(wenzhang(i,j))>64&&double(wenz hang(i,j))N(1,double(wenzhang(i,j))-64)=N(1,doubl e(wenzhang(i,j))-64)+1; elseif double(wenzhang(i,j))==32N(1,27)=N(1,27)+1; end end end %统计各字母和空格出现的个数并存入N数组中。

信息论实验报告

信息论实验报告

信息论实验报告班级:姓名:学号:实验一:信道容量的迭代算法1.实验目的(1)进一步熟悉信道容量的迭代算法;(2)学习如何将复杂的公式转化为程序;(3)掌握C 语言数值计算程序的设计和调试技术。

2、实验要求(1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。

(2)输入:任意的一个信道转移概率矩阵。

信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。

(3)输出:最佳信源分布P*,信道容量C 。

3.算法分析1:procedure CHANNEL CAPACITY(r,s,(ji p )) 2:initialize:信源分布i p =1/r ,相对误差门限σ,C=—∞3:repeat4:5:6: C 2211log [exp(log )]r s ji ij r j p φ==∑∑7:until C Cσ∆≤8:output P*= ()i r p ,C9:end procedure4.程序调试21211exp(log )exp(log )sji ij j r s ji ij r j p p φφ===∑∑∑i p 1i ji r i ji i p p p p =∑ijφ1、头文件引入出错f:\visualc++\channel\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory————#include<unistd.h>纠错://#include<unistd.h>f:\visualc++\channel\cpp1.cpp(5) : fatal error C1083: Cannot open include file: 'values.h': No such file or directory————#include<values.h>纠错://#include<values.h>2、变量赋值错误f:\visualc++\channel\cpp1.cpp(17) : error C2065: 'ij' : undeclared identifierf:\visualc++\channel\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'int' to 'float ** ' Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast————float **phi_ij=ij=NULL;纠错:float **phi_ij=NULL;3、常量定义错误f:\visualc++\channel\cpp1.cpp(40) : error C2143: syntax error : missing ';' before 'for' ————for(i=0;i<r;i++)phi_ij[i]=(float *)calloc(s,sizeof(float));f:\visualc++\channel\cpp1.cpp(52) : error C2021: expected exponent value, not ' '————if(fabs(validate -1.0)>DELTA)f:\visualc++\channel\Cpp1.cpp(84) : error C2021: expected exponent value, not ' '————if(fabs(p_j)>=DELTA)f:\visualc++\channel\Cpp1.cpp(100) : error C2021: expected exponent value, not ' '————if(fabs(phi_ij[i][j])>=DELTA)f:\visualc++\channel\Cpp1.cpp(116) : error C2021: expected exponent value, not ' ' ————while(fabs(C-C_pre)/C>DELTA);纠错:#define DELTA 0.000001;F:\visualc++\channel\Cpp1.cpp(68) : error C2065: 'MAXFLOAT' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(68) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data————C=-MAXFLOAT;纠错:#define MAXFLOAT 1000000;3、引用中文逗号f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'f:\visualc++\channel\cpp1.cpp(60) : error C2065: 'Starting' : undeclared identifierf:\visualc++\channel\cpp1.cpp(60) : error C2059: syntax error : '.'f:\visualc++\channel\cpp1.cpp(60) : error C2017: illegal escape sequencef:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'————fprintf(stdout,”Starting..\n”);纠错:fprintf(stdout,"Starting..\n");4、没有进行强制转换F:\visualc++\channel\Cpp1.cpp(65) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————p_i[i]=1.0/(float)r;纠错:p_i[i]=(float)(1.0/(float)r);F:\visualc++\channel\Cpp1.cpp(101) : warning C4244: '+=' : conversion from 'double' to 'float', possible loss of data————sum[i]+=p_ji[i][j]*log( phi_ij[i][j])/ log(2.0);纠错:sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0));F:\visualc++\channel\Cpp1.cpp(103) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————sum[i]=pow(2.0,sum[i]);纠错:sum[i]=(float)(pow(2.0,sum[i]));F:\visualc++\channel\Cpp1.cpp(114) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————C= log(p_j)/ log(2.0);纠错:C= (float)(log(p_j)/ log(2.0));4、表达式错误F:\visualc++\channel\Cpp1.cpp(86) : error C2065: 'phi_ji' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer typeF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer type ————phi_ij[i][j]=p_i[i]* phi_ji[i][j]/p_j;纠错:phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'fprint' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'The' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2146: syntax error : missing ')' before identifier 'iteration'F:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'————fprint(stdout,”The iteration number is %d.\n\n”,k);纠错:fprintf(stdout,"The iteration number is %d.\n\n",k);F:\visualc++\channel\Cpp1.cpp(145) : error C2143: syntax error : missing ')' before ';' ————free((p_i);纠错:free(p_i);5、没有返回值F:\visualc++\channel\Cpp1.cpp(149) : warning C4508: 'main' : function should return a value; 'void' return type assumed、纠错:return 0;5.改进程序/*引入头文件*/#include<stdio.h>#include<math.h>#include<stdlib.h>/*定义常量*/#define DELTA 0.0000001//DELTA为相对误差门限#define MAXFLOAT 1000000;//MAXFLOAT为初始化信道容量值int main( void){/*定义全局变量*//*register允许直接从寄存器中读取变量,提高速率*/register int i,j;//i、j为整型变量register int k;//信道容量迭代计算次数int r,s;//r为信源符号个数,s为新宿符号个数float *p_i=NULL;//r个信源符号发生的概率float **p_ji=NULL;//信源到新宿的信道转移概率矩阵Pfloat **phi_ij=NULL;float C,C_pre,validate;//C为信道容量,C_pre为信道最大容量,validate为判定输入转移概率矩阵是否合法float * sum=NULL;//信源符号所带的全部信息量float p_j;//条件概率/*输入信源符号和新宿符号个数*/printf("请输入信源符号个数r、信宿符号个数s...\n");printf("+++++注意!!!r必须大于等于s!!+++++\n");fscanf(stdin,"%d",&r);fscanf(stdin,"%d",&s);/*为 p_i,p_ji 和 phi_ij 分配内存空间*/p_i=(float *)calloc(r,sizeof(float));p_ji=(float **)calloc(r,sizeof(float));/*为每个p_ji分配大小为s的内存空间*/for(i=0;i<r;i++)p_ji[i]=(float *)calloc(s,sizeof(float));phi_ij=(float **)calloc(r,sizeof(float*));/*输入转移概率矩阵*/for(i=0;i<r;i++)/*为每个phi_ij分配大小为s的内存空间*/phi_ij[i]=(float *)calloc(s,sizeof(float));printf("信道转移概率矩阵P...\n");for(i=0;i<r;i++)for(j=0;j<s;j++)fscanf(stdin,"%f",&p_ji[i][j]);/*判定输入的转移概率矩阵是否正确*/for(i=0;i<r;i++){validate=0.0;for(j=0;j<s;j++){validate +=p_ji[i][j];}if((validate-1.0)>=0)//如果转移概率矩阵的概率和大于1,输入数据不合法{fprintf(stdout,"invalid input data.\n");exit(-1);}}/*显示开始计算..*/fprintf(stdout,"Starting..\n");/*初始化 p_i 和 phi_ij*/for(i=0;i<r;i++){/* p_i为等概率,即概率为1/r*/p_i[i]=(float)(1.0/(float)r);}/*初始化信道容量c,迭代次数k和临时变量variable*/C=-MAXFLOAT;k=0;/* 为sum分配大小为r的内存空间*/sum=(float *)calloc(r,sizeof(float));/*开始迭代计算*/do{k++;//每进行一次迭代,迭代次数k加1/* 计算phi_ij(k)*/for(j=0;j<s;j++){p_j=0.0;for(i=0;i<r;i++)p_j+=p_i[i]*p_ji[i][j];if(fabs(p_j)>=DELTA)for(i=0;i<r;i++)phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;elsefor(i=0;i<r;i++)phi_ij[i][j]=0.0;}/*计算p_i(k+1)*/p_j=0.0;for(i=0;i<r;i++){sum[i]=0.0;for(j=0;j<s;j++){/*相对误差门限为0*/if(fabs(phi_ij[i][j])>=DELTA)sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0)); }sum[i]=(float)(pow(2.0,sum[i]));p_j+=sum[i];}for(i=0;i<r;i++){p_i[i]=sum[i]/p_j;}C_pre=C;C= (float)(log(2.0)/log(p_j) );}while(fabs(C-C_pre)/C>DELTA);free(sum);sum=NULL;/*显示结果*/fprintf(stdout,"The iteration number is %d.\n\n",k);//迭代次数fprintf(stdout,"The capacity of the channel is %.6f bit/symbol:\n\n",C);//信道容量fprintf(stdout,"The best input probability distribution is :\n");//最佳信源分布 for(i=0;i<r;i++)fprintf(stdout,"%.6f\n",p_i[i]);fprintf(stdout,"\n");/* 释放指针空间*/for(i=s-1;i>=0;i--){free(phi_ij[i]);phi_ij[i]=NULL;}free(phi_ij);phi_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);return 0;}6.实验结果6.实验二:唯一可译码判决准则1.实验目的(1)进一步熟悉唯一可译码判决准则;(2)掌握C语言字符串处理程序的设计和调试技术。

信息论与编码技术实验报告

信息论与编码技术实验报告

《信息论与编码技术》实验报告实验一:请根据公式-plogp ,说明小概率事件和大概率事件对熵的贡献。

解:先做图,然后分析。

将公式写为)(log )(2p p p f -=对它编写计算和画图程序如下:p=0:0.01:1;x=-p.*log2(p);plot(p,x);从图中曲线看出,小概率事件和大概率事件的情况下,熵值都很低,贡献很小,在概率为0.5附近时熵值最大,故此时对熵的贡献最大。

实验二:请对a 、b 、c 霍夫曼编码,它们的概率是0.6、0.3、0.1。

并以此对符号串ababaacbaa 编码和译码。

解:编码步骤分为:事件排序,符号编码,信源编码,信道编码。

MATLAB 程序:clc;a=0.3;b=0.3;c=0.4; %%%霍夫曼编码A=[a,b,c];A=fliplr(sort(A)); %%%降序排序if (a==b)&(a>c), %%实现了当a,b,c 其中两概率相同时的编码,及3值均不同时的编码 u='a';x=a;v='b';y=b;w='c';z=c;elseif (a==b)&(a<c),u='c';x=c;v='a';y=a;w='b';z=b;elseif (c==b)&(c>a),u='b';x=b;v='c';y=c;w='a';z=a;elseif (c==b)&(c<a),u='a';x=a;v='b';y=b;w='c';z=c;elseif(a==c)&(a>b),u='a',x=a;v='c',y=c;w='b',z=b;elseif(a==c)&(a<b),u='b';x=b;v='a';y=a;w='c';z=c;elseif A(1,1)==a,u='a';x=a;elseif A(1,1)==b,u='b';x=b;elseif A(1,1)==c,u='c';x=c;endif A(1,2)==a,v='a';y=a;elseif A(1,2)==b,v='b';y=b;elseif A(1,2)==c,v='c';y=c;endif A(1,3)==a,w='a';z=a;elseif A(1,3)==b,w='b';z=b;elseif A(1,3)==c,w='c';z=c;endend %%%x,y,z按从大到小顺序存放a,b,c的值,u,v,w存对应字母if x>=(y+z),U='0';V(1)='0';V(2)='1';W(1)='1';W(2)='1';else U='1';V(1)='0';V(2)='0';W(1)='1';W(2)='0';enddisp('霍夫曼编码结果:')if u=='a',a=fliplr(U),elseif u=='b',b=fliplr(U),else c=fliplr(U),end if v=='a',a=fliplr(V),elseif v=='b',b=fliplr(V),else c=fliplr(V),end if w=='a',a=fliplr(W),elseif w=='b',b=fliplr(W),else c=fliplr(W),end %%%编码步骤为:信源编码,信道编码disp('信源符号序列:')s='ababaacbaa' %%%信源编码q=[];for i=s;if i=='a',d=a;elseif i=='b';d=b;else d=c;end;q=[q,d];endm=[]; %%%符号变数字for i=q;m=[m,str2num(i)];endP=[1,1,1,0;0,1,1,1;1,1,0,1];G=[eye(3),P];%%%信道编码%%%接下来的for循环在程序中多次使用,此处作用是将已编码组m每3个1组放入mk中进行运算之后存入Ck数组中,每次mk中运算结束之后清空,再进行下一组运算,而信道编码结果数组C则由C=[C,Ck]存入每组7个码。

信息论上机实验报告

信息论上机实验报告

信息论与编码实验报告实验一:计算离散信源的熵一、实验设备: 1、计算机2、软件:Matlab 二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程; 三、习题:1. 甲地天气预报构成的信源空间为:1111(),,,8482X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦ 小雨云 大雨晴 乙地信源空间为:17(),88Y p y ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦小雨晴 求此两个信源的熵。

求各种天气的自信息量。

代码:x=[1/2,1/4,1/8,1/8]; y=[7/8,1/8];HX=sum(-x.*log2(x)) HY=sum(-y.*log2(y)) IX=-log2(x) IY=-log2(y) 答案:() 1.75;()0.5436H X H Y ==2、 某信息源的符号集由A 、B 、C 、D 、E 组成,设每一符号独立出现,其出现的概率分别为,1/4,1/8,1/8,3/16,5/16,试求该信源符号的平均信息量。

代码:x=[1/4,1/8,1/8,3/16,5/16]; HX=sum(-x.*log2(x))答案:H(X) = 2.2272bit/符号3、设有四个消息分别以概率1/4,1/8,1/8,1/2传送,每一消息的出现是相互独立的。

试计算其平均信息量。

代码:x=[1/4,1/8,1/8,1/2]; HX=sum(-x.*log2(x)) 答案:H(X) =1.75bit/符号4. 设一个二元信源(只有0和1两种符号)其概率空间为:(),1X p x p p ⎡⎤⎡⎤=⎢⎥⎢⎥-⎣⎦⎣⎦0 1编程画出H 与p 的关系,并说明当P 呈什么分布时,平均信息量达到最大值。

(说明:H=-p.*log2(p)-(1-p).log2(1-p);) 代码:p= 1/1000000:1/1000:1;H=-p.*log2(p)-(1-p).*log2(1-p); plot(p,H) grid on xlabel('p'); ylabel('HP'); 图:实验二:验证熵的可加性与强可加性1. 【例2.6】有一离散无记忆信源123111(),,244a a a X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦验证二次扩展信源2X 的熵等于离散信源X 的熵的2倍,即2()2()H X H X =代码:x=[1/2,1/4,1/4];hx=sum(x.*log2(1./x))x2=[1/4,1/16,1/16,1/8,1/8,1/8,1/16,1/8,1/16] hx2=sum(x2.*log2(1./x2)) 答案:2() 1.5;() 3.0H X H X ==2. 验证两个统计独立的信源,X Y ,验证:()()()H XY H X H Y =+其中:123111(),,244a a a X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦123111(),,333b b b Y p y ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦代码:x=[1/2,1/4,1/4]; y=[1/3,1/3,1/3];xy=[1/6,1/6,1/6,1/12,1/12,1/12,1/12,1/12,1/12] hx=sum(x.*log2(1./x)) hy=sum(y.*log2(1./y)) Hxy=sum(xy.*log2(1./xy)) 答案:() 1.5,() 1.585() 3.085H X H Y H XY ===3、条件熵的计算与熵的强可加性 验证离散二维平稳信源,满足:12121()()(|)H X X H X H X X =+某一离散二维平稳信源0121141(),,3694X p x ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦12X X 其联合概率分布12()p X X 为:编程计算:1) 联合熵12()H X X 2) 条件熵21(|)H X X3) 验证:12121()()(|)H X X H X H X X =+代码:x1=[11/36,4/9,1/4]; x2=[11/36,4/9,1/4];b=[1/4,1/18,0;1/18,1/3,1/18;0,1/18,7/36]; HXY=0;for i=1:size(b,1) for j=1:size(b,2) if b(i,j)>0HXY=HXY-b(i,j).*log2(b(i,j)); end end end HXYHx1=sum(x1.*log2(1./x1)) Hx2=sum(x2.*log2(1./x2))b0=b(1,:); b1=b(2,:); b2=b(3,:);x1x2=[b0./x2;b1./x2;b2./x2]; Hx1x2=0;for i=1:size(x1x2,1) for j=1:size(x1x2,2) if x1x2(i,j)>0Hx1x2=Hx1x2-b(i,j).*log2(x1x2(i,j)); end end end Hx1x2 答案:12112121() 1.5426;(|)0.8717() 2.4144()(|) 2.4144H X H X X H X X H X H X X ===+=实验三:离散信道的平均互信息的计算1. 【习题3.1】 设信源12()0.6,0.4X x x p x ⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦通过一干扰信道,接收到符号为12[,]Y y y =,其信道矩阵为:516631,44P ⎡⎤⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦1) 求信源X 中事件1x 和2x 分别含有的自信息;2) 收到消息(1,2)j y j =后,获得的关于(1,2)i x i =的信息量;3) 求信源X 和输出变量Y 的信息熵; 4) 信道疑义度(|)H X Y 和噪声熵(|)H Y X ; 5) 接收到消息Y 后获得的平均互信息;代码:x=[0.6,0.4];p=[5/6,1/6;3/4,1/4]; Ix1=log2(1./(x(1,1))) Ix2=log2(1./(x(1,2)))pxy=[x(1,1)*p(1,:);x(1,2)*p(2,:)]; py=[x*p(:,1),x*p(:,2)];px_y=[pxy(:,1)/py(1,1),pxy(:,2)/py(1,2)]; I=log2(p./[py;py]) Hx=sum(x.*log2(1./x)) Hy=sum(py.*log2(1./py))Hx_y=sum(sum(pxy.*log2(1./px_y))) Hy_x=sum(sum(pxy.*log2(1./p)))Ixy=sum(sum(pxy.*log2(p./[py;py])))答案:12111221221.()0.737() 1.32192.(;)0.0589,(;)0.263,(;)0.0931,(;)0.32193.()0.971,()0.72194.(|)0.9635(|)0.71455.(;)0.0074I x I x I x y I x y I x y I x y H X H Y H X Y H Y X I X Y ====-=-======2. 二元信道的互信息与信源分布的关系 有二元信源:01()1X p x ωω⎡⎤⎡⎤=⎢⎥⎢⎥-⎣⎦⎣⎦有二元信道,其传递矩阵为:11p p P p p -⎡⎤=⎢⎥-⎣⎦, 其中0.2p =,即传递矩阵0.80.20.20.8P ⎡⎤=⎢⎥⎣⎦编程实现下面题目:1) 画出平均互信息(;)I X Y 随信源分布ω的关系曲线,并求出最大平均互信息。

信息论实验报告-

信息论实验报告-

信息论实验报告学生:班级:学号:实验一香农编码一、程序设计的流程图二、程序清单#include <iostream>#include<math.h>#include<string>using namespace std;void swap(double *x,double *y);int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double S[N]; //注意变量在数组中的影响cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];for(int i=0;i<N;i++){for(int j=i;j<N;j++)if(S[i]<S[j])swap(S[i],S[j]);}int nm[N];for(int i=0;i<N;i++){nm[i]=int(-(log(S[i])/log(2)))+1;if(nm[i]==(-(log(S[i])/log(2)))+1)nm[i]--;}double AA[N];AA[0]=S[0];for(int i=1;i<N;i++ )AA[i]=AA[i-1]+S[i];string MM[N];for(int i=0;i<N;i++){double tem=0;double aa=AA[i];for(int j=0;j<N;j++){tem=aa*2;if(tem>1){MM[i]+='1';aa=tem-1;}else{MM[i]+='0';aa=tem;}}}string BB[N];for(int i=0;i<N;i++){for(int j=0;j<nm[i];j++)BB[i]+=MM[i][j];}cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<BB[i]<<endl;}void swap(double &x,double &y){double a;a=x;x=y;y=a;}实验二.费洛编码.一、 流程图二、程序清单#include <iostream>#include<string>#include<math.h>using namespace std;void dw(int n,int H,int W,double *si,string *m); int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double S[N];cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];for(int i=0;i<N;i++){for(int j=i;j<N;j++){if(S[i]<S[j]){double a;a=S[i];S[i]=S[j];S[j]=a;}}}string MM[N];dw(N,0,N-1,S,MM);cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<MM[i]<<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 b[n];for(int i=H;i<=W;i++){sm+=*(si+i);b[i]=fabs(2*sm-sum)/sum;}int ZH;double a=b[H];for(int i=H;i<=W;i++)if(b[i]<=a){a=b[i];ZH=i;}for(int i=H;i<=W;i++){if(i<=ZH) m[i]+='0';else m[i]+='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);}}}实验三.霍夫曼一、程序流程图二、 程序清单#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 hc(string m);void nv(string *m,int n);int main(){int N;cout<<"输入信源个数"<<endl;cin>>N;double *S=new double[N];cout<<"输入信源概率"<<endl;for(int i=0;i<N;i++)cin>>S[i];string *MM=new string[N];for(int i=0;i<N;i++){for(int j=i;j<N;j++){if(S[i]<S[j]){double a;a=S[i];S[i]=S[j];S[j]=a;}}}HNode *node=new HNode[2*N-1];HuffmanTree(node,N,S,MM);nv(MM,N);cout<<"输出编码"<<endl;for(int i=0;i<N;i++)cout<<MM[i]<<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;i++){HuffNode[i].weight=0;HuffNode[i].parent=-1;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;}for (i=0;i<n;i++){HuffNode[i].weight=si[i];}for (i=0;i<n-1;i++){m1=m2=1;x1=x2=0;for (j=0;j<n+i;j++){if (HuffNode[j].parent==-1&&HuffNode[j].weight<m1){m2=m1;x2=x1;m1=HuffNode[j].weight;x1=j;}else if (HuffNode[j].parent==-1&&HuffNode[j].weight<m2){m2=HuffNode[j].weight;x2=j;}}HuffNode[x1].parent=n+i;HuffNode[x2].parent=n+i;HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;HuffNode[n+i].lchild=x1;HuffNode[n+i].rchild=x2;}for(i=0;i<n;i++){c=i;p= HuffNode[c].parent;while(p!=-1){if(HuffNode[p].lchild ==c)m[i]+='0';elsem[i]+='1';c=p;p=HuffNode[c].parent;}}}int hc(string m){int a=0;for(int i=0;m[i]!='\0';i++)a++;return a;}void nv(string *m,int n){char mn[n];int b;for(int i=0;i<n;i++){b=hc(m[i]);for(int j=0;j<b;j++){mn[j]=m[i][b-j-1];}m[i]=mn;}}实验四.信道一、程序流程图三、程序清单#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 double[ni];double *So=new double[no];cout<<"输入信源概率"<<endl;for (i=0;i<ni;i++){cin>>Si[i];}cout<<endl;//再输入信道转移概率矩阵//注意进行判断,某行如果总概率大于1,则出现错误应从新输入cout<<"输入转移概率:"<<endl;float **p; //转移条件概率p=new float *[ni];for (i=0;i<ni;i++){p[i]=new float[no];}for (i=0;i<ni;i++){for (j=0;j<no;j++){cin>>p[i][j];}}for (i=0;i<ni;i++){float a=0;for (j=0;j<no;j++){a+=p[i][j];}if (a!=1.0){cout<<"输入数据有误,请检查后再次输入。

信息论实习报告

信息论实习报告

实习报告实习单位:某某信息科技有限公司实习时间:2023年2月18日至2023年3月18日实习岗位:信息论实习生一、实习背景及目的随着信息技术的快速发展,信息论作为一门研究信息传输和处理的理论基础,在各领域中发挥着越来越重要的作用。

为了加深我对信息论知识的理解,提高实际操作能力,我选择了某某信息科技有限公司进行为期一个月的实习。

实习目的在于将所学理论知识与实际工作相结合,拓宽知识面,培养实践操作技能。

二、实习内容及收获1. 实习内容(1)参与公司项目研发,负责信息传输过程中的信号处理和编码工作。

(2)协助工程师进行实验室测试,收集实验数据,分析实验结果。

(3)学习公司内部技术文档,了解公司的信息论技术应用和发展方向。

(4)参加公司组织的培训课程,提升自己在信息论方面的专业知识。

2. 实习收获(1)理论知识应用:通过实际参与项目研发,我将所学的信息论知识应用于实际工作中,提高了理论知识的实际运用能力。

(2)实践操作技能:在实验室测试过程中,我学会了使用各种测试设备,掌握了实验数据的收集和分析方法。

(3)团队协作:与公司同事共同完成项目任务,我学会了如何进行有效沟通,提高了团队协作能力。

(4)行业认识:通过实习,我更加了解了信息论在实际应用中的重要性,以及对相关行业的发展趋势有了更深入的认识。

三、实习中遇到的问题及解决办法在实习过程中,我遇到了一些问题,主要包括:(1)理论知识与实际应用的衔接:在实际工作中,我发现所学理论知识并不能直接应用于实际问题,需要不断地学习和摸索。

(2)技术难题:在项目研发过程中,遇到了一些技术难题,需要向工程师请教和寻求帮助。

解决办法:(1)加强学习:通过阅读相关资料和参加公司培训,提高自己的理论水平和实际操作能力。

(2)积极请教:遇到问题时,主动向工程师请教,争取他们的指导和帮助。

四、实习总结通过本次实习,我对信息论在实际应用中的重要性有了更深入的认识,同时自己的实践操作能力和团队协作能力也得到了锻炼和提高。

信息论课程实验报告

信息论课程实验报告

中国地质大学(武汉)CHINA UNIV ERSIT Y OF GEOSCIENCES信息论课程实验报告指导老师:严军姓名:刘一龙班级:71082-14学号:20081002007中国地质大学(武汉)2011年6月实验一构造(7,4)系统码一、实验题目Construct a systematic (7,4) linear block code. Y ou can use c / MA TLAB / HDL (VHDL or Verilog-HDL) to describe it. Please write the detail of how to realize it in computer language. And list the program lines.二、实验程序算法设计:利用H的线性独立,通过n的二进制形式构造出H,然后利用H构造出G。

本算法具有通用性,不仅可以计算出(7,4)的生成矩阵,还可以构造出(15,11),(31,26)的生成矩阵。

Matlab程序:clc;disp('请输入系统码n的值');n = input('n=');disp('请输入系统码k的值');k = input('k=');r = n-k;temp=[];for i=1:ny=dec2bin(i,r);for j=1:rtemp(i,j)=mod(y(j),2);endendfor i=1:rt = temp(i,:);temp(i,:)=temp(2^(i-1),:);temp(2^(i-1),:)=t;endfor i=1:(fix(r/2))t = temp(:,i);temp(:,i)=temp(:,r-i+1);temp(:,r-i+1)=t;endH = temp';%-----构造矩阵G--------%P=H(:,r+1:n);G=[P',eye(k)];disp('生成矩阵');Gdisp('校验矩阵');H三、实验结果请输入系统码n的值n=7请输入系统码k的值k=4生成矩阵G =1 1 0 1 0 0 01 0 1 0 1 0 00 1 1 0 0 1 01 1 1 0 0 0 1校验矩阵H =1 0 0 1 1 0 10 1 0 1 0 1 10 0 1 0 1 1 1请输入系统码n的值n=15请输入系统码k的值k=11生成矩阵G =Columns 1 through 81 0 1 0 1 0 0 00 1 1 0 0 1 0 01 1 1 0 0 0 1 01 1 0 0 0 0 0 11 0 0 1 0 0 0 00 1 0 1 0 0 0 01 1 0 1 0 0 0 00 0 1 1 0 0 0 01 0 1 1 0 0 0 00 1 1 1 0 0 0 01 1 1 1 0 0 0 0 Columns 9 through 150 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 01 0 0 0 0 0 00 1 0 0 0 0 00 0 1 0 0 0 00 0 0 1 0 0 00 0 0 0 1 0 00 0 0 0 0 1 00 0 0 0 0 0 1校验矩阵H =Columns 1 through 81 0 0 0 1 0 1 10 1 0 0 0 1 1 10 0 1 0 1 1 1 00 0 0 1 0 0 0 0Columns 9 through 151 0 1 0 1 0 10 1 1 0 0 1 10 0 0 1 1 1 11 1 1 1 1 1 1实验二循环码一、实验题目We have already learned how to encode and decode cyclic codes. Please use the generator polynomial g(x)=1+x+x2+x4to construct a (7,3) code. And if the received code vector is [1 1 0 0 1 1 1], how to decode it? Use c / MATLAB / HDL language to realize the encoding and decoding system.二、实验程序算法设计:通过计算自己将生成矩阵G输入到计算机,然后输入要传输的信息m,利用c=mG 自动生成码字c。

信息论实验报告

信息论实验报告

一、实验目的1. 理解信息论的基本概念和原理;2. 掌握信息熵、条件熵、互信息等基本概念的计算方法;3. 学会使用 MATLAB 进行信息论实验,并分析实验结果;4. 提高编程能力和数据分析能力。

二、实验原理信息论是一门研究信息传输、处理和存储的学科,其核心是信息熵。

信息熵是衡量信息不确定性的度量,表示信息中所包含的平均信息量。

信息熵的计算公式如下:H(X) = -Σ p(x) log2(p(x))其中,H(X) 表示随机变量 X 的熵,p(x) 表示 X 取值为 x 的概率。

条件熵是衡量在已知另一个随机变量 Y 的条件下,随机变量 X 的不确定性。

条件熵的计算公式如下:H(X|Y) = -Σ p(x,y) log2(p(x|y))其中,H(X|Y) 表示在 Y 已知的条件下 X 的熵,p(x,y) 表示 X 和 Y 同时取值为x 和 y 的概率,p(x|y) 表示在 Y 已知的情况下 X 取值为 x 的条件概率。

互信息是衡量两个随机变量之间相互依赖程度的度量。

互信息的计算公式如下:I(X;Y) = H(X) - H(X|Y)其中,I(X;Y) 表示随机变量 X 和 Y 之间的互信息。

三、实验内容1. 使用 MATLAB 编写程序,计算给定信源的概率分布,并计算其熵;2. 使用 MATLAB 编写程序,计算给定两个随机变量的联合概率分布,并计算其条件熵和互信息;3. 分析实验结果,验证信息熵、条件熵和互信息之间的关系。

四、实验步骤1. 输入信源的概率分布,使用 MATLAB 计算 H(X);2. 输入两个随机变量的联合概率分布,使用 MATLAB 计算 H(X,Y)、H(X|Y) 和I(X;Y);3. 分析实验结果,比较 H(X)、H(X|Y) 和 I(X;Y) 之间的关系。

五、实验结果与分析1. 信源概率分布及其熵输入信源的概率分布为:p(x) = [0.2, 0.3, 0.5]计算得到:H(X) = -0.2 log2(0.2) - 0.3 log2(0.3) - 0.5 log2(0.5) ≈ 1.5852. 两个随机变量的联合概率分布及其条件熵和互信息输入两个随机变量的联合概率分布为:p(x,y) = [0.1, 0.2, 0.3, 0.4]计算得到:H(X,Y) = -0.1 log2(0.1) - 0.2 log2(0.2) - 0.3 log2(0.3) - 0.4log2(0.4) ≈ 2.097H(X|Y) = -0.1 log2(0.1) - 0.2 log2(0.2) - 0.3 log2(0.3) - 0.4log2(0.4) ≈ 1.585I(X;Y) = H(X) - H(X|Y) ≈ 0.512分析实验结果,可以发现:(1)信息熵 H(X) 表示信源中包含的平均信息量,当信源概率分布越均匀时,信息熵越大;(2)条件熵 H(X|Y) 表示在已知随机变量 Y 的条件下,随机变量 X 的不确定性,当 X 和 Y 之间的依赖程度越高时,条件熵越小;(3)互信息 I(X;Y) 表示随机变量 X 和 Y 之间的相互依赖程度,当 X 和 Y 之间的依赖程度越高时,互信息越大。

信息论与编码实验报告

信息论与编码实验报告

实验一:计算离散信源的熵一、实验设备:1、计算机2、软件:Matlab二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程;三、实验内容:1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。

3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。

四、求解:1、习题:A 地天气预报构成的信源空间为:()⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡6/14/14/13/1x p X 大雨小雨多云晴 B 地信源空间为:17(),88Y p y ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦ 小雨晴 求各种天气的自信息量和此两个信源的熵。

2、程序代码:p1=[1/3,1/4,1/4,1/6];p2=[7/8,1/8];H1=0.0;H2=0.0;I=[];J=[];for i=1:4H1=H1+p1(i)*log2(1/p1(i));I(i)=log2(1/p1(i));enddisp('自信息I分别为:');Idisp('信息熵H1为:');H1for j=1:2H2=H2+p2(j)*log2(1/p2(j));J(j)=log2(1/p2(j));enddisp('自信息J分别为');Jdisp('信息熵H2为:');H23、运行结果:自信息量I分别为:I = 1.5850 2.0000 2.0000 2.5850信源熵H1为:H1 = 1.9591自信息量J分别为:J =0.1926 3.0000信源熵H2为:H2 =0.54364、分析:答案是:I =1.5850 2.0000 2.0000 2.5850 J =0.1926 3.0000H1 =1.9591; H2 =0.5436实验2:信道容量一、实验设备:1、计算机2、软件:Matlab二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程;三、实验内容:1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。

信息论实验报告

信息论实验报告

前言信息论是现代通信与信息工程的理论基础。

作为电子信息科学与技术专业本科生的学科基础课,本课程主要讲授:信息的定义和测度、信源和信息熵、连续熵和信息变差、信道和互信息、平均互信息和信道容量、数据处理和信息测量理论、无失真信源编码理论和编码方法等内容。

本课程按“单符号离散信息系统”、“多符号离散信息系统”、“连续信息系统”三个“系统”层面,逐步深入展开,以严密的数学分析贯串始终。

通过教学,使学生掌握信息理论的基本概念和信息分析方法,为今后进一步研究信息科学和信息技术打下坚实的理论基础。

实验一:唯一可译码判断实验学时:3实验类型:(演示、验证、综合、√设计、研究)实验要求:(√必修、选修)一、实验目的通过本次试验了解唯一可译码地判断原理;实现用C语言编写判断唯一可译码地程序二、实验内容编程实现唯一可译码的判决准则―――Sardinas-Patterson算法三、实验原理、方法和手段Sardinas-Patterson算法描述:设C为码字集合,按以下步骤构造此码的尾随后缀集合F:(1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;(2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;(3)F=∪Fi即为码C的尾随后缀集合;(4) 若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。

在我们设计的算法中,需要注意的是我们需要的是先输出所有尾随后缀的集合,然后再判断该码是否是唯一可译码,即如F中出现了C中的元素,则C不是唯一可译码,否则若F中没有出现新的元素,则C为唯一可译码。

而不是F中出现C中的元素就终止,这也是在本题的要求中需要注意的问题。

1、概要设计:由于需要判断尾随后缀,所以我们需要反复的比较C和F中的码字。

1)首先我们用一个b[30][30]的数组来存放所有的尾随后缀的集合;用Q记录所有尾随后缀的个数;2)用数组a[30][30]来存放输入的码字,L[30]来存放码字的长度;通过一个双重循环并调用houzhui(a[i],a[j],L[i],L[j])函数来找到a[30][30]中的为随后缀,即:for(i=0;i<n-1;i++){for(j=0;j<n;j++){if(i!=j&&L[i]<L[j])HuoZhui(a[i],a[j],L[i],L[j]);}}3)通过判断Q是否大于0,如果不大于0,即b[30][30]中没有码字,也就是不存在尾随后缀,那么可判断a[30][30]是唯一可译码,否则进行如下操作;4)计算b[30][30]中尾随后缀的长度,用k1表示;并调用HuoZhui(b[i],a[j],k1,L[j])其中k1<L[j]来a[30][30]中所存在的后缀,并加入到b[30][30]中,通过一个循环,找到a[30][30]中所有尾随后缀;即for(i=0;i<Q;i++){k1=strlen(b[i]);for(j=0;j<n;j++){if(k1<L[j])HuoZhui(b[i],a[j],k1,L[j]);}}5)寻找b[30][30]中的尾随后缀;用k2表示b[30][30]中码字的长度,并调用HuoZhui(a[i],b[j],L[i],k2)来实现,其中k2>L[j];通过循环调用即可找到b[30][30]中的所有尾随后缀,最后再将他们分别存放在b[30][30]中;即通过for(i=0;i<n;i++){for(j=0;j<Q;j++){k2=strlen(b[j]);if(k2>L[i]){HuoZhui(a[i],b[j],L[i],k2);}}}6)在反复调用HuoZhui(a[i],a[j],L[i],L[j])函数中如果b[30][30]中有重复出现的,即尾随后缀相同的不用再次放入b[30][30]中。

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告一、实验目的1.了解信息论与编码的基本概念和原理。

2.学习如何通过信息论与编码方法实现对数据的压缩和传输。

3.掌握信息论与编码实验的实验方法和实验技能。

4.提高实验设计、数据分析和报告撰写的能力。

二、实验内容1.通过对输入信源进行编码,实现对数据的压缩。

2. 比较不同编码方法的压缩效果,包括Shannon-Fano编码和霍夫曼编码。

3.通过传输信道对编码后的数据进行解码,还原原始信源。

4.分析并比较不同编码方法的传输效果,包括码率和传输质量。

三、实验原理1.信息论:熵是信息论中衡量信源不确定性的指标,熵越小表示信源的可预测性越高,在编码过程中可以压缩数据。

2. 编码方法:Shannon-Fano编码通过分治的方法将输入信源划分为不同的子集,分别进行编码;霍夫曼编码则通过构建最佳二叉树的方式,将较常出现的信源符号编码为较短的二进制码,较少出现的信源符号编码为较长的二进制码。

3.传输信道:信道可能存在误码和噪声,通过差错控制编码可以在一定程度上保障传输数据的正确性和完整性。

四、实验步骤1. 对给定的输入信源进行Shannon-Fano编码和霍夫曼编码。

2.计算编码后的码率,分析不同编码方法的压缩效果。

3.将编码后的数据传输到信道,模拟信道中的误码和噪声。

4.对传输后的数据进行解码,还原原始信源。

5.比较不同编码方法的传输质量,计算误码率和信噪比。

五、实验结果与分析1. 编码结果:通过对输入信源进行编码,得到了Shannon-Fano编码和霍夫曼编码的码表。

2.压缩效果:计算了不同编码方法的码率,比较了压缩效果。

3.传输结果:模拟信道传输后的数据,对数据进行解码,还原原始信源。

4.传输质量:计算了误码率和信噪比,分析了不同编码方法的传输质量。

六、实验总结通过本次实验,我深刻理解了信息论与编码的基本概念和原理,并掌握了信息论与编码实验的实验方法和实验技能。

在实验过程中,我遇到了一些困难,比如对编码方法的理解和实验数据的处理。

最新《信息论基础》实验报告-实验1

最新《信息论基础》实验报告-实验1

最新《信息论基础》实验报告-实验1实验目的:1. 理解信息论的基本概念,包括信息熵、互信息和编码理论。

2. 通过实验掌握香农信息熵的计算方法。

3. 学习并实践简单的数据压缩技术。

实验内容:1. 数据集准备:选择一段英文文本作为实验数据集,统计各字符出现频率。

2. 信息熵计算:根据字符频率计算整个数据集的香农信息熵。

3. 编码设计:设计一种基于频率的霍夫曼编码方案,为数据集中的每个字符分配一个唯一的二进制编码。

4. 压缩与解压缩:使用设计的霍夫曼编码对原始文本进行压缩,并验证解压缩后能否恢复原始文本。

5. 性能评估:比较压缩前后的数据大小,计算压缩率,并分析压缩效果。

实验步骤:1. 从文本文件中读取数据,统计每个字符的出现次数。

2. 利用统计数据计算字符的相对频率,并转换为概率分布。

3. 应用香农公式计算整个数据集的熵值。

4. 根据字符频率构建霍夫曼树,并为每个字符生成编码。

5. 将原始文本转换为编码序列,并记录压缩后的数据大小。

6. 实现解压缩算法,将编码序列还原为原始文本。

7. 分析压缩前后的数据大小差异,并计算压缩率。

实验结果:1. 原始文本大小:[原始文本大小]2. 压缩后大小:[压缩后大小]3. 压缩率:[压缩率计算结果]4. 霍夫曼编码表:[字符与编码的对应表]实验讨论:- 分析影响压缩效果的因素,如字符集大小、字符频率分布等。

- 讨论在实际应用中,如何优化编码方案以提高压缩效率。

- 探讨信息论在数据压缩之外的其他应用领域。

实验结论:通过本次实验,我们成功地应用了信息论的基本原理,通过霍夫曼编码技术对文本数据进行了有效压缩。

实验结果表明,基于字符频率的霍夫曼编码能够显著减少数据的存储空间,验证了信息论在数据压缩领域的有效性和实用性。

信息论实验报告实验1

信息论实验报告实验1

信息论实验报告一实验一1、实验内容(1)英文信源由26个英文字母和1个空格组成,假定字符从中等概选取,那么一条100个字符的信息提供的信息量为多少?(2)若将27个字符分为三类,9个出现概率占2/7,13个出现概率占4/7,5个出现占1/7,而每类中符号出现等概,求该字符信源的信息熵。

2、设计思路及步骤I=log2P iH(X)=∑−P i log2Pii26个字母和一个空格,因等概选取可以先求得其中一个字符的信息量,通过扩展实现计算100个字符的信息量。

对于第二问,可以将字符分为三组,又因每组字符的概率相等,因此可以求出每组每一个字符的概率。

通过信息熵的定义可以求出结果。

3、程序代码及调试过程4、出现的问题及解决方法(1)没有看清题目要求,漏掉空格(2)是否可以将三组字符看作整体5、结果及说明通过实验结果可以看出100个字符的信息量,以及字符信源熵。

比较H2与H3可以看出,并不可以简单的将三组数据看作整体。

6、实验总结本实验通过计算多字符的信息量与分组信息熵,让我们加深了信息论中有关信息量与信息熵的概念与定义,同时也让我们熟悉了matlab的基本操作。

实验二1、实验内容绘制二进制信源熵函数曲线。

2、设计思路及步骤根据信源熵的定义以及公式计算出熵,通过matlab的矩阵运算计算出熵数组,然后通过plot函数画出图像。

3、程序代码及调试过程4、出现的问题及解决方法矩阵乘法出错,,需要使用matlab中的点乘5、结果及说明信源熵的图像为凸形曲线,熵在信源等概分布时取最大值,先增大再减小。

6、实验总结本实验通过对信源熵的作图让我们熟悉了matlab中图像生成函数,以及矩阵运算。

实验三,四1、实验内容求信源的熵和其二次、三次扩展信源的熵。

离散二维平稳信源的概率空间:求:(a)信源符号之间无依赖性时,信源X的信息熵H(X);(b)信源符号有依赖性时的条件熵H(X2|X1);(c)联合熵H(X1X2);(d)根据以上三者之间的关系,验证结果的正确性。

信息熵与图像熵的计算

信息熵与图像熵的计算

实验一信息熵与图‎像熵计算一、实验目的1.复习MAT‎L AB 的基本命令‎,熟悉MAT‎L AB 下的基本函‎数。

2.复习信息熵‎基本定义, 能够自学图‎像熵定义和‎基本概念。

二、实验仪器、设备1.计算机-系统最低配‎置256M 内存、P4 CPU。

2.Matla‎b仿真软件- 7.0 / 7.1 / 2006a‎等版本Ma‎t lab 软件。

三、实验内容与‎原理(1)内容:1.能够写出M‎ATLAB‎源代码,求信源的信‎息熵。

2.根据图像熵‎基本知识,综合设计出‎M ATLA‎B程序,求出给定图‎像的图像熵‎。

(2)原理1. MATLA‎B中数据类型‎、矩阵运算、图像文件输‎入与输出知‎识复习。

2.利用信息论‎中信息熵概‎念,求出任意一‎个离散信源‎的熵(平均自信息‎量)。

自信息是一‎个随机变量‎,它是指某一‎信源发出某‎一消息所含‎有的信息量‎。

所发出的消息不同‎,它们所含有‎的信息量也‎就不同。

任何一个消‎息的自信息‎量都代表不‎了信源所包含‎的平均自信‎息量。

不能作为整‎个信源的信‎息测度,因此定义自‎信息量的数学期望为‎信源的平均‎自信息量:信息熵的意‎义:信源的信息‎熵H是从整‎个信源的统‎计特性来考‎虑的。

它是从平均‎意义上来表征‎信源的总体‎特性的。

对于某特定‎的信源,其信息熵只‎有一个。

不同的信源因统计特‎性不同,其熵也不同‎。

3.学习图像熵‎基本概念,能够求出图‎像一维熵和‎二维熵。

图像熵是一‎种特征的统‎计形式,它反映了图‎像中平均信‎息量的多少‎。

图像的一维熵表示图‎像中灰度分‎布的聚集特‎征所包含的‎信息量,令Pi 表示图像中‎灰度值为i‎的像素所占‎的比例,则定义灰度‎图像的一元‎灰度熵为:255log i iip p ==∑H图像的一维‎熵可以表示‎图像灰度分‎布的聚集特‎征,却不能反映‎图像灰度分‎布的空间特征,为了表征这‎种空间特征‎,可以在一维‎熵的基础上‎引入能够反‎映灰度分布‎空间特征的特征‎量来组成图‎像的二维熵‎。

信息论与编码实验报告教材

信息论与编码实验报告教材

实验一 绘制二进熵函数曲线(2个学时)一、实验目的:1. 掌握Excel 的数据填充、公式运算和图表制作2. 掌握Matlab 绘图函数3. 掌握、理解熵函数表达式及其性质二、实验要求:1. 提前预习实验,认真阅读实验原理以及相应的参考书。

2. 在实验报告中给出二进制熵函数曲线图三、实验原理:1. Excel 的图表功能2. 信源熵的概念及性质()()[]()[]())(1)(1 .log )( .)( 1log 1log )(log )()(10 , 110)(21Q H P H Q P H b nX H a p H p p p p x p x p X H p p p x x X P X i i i λλλλ-+≥-+≤=--+-=-=≤≤⎩⎨⎧⎭⎬⎫-===⎥⎦⎤⎢⎣⎡∑单位为 比特/符号 或 比特/符号序列。

当某一符号xi 的概率p(xi)为零时,p(xi)log p(xi) 在熵公式中无意义,为此规定这时的 p(xi)log p(xi) 也为零。

当信源X 中只含有一个符号x 时,必有p(x)=1,此时信源熵H (X )为零。

四、实验内容:用Excel 和Matlab 软件制作二进熵函数曲线。

根据曲线说明信源熵的物理意义。

(一) Excel具体步骤如下:1、启动Excel 应用程序。

2、准备一组数据p 。

在Excel 的一个工作表的A 列(或其它列)输入一组p ,取步长为0.01,从0至100产生101个p (利用Excel 填充功能)。

3、取定对数底c,在B列计算H(x) ,注意对p=0与p=1两处,在B列对应位置直接输入0。

Excel中提供了三种对数函数LN(x),LOG10(x)和LOG(x,c),其中LN(x)是求自然对数,LOG10(x)是求以10为底的对数,LOG(x,c)表示求对数。

选用c=2,则应用函数LOG(x,2)。

在单元格B2中输入公式:=-A2*LOG(A2,2)-(1-A2)*LOG(1-A2,2)双击B2的填充柄,即可完成H(p)的计算。

实验1-信息论相关实验实验报告

实验1-信息论相关实验实验报告

信息论与编码实验一实验报告学生姓名周群创指导教师张祖平学号 0909110814 专业班级电子信息1101实验一关于信源熵的实验一、实验目的1. 掌握离散信源熵的原理和计算方法。

2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。

3. 自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具求解图像熵。

4. 掌握Excel 的绘图功能,使用Excel 绘制散点图、直方图。

二、实验原理1. 离散信源相关的基本概念、原理和计算公式产生离散信息的信源称为离散信源。

离散信源只能产生有限种符号。

随机事件的自信息量I(x i)为其对应的随机变量x i 出现概率对数的负值。

即:I(x i)= -log2 p(x i)随机事件X 的平均不确定度(信源熵)H(X)为离散随机变量x i 出现概率的数学期望,即:H(X )=-∑p(x )I (x ) =-∑p(x ) log p(x )2. 二元信源的信息熵设信源符号集X={0,1},每个符号发生的概率分别为p(0)=p,p(1)=q,p+ q=1,即信源的概率空间为则该二元信源的信源熵为:H(X) = - p log p –q log q = - p log p – (1- p) log (1- p)即:H (p) = - p log p – (1- p) log (1- p) 其中 0 ≤p ≤13. MATLAB 二维绘图用matlab 中的命令plot(x, y)就可以自动绘制出二维图来。

例1-2,在matlab 上绘制余弦曲线图,y = cos x,其中0 ≤x ≤2。

>>x=0:0.1:2*pi; %生成横坐标向量,使其为0,0.1,0.2,…,6.2>>y=cos(x); %计算余弦向量>>plot(x,y) %绘制图形4. MATLAB 求解离散信源熵求解信息熵过程:1) 输入一个离散信源,并检查该信源是否是完备集。

信息论实验一实验报告范文

信息论实验一实验报告范文

信息论实验一实验报告范文一、简要总结信源的熵、信道容量的物理意义,概念:信源熵的物理意义:指信源中的各个符号的平均不确定性;熵是信源符号的平均信息量,是信源符号的平均不确定度。

信道容量概念:在信道可以传输的基本前提下,对信源的一切可能的概率分布而言,信道能够传输的最大(接收)熵速率称为信道容量。

意义:求出了某个信道的信道容量,也就找到了信源的最佳概率分布。

从而指导人们改造信源,使之最大可能地利用信道的传输能力。

二、写出离散信源熵、离散信道容量计算的基本步骤,画出实现离散信源熵、离散信道容量计算的程序流程图。

离散信源熵的计算步骤:q1Hr某Elogrpailograip(ai)i1信道容量的计算步骤:CI某;Ybit/符号ma某P某实现离散信源熵的计算流程图:输入P(ai)H(某)=0,i=1H(某)=H(某)+P(a1)logr(1/a1)i“”实现离散信道容量计算的程序流程图:输入p(某i)p(0)(某i)p(yj/某i)aie某pp(yj/某i)lnp(某i)p(yj/某i)jiC1n1,nlnp(某i)aiiC2n1,nlnma某aiiC1n1,nC2n1,n是CC1n1,n结束p(某i)p(某i)aip(某i)aii否三、实现离散信源熵、离散信道容量计算的matlab源程序:离散信源的熵(借助习题2.16)和离散信道容量(借助习题3.6)分析习题2.16的matlab程序:Clearall;%清除所有变量P某=[0.70.3];P=0;%输入信源概率,P某=p(某)H某=-P某某log2(P 某’)%计算信源的熵H(某)Py某=[0.90.2;0.10.8];p某=[0.70.3;0.70.3];%Py某为条件概率P某y=Py某.某p某;fori=1:2 h某某(i,1)=-P某y(I,:)某log2(P某y(i,:)’);P=P+h某某(i,1);%计算H(某^2)endh2某=P/2%计算H2(某)程序运行结果:H某=0.8813H2某=0.7131习题3.6的matlab程序:clearall;%清除所有变量a=0;p=[2/31/3;1/32/3];%信道矩阵Pfori=1:2,a=a+p(1,i)某log2(p(1,i));endC=log2(2)+a%计算对称离散信道的信道容量Cfori=1:2,p1(i)=1/2;endp1%最佳输入概率分布程序运行结果C=0.0817p1=0.50000.50004、讨论信源的熵的大小与前后符号之间相关性的关系,讨论信道容量与信源先验概率及信道转移概率的关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
课程名称信息论与编码
实验项目信息熵、信道容量的计算
实验仪器计算机
系别信息与通信工程学院
专业电子信息工程
班级/学号
学生姓名
实验日期
成绩
指导教师李红莲
实验一:信息熵、信道容量的计算
实验项目:信息熵、信道容量的计算
课程:《信息论与编码》
一、实验目的
掌握使用计算机计算信息熵、信道容量的方法。

二、实验内容
利用matlab语言编程实现信息熵、信道容量的计算。

三、实验原理
1.参照教材(焦瑞莉等编著《信息论基础教程》)第14页式(2-16)理解信息熵的定义
2.参照教材(焦瑞莉等编著《信息论基础教程》)第68页式(3-15)理解信道容量的定义
四、实验方法与实验步骤
代码和运行结果:
(一)参照教材第215页信源熵程序建立文件entropy.m
文件entropy.m的代码:
%entropy%
%计算函数%
function H=entropy(P,r)
if ~isempty(find(P<=0,1))
error('Not a prob.Vector,negative component');%判断是否符合概率分布条件end
if(abs(sum(P)-1)>10e-10)
error('Not aprob vector,component do not add up to 1');%判断是否符合概率和为1
end
H=(sum(-P.*log2(P)))/(log2(r)+eps);
(二)建立文件exercise2_3_1.m通过调用entropy.m计算教材第59页练习2.3(1)(参考答案:0.8113比特)
文件exercise2_3_1.m的代码及运行结果:
clc;
H=entropy([1/4,3/4],2)
运行结果:
(三)参照教材第215页离散无记忆信道容量的迭代计算程序建立文件channelcap.m 文件channelcap.m的代码:
% 信道容量C的迭代算法
% 函数说明:
% [CC,Paa]=ChannelCap(P,k) 为信道容量函数
% 变量说明:
% P:输入的正向转移概率矩阵,k:迭代计算精度
% CC:最佳信道容量,Paa:最佳输入概率矩阵
% Pa:初始输入概率矩阵,Pba:正向转移概率矩阵
% Pb:输出概率矩阵,Pab:反向转移概率矩阵
% C:初始信道容量, r:输入符号数,s:输出符号数
%************************************************%
function [CC,Paa]=channelcap(P,k)
% 提示错误信息
if (~isempty(find(P<0, 1)))
error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件end
if abs(sum((P'))-1)>10e-10
error('Not a prob.vector,components do not add up to 1') % 判断是否符合概率和为1
end
% 1)初始化Pa
[r,s]=size(P);
Pa=(1/(r+eps))*ones(1,r);
Pba=P;
% 2)进行迭代计算
n=0;
C=0;
CC=1;
while abs(CC-C)>=k % 迭代开始
n=n+1;
% (1)先求Pb
Pb=zeros(1,s);
for j=1:s
for i=1:r
Pb(j)=Pb(j)+Pa(i)*Pba(i,j);
end
end
% (2)再求Pab
suma=zeros(1,s);
Pab=zeros(s,r);
for j=1:s
for i=1:r
Pab(j,i)=Pa(i)*Pba(i,j)/(Pb(j)+eps);
suma(j)=suma(j)+Pa(i)*Pba(i,j)*log2((Pab(j,i)+eps)/(Pa(i)+eps)); end
end
% 3)求信道容量C
C=sum(suma);
% 4)求下一次Pa,即Paa
L=zeros(1,r);
a=zeros(1,r);
for i=1:r
for j=1:s
L(i)=L(i)+Pba(i,j)*log(Pab(j,i)+eps);
end
a(i)=exp( L(i));
end
Paa=a./(sum(a)+eps);
% 5)求下一次C,即CC
CC=log2(sum(a)+eps);
Pa=Paa;
end % 迭代结束
% 打印输出结果
s0='很好!输入正确,迭代结果如下:';
s1='最佳输入概率分布Pa:';
s2='信道容量C:';
s3='迭代次数n:';
s4='输入符号数r:';
s5='输出符号数s:';
s6='迭代计算精度k:';
i=1:r;
B=i;
disp(s0);
disp(s1),disp(B),disp(Paa);
disp(s4),disp(r);
disp(s5),disp(s);
disp(s2),disp(CC);
disp(s6),disp(k);
disp(s3),disp(n);
(四)建立文件exercise3_2_b.m通过调用channelcap.m计算教材第92页练习3.2(b)(参考答案:0.0817比特)
文件exercise3_2_b.m的代码和运行结果:
P=[ 1/3,1/6,1/3,1/6;
1/6,1/3,1/6,1/3;];
channelcap(P,0.0001)
五、思考题
使用计算机编程进行信道容量的迭代计算是否肯定收敛,即是否一定能得出近似正确结果?
答:不是。

六、心得与体会
通过此次试验,我们更深刻的理解了信道容量以及信息熵的概念,我对信道容量的迭代计算,以及信息熵的计算也都有了进一步的了解,并且通过本次试验我掌握了利用matlab 语言编程实现信息熵、信道容量的计算,不仅如此,还让我对书本上的本部分知识有了跟深刻的了解,更加熟悉了MatLab软件的使用。

相关文档
最新文档