信息论实验指导书(共19页).doc
精选优质文档-倾情为你奉上信息理论与编码实验指导书电子与电气工程学院罗晓琴 编实验要求1、实验前认真阅读实验指导书的内容,并完成预习任务。2、复习Matlab的相关知识,完成仿真。3、要熟悉本次实验的任务。4、实验过程中要认真记录实验结果,仿真结果需经指导教师审阅。5、实验后每位同学要独立完成实验报告的内容。目录实验一 离散信源的自信息量和熵3实验二 最大离散熵定理6实验三 费诺编码9实验四 霍夫曼编码13实验五 香农编码16实验一:计算离散信源的自信息量和熵一、实验目的 1、熟悉离散信源的特点。 2、学习Matlab仿真离散信源的方法。 3、学习离散信源自信息量和信源熵的计算方法。 4、熟悉 Matlab 编程。二、实验设备1、计算机2、软件:Matlab三、实验原理本实验主要完成信源概率分布的自信息量以及信源熵的计算。计算公式如下:一个字符它所携带的信息量是和该字符出现的概率有关,概率可以表征自信息量的大小自信息的计算公式为: 自信息量有两个含义: 第一、当事件发生前,表示该事件发生的不确定性;第二、当事件发生后,标是该事件所提供的信息量 自信息量的单位取决于对数所取的底,若以2为底,单位为比特,以e为底,单位为奈特,以10为底,单位为哈特。 在通信系统中,通常取比特为单位,底数2略去不写。由于自信息I(a)是一个随机变量,不能用来表征整个信源的不确定度。所以我们用平均自信息量来表征整个信源的不确定度。平均自信息量就是信源输出所有消息的自信息的数学期望,又称为信息熵、信源熵,简称熵。熵(平均自信息)的计算公式为: 信息熵H(x)是对信源的平均不确定性的描述。它从平均意义上来表征信源的总体信息测度。对于某特定的信源,其信息熵是一个确定的数值。信息熵具有如下三种物理意义。第一,信息熵H(x)是表示信源输出后,每个消息或符号所提供的平均信息量。第二,信息熵H(x)是表示信源输出前,信源的平均不确定性。第三,信息熵H(x)可表征变量X的随机性。由此可以看出,自信息量与信息熵的含义是不同的:(1)信息熵是表征信源本身统计特性的一个物理量,它表示信源的平均不确定性,是信源输出的每一个消息所能提供的平均信息量;自信息量表示的是每一个消息的信息量度。(2)信息熵是针对信源的,是信源输出的信息量,表示信源输出前的平均不确定性;自信息量是针对信宿的,是接收者在消除了信源不确定性后所获得的信息的度量。(3)若信道无干扰,接收者获得的信息量在数量上等于信源的熵,若有干扰时,则两者不相等。四、实验内容 1、已知信源概率分布为:p=1/2,1/4,1/8,1/8,编写出计算自信息量的Matlab 程序。程序:function I = deal(p)n=4;for i =1: n I(i)=-log2(p(i) ; end打开空白的M文件编辑器,将上述程序输入。保存。通过M文件调用的形式完成仿真。步骤:在command window中输入p=1/2,1/4,1/8,1/8调用deal.M文件输入I=deal(1/2,1/4,1/8,1/8),仿真实现。 2、写出信源概率分布为:p=1/2,1/4,1/8,1/8离散信源熵的Matlab 程序。 程序:function H = deal(p)n =4;H =0;for i =1: n I(i)=-log2(p(i) ; H = H + p(i)*I(i);end打开空白的M文件编辑器,将上述程序输入。保存。通过M文件调用的形式完成仿真。步骤:在command window中输入p=1/2,1/4,1/8,1/8调用deal.M文件输入H=deal(1/2,1/4,1/8,1/8),仿真实现。3、写出信源概率分布为:p=1/2,1/4,1/8,1/8的离散信源自信息量和信源熵的Matlab程序。function I H = deal(p)n = length(p);H = 0;for i =1: n I(i)=-log2(p(i) ; H = H + p(i)*I(i);end步骤:在command window中输入p=1/2,1/4,1/8,1/8调用deal.M文件输入I H=deal(1/2,1/4,1/8,1/8),仿真实现。4、将程序在计算机上仿真实现,验证程序的正确性并完成思考题的程序设计。五、思考题1、说明离散信源自信息量和信息熵的不同含义。2、甲地天气预报构成的信源空间为:X晴云大雨小雨 乙地信源空间为:Y晴小雨 求此两个信源的熵。求各种天气的自信息量。六、实验报告要求总结离散信源的特点及离散信源平均信息量的计算,写出实验内容中的仿真程序及结果,完成思考题中MATLAB实现语句,并附上仿真实现的结果。实验二 最大离散熵定理一、实验目的 1、熟悉熵函数的基本性质。 2、掌握最大熵定理。3、学习Matlab仿真二维曲线图的方法。 4、熟悉 Matlab 编程。二、实验设备1、计算机2、软件:Matlab三、实验原理信息熵H(x)是随机变量X的概率分布p(x)的函数,它有如下性质:1、对称性H(P)=H(p1,p2,p3,,pn)= H(p2,p3,,pn p1)=H(pn,p1,p2,p3,,pn-1) 概率分布的顺序是可以任意互换的,互换后的概率分布表示的是相同的随机变量,随机变量的总体结构没有变化,则可证明对应的熵函数的值也不会变。该性质表明熵函数只与信源的总体统计特性有关。这也说明,信息熵只抽取了信源信息输出的统计特征,而没有考虑信息的具体含义和效用。也就是说,信息熵有它的局限性,它不能描述时间本身的具体含义和主观价值等。2、确定性H(1,0)=0在概率矢量P=(p1,p2,p3,,pn)中,只要有一个分量为1,其它分量必为0,这由概率分布的完备性可以得到。也就是说信源的平均不确定度为0。3、非负性H(P)=H(p1,p2,p3,,pn)0因为P=(p1,p2,p3,,pn)是概率分布,0pi1,-logpi0,故上式成立。需要注意的是,只有离散信源熵才有非负性,连续信源的相对熵将可能出现负值。4、扩展性(p1,p2,p3,,pn-,)=Hn(p1,p2,p3,,pn)这个性质的含义是:增加一个基本不会出现的小概率事件,信源的熵保持不变。虽然小概率事件的出现给予接收者的信息量很大,但在熵的计算中,它占的比重很小,可以忽略不计,这也是熵的总体平均性的体现。5、连续性(p1,p2,p3,,pn-1-,pq+)= Hn(p1,p2,p3,,pn)即信源概率空间中的概率分量的微小波动,不会引起熵的变化。6、递增性H(p1,p2,p3,,pn-1,q1,q2,q3,qm)=H(p1,p2,p3,,pn)+ pn H(q1/ pn ,q2/ pn,q3/ pn,qm/ pn)q1+q2+q3,+qm =pn 这个性质表明,假如有一个信源的n个元素的概率分布为(p1,p2,p3,,pn),其中某个元素pn又被划分为m个元素,这某个元素的概率之和等于pn,这样得到的新信源的熵增加了一项,增加的一项是由于划分产生的不确定性。7、极值性H(p1,p2,p3,,pn) H(1/n,1/n,,1/n)=logn上式中,当且仅当n个离散消息等概率出现时等式成立。这一性质说明,对不同概率分布p(xi)所构成的熵,只有当等概率分布时,信源的不确定性最大,熵达到极大值。8、上凸性熵函数H(p)是概率矢量P=(p1,p2,p3,,pn)的严格上凸函数,正因为熵函数具有上凸性,所以熵函数具有极值,熵函数的最大值存在。9、唯一性四、实验内容1、已知二元信源概率空间为p(x)=x 1-x,对应的二元信源的熵可表示为:H(x)=-xlog2(x)-(1-x)log2(1-x)。通过Matlab软件画出概率分布函数p(x)与熵函数之间的二维曲线图,编写出程序。仿真结果如下图所示:编程过程中要注意的地方:x的步长设置为0.001,H(x)的运算为矩阵运算,必须用点乘:“.*”。2、 用同样的方法画出三元信源空间的熵函数与概率分布的三维曲线图。仿真结果如下所示。 五、思考题1、熵函数的基本性质有哪些?2、最大熵定理的结论是什么?六、实验报告要求写出用Matlab软件画出概率分布函数p(x)与熵函数之间的二维、三维曲线图的程序,并附上仿真结果图。并对本实验进行总结、分析。实验三 费诺编码一、实验目的 1、掌握费诺编码的编码原理 2、熟悉 Matlab 编程。3、通过Matlab仿真费诺编码的过程。 二、实验设备1、计算机2、软件:Matlab三、实验原理费诺编码的步骤: 1、将概率按从大到小的顺序排列;2、按编码进制数将概率分组,使每组概率和尽可能接近或相等;3、给每组分配一位码元;4、将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。四、实验内容对给定信源进行二进制费诺编码,通过MATLAB进行编码过程仿真,并计算平均码长。程序如下:clc;clear;A=0.4,0.3,0.1,0.09,0.07,0.04;A=fliplr(sort(A); m,n=size(A);for i=1:nB(i,1)=A(i); enda=sum(B(:,1)/2;for k=1:n-1if abs(sum(B(1:k,1)-a)<=abs(sum(B(1:k+1,1)-a)break;endendfor i=1:n if i<=kB(i,2)=0;elseB(i,2)=1;endendEND=B(:,2)'END=sym(END);j=3;while (j=0)p=1;while(p<=n)x=B(p,j-1);for q=p:nif x=-1break;elseif B(q,j-1)=xy=1;continue;elsey=0;break;endendendif y=1q=q+1;endif q=p|q-p=1B(p,j)=-1;elseif q-p=2B(p,j)=0;END(p)=char(END(p),'0'B(q-1,j)=1;END(q-1)=char(END(q-1),'1'elsea=sum(B(p:q-1,1)/2;for k=p:q-2if abs(sum(B(p:k,1)-a)<=abs(sum(B(p:k+1,1)-a);break;endendfor i=p:q-1if i<=kB(i,j)=0;END(i)=char(END(i),'0'elseB(i,j)=1;END(i)=char(END(i),'1'endendendendp=q;endC=B(:,j);D=find(C=-1);e,f=size(D);if e=nj=0;elsej=j+1;endendBAENDfor i=1:nu,v=size(char(END(i);L(i)=v;endavlen=sum(L.*A)五、思考题对给定信源进行二进制费诺编码。写出编码码字,并计算平均码长。六、实验报告要求 写出用Matlab进行费诺编码的程序,并给出仿真结果。实验四 霍夫曼编码一、实验目的 1、掌握费诺编码的编码原理 2、熟悉 Matlab 编程。3、通过Matlab仿真霍夫曼编码的过程。 二、实验设备1、计算机2、软件:Matlab三、实验原理霍夫曼编码的步骤:1、把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。2、在分配码字长度时,首先将出现概率最小的两个符号的概率相加合成一个概率。3、把这个合成概率看成是一个新组合符号的概率,重复上述做法直到最后只剩下两个符号概率为止。4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为0,概率小的赋为1。四、实验内容对给定信源进行二进制霍夫曼编码,通过MATLAB进行编码过程仿真,并计算平均码长。程序如下:clc; clear; A=0.2,0.19,0.18,0.17,0.15,0.1,0.01; A=fliplr(sort(A);%按降序排列T=A;m,n=size(A); B=zeros(n,n-1);for i=1:n B(i,1)=T(i); endr=B(i,1)+B(i-1,1); T(n-1)=r;T(n)=0;T=fliplr(sort(T);t=n-1;for j=2:n-1 for i=1:t B(i,j)=T(i); end K=find(T=r); B(n,j)=K(end); r=(B(t-1,j)+B(t,j); T(t-1)=r; T(t)=0; T=fliplr(sort(T); t=t-1;endB; END1=sym('0,1'); END=END1;t=3;d=1;for j=n-2:-1:1 for i=1:t-2 if i>1 & B(i,j)=B(i-1,j) d=d+1; else d=1; end B(B(n,j+1),j+1)=-1; temp=B(:,j+1); x=find(temp=B(i,j); END(i)=END1(x(d); end y=B(n,j+1); END(t-1)=char(END1(y),'0' END(t)=char(END1(y),'1' t=t+1; END1=END;end A END for i=1:n a,b=size(char(END(i); L(i)=b;endavlen=sum(L.*A) H1=log2(A);H=-A*(H1') P=H/avlen%五、思考题对给定信源进行二进制霍夫曼编码。写出编码码字,并计算平均码长。六、实验报告要求 写出用Matlab进行霍夫曼编码的程序,并给出仿真结果。实验五 香农编码一、实验目的 1、掌握香农的编码原理 2、熟悉 C+编程。3、通过C+仿真香农编码的过程。 二、实验设备1、计算机2、软件:C+三、实验原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码1、将信源消息符号按其出现的概率大小排列: 2、确定满足下列不等式的整数码长Ki ; 3、为了编成唯一可译码,计算第i个消息的累加概率:4、将累加概率Pi变换成二进制数。5、取Pi二进制数的小数点后K i 位即为该消息符号的二进制码。四、实验内容对给定信源进行二进制香农编码,通过C+进行编码过程仿真。香农(Shannon)编码参考程序int main() int N; cout<<”请输入信源符号个数:”;cin>>N; cout<<”请输入各符号的概率:”<<endl; double *X=new doubleN; /离散无记忆信源 int i,j; for(i=0;i<N;i+) cout<<”X”<<i+1<<”=”;cin>>Xi;/由小到大排序 for(i=0;i<N;i+) for(j=i+1;j<N;j+) if(Xi<Xj) double temp=Xi;Xi=Xj;Xj=temp; int *K=new intN; /确定码长 for(i=0;i<N;i+) Ki=int(-(log(Xi)/log(2)+1; /确认码长为 1-log2(p(xi) if(Ki=(-(log(Xi)/log(2)+1)/当Ki=-log2(p(xi)时,Ki- Ki-; /累加概率 double *Pa=new doubleN;pa0=0.0; for(i=1;i<N;i+) pai=pai-1+Xi-1; /将累加概率转换为二进制 string *code=new stringN; for(i=0;i<N;i+) for(j=0;j<N;j+) /这里默认最大码长不超过信源符号个数 double temp=Pai*2; if(temp>=1) /累加概率乘2大于1,对应码字加1,累加概率自身取余 codei+=”1”;Pai=Pai*2-1; else /累加概率乘2小于1时,对应码字加0,累加概率自身取余 codei+=”0”;Pai*= 2; for(i=0;i<N;i+) codei= codei.substr(0,Ki); /求码字 /输出码字 cout<<setw(12)<<”信源”<<setw(12)<<”概率p(x)”<<setw(12)<<”累加概率 Pa(x)”<<setw(8)<<”码长 K”<<setw(8)<<”码字”<<endl; for(i=0;i<N;i+)cout<<setw(12)<<i+1<<setw(12)<<Xi<<setw(12)<<Pai”<<setw(8)<< Ki<<setw(8)<<codei<<endl; delete X; delete Pa; delete K; delete code; getch(); retuen 0;五、思考题对给定信源进行二进制香农编码。写出编码码字,并计算平均码长。六、实验报告要求 写出用C+进行香农编码的程序,并给出仿真结果。专心-专注-专业