信息论与编码实验报告材料
- 格式:doc
- 大小:411.30 KB
- 文档页数:29
信息论与编码实验报告信息论与编码实验报告实验一:英文文本信息量的计算一、实验目的及要求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数组中。
信息论与编码实习报告指导老师:姓名:班级:学号:实验一绘制二进制熵函数曲线一、内容用Matlab软件制作二进制熵函数曲线。
二、要求1.掌握Matlab绘图函数2.掌握、理解熵函数表达式及其性质三.Matlab程序及实验结果1.matlab程序:p=0.00001:0.001:1;h=-p.*log2(p)-(1-p).*log2(1-p);plot(p,h);title('二进制熵函数曲线');ylabel('H(P,1-P)')2.运行结果:结果分析:从图中可已看出当p=0.5即信源等概时熵取得最大值。
实验二一般信道容量迭代算法一、内容编程实现一般信道容量迭代算法。
伪代码见教材。
二、要求1.掌握一般信道容量迭代算法的原理2.掌握MA TLAB开发环境的使用(尤其是程序调试技巧),或者使用C语言完成程序设计三.Matlab程序及运行结果1.matlab程序:clc;clear all;N = input('输入信源符号X的个数N=');M = input('输入信源符号Y的个数M=');p_yx=zeros(N,M); %程序设计需要信道矩阵初始化为零fprintf('输入信道矩阵概率\n')for i=1:Nfor j=1:Mp_yx(i,j)=input('p_yx='); %输入信道矩阵概率if p_yx(i)<0error('不符合概率分布')endendEndfor i=1:N %各行概率累加求和s(i)=0;for j=1:Ms(i)=s(i)+p_yx(i,j);endendfor i=1:N %判断是否符合概率分布if (s(i)<=0.999999||s(i)>=1.000001)error('不符合概率分布')endendb=input('输入迭代精度:'); %输入迭代精度for i=1:Np(i)=1.0/N; %取初始概率为均匀分布endfor j=1:M %计算Q(j)Q(j)=0;for i=1:NQ(j)=Q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算F(i) f(i)=0;for j=1:Mif(p_yx(i,j)==0)f(i)=f(i)+0;elsef(i)=f(i)+p_yx(i,j)*log(p_yx(i,j)/Q(j));endendF(i)=exp(f(i));endx=0;for i=1:N %计算x x=x+p(i)*F(i);endIL=log2(x); %计算ILIU=log2(max(F)); %计算IUn=1;while((IU-IL)>=b) %迭代计算for i=1:Np(i)=p(i)*F(i)/x; %重新赋值p(i) endfor j=1:M %计算Q(j) Q(j)=0;for i=1:NQ(j)=Q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算F(i) f(i)=0;for j=1:Mif(p_yx(i,j)==0)f(i)=f(i)+0;elsef(i)=f(i)+p_yx(i,j)*log(p_yx(i,j)/Q(j));endEndF(i)=exp(f(i));endx=0;for i=1:N %计算xx=x+p(i)*F(i);endIL=log2(x); %计算ILIU=log2(max(F)); %计算IUn=n+1;endfprintf('信道矩阵为:\n');disp(p_yx);fprintf('迭代次数n=%d\n',n);fprintf('信道容量C=%f比特/符号',IL);2.运行结果为:若输入信道矩阵为:0.8500 0.15000.7500 0.2500则运行结果为:实验四线性分组码的信道编码和译码一、内容编程实现线性分组码(6,2)重复码的信道编码和译码。
信息论与编码实验2-实验报告信息论与编码实验 2 实验报告一、实验目的本次信息论与编码实验 2 的主要目的是深入理解和应用信息论与编码的相关知识,通过实际操作和数据分析,进一步掌握信源编码和信道编码的原理及方法,提高对信息传输效率和可靠性的认识。
二、实验原理(一)信源编码信源编码的目的是减少信源输出符号序列中的冗余度,提高符号的平均信息量。
常见的信源编码方法有香农编码、哈夫曼编码等。
香农编码的基本思想是根据符号出现的概率来分配码字长度,概率越大,码字越短。
哈夫曼编码则通过构建一棵最优二叉树,为出现概率较高的符号分配较短的编码,从而实现平均码长的最小化。
(二)信道编码信道编码用于增加信息传输的可靠性,通过在发送的信息中添加冗余信息,使得在接收端能够检测和纠正传输过程中产生的错误。
常见的信道编码有线性分组码,如汉明码等。
三、实验内容与步骤(一)信源编码实验1、选取一组具有不同概率分布的信源符号,例如:A(02)、B (03)、C(01)、D(04)。
2、分别使用香农编码和哈夫曼编码对信源符号进行编码。
3、计算两种编码方法的平均码长,并与信源熵进行比较。
(二)信道编码实验1、选择一种线性分组码,如(7,4)汉明码。
2、生成一组随机的信息位。
3、对信息位进行编码,得到编码后的码字。
4、在码字中引入随机错误。
5、进行错误检测和纠正,并计算错误纠正的成功率。
四、实验结果与分析(一)信源编码结果1、香农编码的码字为:A(010)、B(001)、C(100)、D (000)。
平均码长为 22 比特,信源熵约为 184 比特,平均码长略大于信源熵。
2、哈夫曼编码的码字为:A(10)、B(01)、C(111)、D (00)。
平均码长为 19 比特,更接近信源熵,编码效率更高。
(二)信道编码结果在引入一定数量的错误后,(7,4)汉明码能够成功检测并纠正大部分错误,错误纠正成功率较高,表明其在提高信息传输可靠性方面具有较好的性能。
《信息论与编码技术》实验报告实验一:请根据公式-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个码。
NANCHANG UNIVERSITY信息论与编码实验报告(2018年11月27日)学院:信息工程学院系电子信息工程系专业班级:学生姓名:学号:指导教师:目录实验一自信息量和熵源.............................................................................................. 实验二准对称信道容量.............................................................................................. 实验三费诺不等式...................................................................................................... 实验四香农编码.......................................................................................................... 实验五费诺编码.......................................................................................................... 实验六霍夫曼编码......................................................................................................实验一自信息量和熵源一、实验要求1、画出I=-的函数图;2、画出H(p)=-p-(1-p)函数图。
二、实验原理及理论分析自信息量:一个事件的自信息量就是对其不确定性的度量。
信息论与编码实习报告一、引言信息论与编码是通信工程、计算机科学和电子工程等领域的重要基础课程。
本次实习旨在通过实际操作,深入理解和掌握信息论与编码的基本原理和技术,提高我们的实际操作能力和问题解决能力。
二、实习内容1、信息论基础:实习的第一部分,我们通过自学和讨论的方式,深入学习了信息论的基本概念和原理,包括信息的度量、熵、信道容量等。
2、编码理论:在这一阶段,我们重点学习了线性编码、循环编码、哈夫曼编码等编码方法,并了解了编码的效率及其可靠性。
3、模拟与数字通信系统:我们通过模拟软件,设计和实现了简单的模拟通信系统,同时,也通过实验箱,了解了数字通信系统的基本原理和技术。
4、无线通信和网络:在这一部分,我们重点学习了无线通信和网络的基础知识,包括无线信道模型、无线调制解调技术、无线网络协议等。
5、实习项目:最后,我们根据所学的知识,完成了一个实习项目——设计并实现一个具有高可靠性和高效率的通信系统。
三、实习收获通过这次实习,我们收获颇丰。
首先,我们对信息论与编码的基本概念和原理有了更深入的理解和掌握,能够更好地将理论知识应用到实际中。
其次,我们提高了自己的实际操作能力和问题解决能力,能够在实践中发现和解决问题。
最后,我们了解了通信系统的基本原理和技术,对未来的学习和工作有了更好的准备。
四、结论本次实习是我们学习信息论与编码的重要环节,我们通过实际操作,深入理解和掌握了信息论与编码的基本原理和技术,提高了自己的实际操作能力和问题解决能力。
我们也发现了自己的不足之处,将在未来的学习和工作中更加努力,不断提高自己的能力和水平。
信息论与编码曹雪虹课后习题答案随着科技的发展,信息已经成为现代社会中不可或缺的一部分。
在大学中,信息论与编码作为一门重要的学科,已经成为了计算机科学、通信工程、电子工程等专业的必修课程。
而在这门课程中,曹雪虹教授的教材《信息论与编码》被广泛使用。
本文将介绍一些该教材的课后习题答案,以帮助读者更好地掌握信息论与编码的相关知识。
信息论与编码实验报告一、实验目的本实验主要目的是通过实验验证信息论与编码理论的基本原理,了解信息的产生、传输和编码的基本过程,深入理解信源、信道和编码的关系,以及各种编码技术的应用。
二、实验设备及原理实验设备:计算机、编码器、解码器、信道模拟器、信噪比计算器等。
实验原理:信息论是由香农提出的一种研究信息传输与数据压缩问题的数学理论。
信源产生的消息通常是具有统计规律的,信道是传送消息的媒体,编码是将消息转换成信号的过程。
根据信息论的基本原理,信息的度量单位是比特(bit),一个比特可以表示两个平等可能的事件。
信源的熵(Entropy)是用来衡量信源产生的信息量大小的物理量,熵越大,信息量就越多。
信道容量是用来衡量信道传输信息的极限容量,即信道的最高传输速率,单位是比特/秒。
编码是为了提高信道的利用率,减少传输时间,提高传输质量等目的而进行的一种信号转换过程。
常见的编码技术有霍夫曼编码、香农-费诺编码、区块编码等。
三、实验步骤1.运行编码器和解码器软件,设置信源信息,编码器将信源信息进行编码,生成信道输入信号。
2.设置信道模拟器的信道参数,模拟信道传输过程。
3.将信道输出信号输入到解码器,解码器将信道输出信号进行解码,恢复信源信息。
4.计算信道容量和实际传输速率,比较两者的差异。
5.改变信道参数和编码方式,观察对实际传输速率的影响。
四、实验结果与分析通过实验,我们可以得到不同信道及编码方式下的信息传输速率,根据信道参数和编码方式的不同,传输速率有时会接近信道容量,有时会低于信道容量。
这是因为在真实的传输过程中,存在信噪比、传输距离等因素导致的误码率,从而降低了实际传输速率。
在实验中,我们还可以观察到不同编码方式对传输速率的影响。
例如,霍夫曼编码适用于信源概率分布不均匀的情况,可以实现数据压缩,提高传输效率。
而区块编码适用于数据容量较大的情况,可以分块传输,降低传输错误率。
此外,通过实验我们还可以了解到信息论中的一些重要概念,如信源熵、信道容量等。
中南大学信息论编码实验报告题目信息论编码学生姓名汤思远指导教师张祖平学院信息院学号 090912052专业班级电子1班完成时间 14/12/5实验一 关于信源熵的实验一、实验目的1. 掌握离散信源熵的原理和计算方法。
2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。
3. 自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具求解图像熵。
4. 掌握Excel 的绘图功能,使用Excel 绘制散点图、直方图。
二、实验原理1. 离散信源相关的基本概念、原理和计算公式产生离散信息的信源称为离散信源。
离散信源只能产生有限种符号。
随机事件的自信息量I (x i )为其对应的随机变量x i 出现概率对数的负值。
即:I (x i )= -log 2 p (x i )随机事件X 的平均不确定度(信源熵)H (X )为离散随机变量x i 出现概率的数学期望,即:∑∑-==i ii i i i x p x p x I x p X H )(log )()()()(2. 信源的信息熵设信源符号集X ={a1,a2,…,ar},每个符号发生的概率分别为p (a1)=p 1,p (a2)=p 2,…,p (ar),即信源的概率空间为,⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡)(...... )2(2 )1(1ar p ar a p a a p a P X 则该信源的信源熵为:H (X ) = - p (a1) log p (a1) –p (a2) log p (a2) –…–p (ar) log p (ar)3. 信道的数学模型与相关熵的计算• 单符号离散无噪声无损信道的信道容量 ()max (;)bit/i p x C I X Y =信道符号4. MATLAB 二维绘图用matlab 中的命令plot(x , y )就可以自动绘制出二维图来。
例1-2,在matlab 上绘制余弦曲线图,y = cos x ,其中0 ≤ x ≤ 2π。
实验一:计算离散信源的熵一、实验设备: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 程序。
《信息论与编码》实验报告《信息论与编码》实验报告实验序号:02 实验项目名称:离散信道及其信道容量结论:1、当输入和输出符号个数相同,且都等于r 时,则此信道称为强对称信道或均匀信道;2、这类信道中总的错误概率为 p ,对称地平均分配给r-1个输出符号。
实验内容二:平均互信息I (X ;Y )是凸函数的论文一、 问题:由信源的概率分布P (Y )=对x 求和P (X )*P(Y|X)和平均互信息I(X;Y)=对x,y 求和p(x)*P(y|x)*logP(y|x)/P(y)可知,平均互信息只与信源的概率分布和信道的传递概率有关,但是它们之间有种什么关系?二、 证明定理一:平均互信息I(X;Y)是输入信源的概率分布P(x)的形函数(上凸函数)解: 根据上凸函数的定义来证明,先固定信道,即信道的传递概率P(y|x)是固定的。
那么平均互信息I(X;Y)将只是P(x)的函数,简写成I[P(x)]。
现选择输入信源X 的两种已知的概率分布P1(x)和P2(x)。
其对应的联合分布概率为P1(xy)=P1(x)P(y|x)和P2(xy)=P2(x)P(y|x),因而信道输出端的平均互信息分别为I[P1(x)]和I[P2(x)]。
再选择输入变量X 的另一种概率分布P(x),令01θ<<,和1θθ+=,而P(x)= 12()()P x P x θθ+,因而得其相应的平均互信息为I[P(x)]。
根据平均互信息的定义得1212,,,12[()][()][()](|)(|)(|)()log()log ()log ()()()x yx y x y I P x I P x I P x P y x P y x P y x P xy P xy P xy P y P y P y θθθθ+-=+-∑∑∑结论:平均互信息与信源的概率分布有关,有上可知,平均互信息是输入信源的概率分布P(x)的形凸函数。
定理二:平均互信息I(X;Y)是信道传递概率P(Y|X)的形凸函数(又称下凸函数)猜想:由平均互信息是输入信源的概率分布的形凸函数知,当固定某信道时,选择不同的信源(其概率分布不同)与信道连接,在信道输出端接收到每个符号后获得的信息量是不同的。
本科生实验报告实验课程信息理论与编码学院名称信息科学与技术学院专业名称学生姓名学生学号指导教师实验地点实验成绩二〇一六年九月----二〇一六年十一月填写说明1、适用于本科生所有的实验报告(印制实验报告册除外);2、专业填写为专业全称,有专业方向的用小括号标明;3、格式要求:①用A4纸双面打印(封面双面打印)或在A4大小纸上用蓝黑色水笔书写。
②打印排版:正文用宋体小四号,1.5倍行距,页边距采取默认形式(上下2.54cm,左右2.54cm,页眉1.5cm,页脚1.75cm)。
字符间距为默认值(缩放100%,间距:标准);页码用小五号字底端居中。
③具体要求:题目(二号黑体居中);摘要(“摘要”二字用小二号黑体居中,隔行书写摘要的文字部分,小4号宋体);关键词(隔行顶格书写“关键词”三字,提炼3-5个关键词,用分号隔开,小4号黑体);正文部分采用三级标题;第1章××(小二号黑体居中,段前0.5行)1.1 ×××××小三号黑体×××××(段前、段后0.5行)1.1.1小四号黑体(段前、段后0.5行)参考文献(黑体小二号居中,段前0.5行),参考文献用五号宋体,参照《参考文献著录规则(GB/T 7714-2005)》。
实验一:香农(Shannon )编码一、实验目的掌握通过计算机实现香农编码的方法。
二、实验要求对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
三、实验基本原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1.将信源消息符号按其出现的概率大小排列)()()(21n x p x p x p ≥≥≥ 2.确定满足下列不等式的整数码长K i ;1)(log )(log 22+-<≤-i i i x p K x p3.为了编成唯一可译码,计算第i 个消息的累加概率∑-==11)(i k k i x p p4.将累加概率P i 变换成二进制数。
5.取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。
四、实验内容1.对给定信源⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡01.01.015.017.018.019.02.0)(7654321x x x x x x x X q X 进行二进制香农编码。
2.对给定信源⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡05.010.015.020.025.025.0)(654321x x x x x x X q X 进行二进制香农编码。
3.自已选择一个例子进行香农编码。
五、实验设备PC 计算机 ,C++六、实验报告要求1、画出程序设计的流程图,2、写出程序代码,3、写出在调试过程中出现的问题,4、对实验的结果进行分析。
七、流程图八、程序代码// test.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include <iostream>#include <iomanip>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int test;int N;cout<<"请输入信源符号个数:";cin>>N;cout<<"请输入各符号的概率:"<<endl;double *X=new double[N]; //离散无记忆信源int i,j;for(i=0;i<N;i++){cout<<"X["<<i+1<<"]=";cin>>X[i];}//由小到大排序for(i=0;i<N;i++)for(j=i+1;j<N;j++)if(X[i]<X[j]){ double temp=X[i];X[i]=X[j];X[j]=temp;}int *K=new int[N]; //确定码长for(i=0;i<N;i++){K[i]=int(-(log(X[i])/log(2.0)))+1; //确认码长为1-log2(p(xi))if(K[i]==(-(log(X[i])/log(2.0)))+1)//当K[i]=-log2(p(xi))时,K[i]--K[i]--;}//累加概率double *pa=new double[N];pa[0]=0.0;double *p=new double[N];p[0]=0.0;for(i=1;i<N;i++){pa[i]=pa[i-1]+X[i-1];p[i]=pa[i];}//将累加概率转换为二进制string *code=new string[N];for(i=0;i<N;i++)for(j=0;j<N;j++) //这里默认最大码长不超过信源符号个数{double temp=pa[i]*2;if(temp>=1) //累加概率乘2大于1,对应码字加1,累加概率自身取余{code[i]+="1";pa[i]=pa[i]*2-1;}else //累加概率乘2小于1时,对应码字加0,累加概率自身取余{code[i]+="0";pa[i]*= 2;}}for(i=0;i<N;i++){ code[i]= code[i].substr(0,K[i]); } //求码字//输出码字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)<<X[i]<<setw(12)<<p[i]<<setw(8)<<K[i]<<setw(8)<<(code+i)->data()<<endl;delete []X;delete []pa;delete []K;delete []code;cin>>test;return 0;}实验二:费诺编码一、实验目的掌握通过计算机实现费诺编码。
二、实验要求对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。
三、实验基本原理费诺编码的步骤:1.将概率按从大到小的顺序排列;2.按编码进制数将概率分组,使每组概率和尽可能接近或相等;3.给每组分配一位码元;4.将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。
四、实验内容1.对给定信源⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡01.01.015.017.018.019.02.0)(7654321xxxxxxxXqX进行二进制费诺编码。
2.对给定信源⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡05.010.015.020.025.025.0)(654321xxxxxxXqX进行二进制费诺编码。
3.自已选择一个例子进行费诺编码。
五、实验设备PC计算机,C++六、实验报告要求1、画出程序设计的流程图,2、写出程序代码,3、写出在调试过程中出现的问题,4、对实验的结果进行分析。
七、流程图八、程序代码//feinuo.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include <iostream>#include <iomanip>#include<cmath>#include<string>using namespace std;//int _tmain(int argc, _TCHAR* argv[])int n;string *sign;double *p;string *code;void fano(int a,int b) //费诺编码函数{if((b-a)>=1) //判断该组中符号个数是否大于2{double sum=0;for(int i=a;i<=b;i++)sum+=p[i]; //计算该组概率累加和double s1=0, *s=new double[10];for(int i=a;i<=b;i++){s1+=p[i];s[i]=fabs(2*s1-sum)/sum;}double min=s[a]; int c;for(int i=a;i<=b;i++)if(s[i]<=min){min=s[i]; c=i; //定位使两组概率和尽可能相近或相等的位置c}for(int i=a;i<=b;i++){if(i<=c) code[i]+="0"; //码字加"0"else code[i]+="1"; //码字加"1"}//判断分组点位置,进而分情况自身调用if(c==a)fano(c+1,b);else if(c==b-1)fano(a,c);else{ fano(a,c);fano(c+1,b); }}}void main(){int feinuo;cout<<"请输入信源符号个数n:";cin>>n;p=new double[n];sign=new string[n];code=new string[n];cout<<"请输入信源符号:" ;for(int i=0;i<n;i++)cin>>sign[i];cout<<"请输入信源符号的概率:" ;for(int i=0;i<n;i++) cin>>p[i];for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(p[i]<p[j]){double temp=p[i];p[i]=p[j];p[j]=temp;string m=sign[i]; sign[i]= sign[j]; sign[j]=m;}fano(0,n-1); //费诺编码cout<<setw(8)<<"信源符号"<<setw(8)<<"概率"<<setw(8)<<" 码字"<<setw(8)<<"码长" <<endl;for(int i=0;i<n;i++)cout<<setw(8)<<sign[i]<<setw(8)<<p[i]<<setw(8)<<code[i]<<setw(8)<<code[i].length()<<endl;delete []p; delete []sign; delete []code; cin>>feinuo;}实验三:霍夫曼编码一、实验目的掌握通过计算机实现霍夫曼编码二、实验要求对于给定的信源的概率分布,按照霍夫曼编码的方法进行计算机实现。