信息论与编码实验报告
信息论与编码实验报告
信息论与编码实验报告信息论与编码实验报告实验一:英文文本信息量的计算一、实验目的及要求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数组中。
信息论编码实验报告 费诺编码附源代码
中南大学信息论与编码实验报告选题:费诺编码学生姓名:学号:专业班级:通信工程指导老师:学院:信息科学与工程学院时间: 2015目录一、实验目的二、实验原理2.1 费诺编码思想2.2 费诺编码流程图三、实验内容四、实验要求五、代码调试结果六、心得体会七、程序源代码一实验目的1. 掌握费诺编码的原理和过程。
2. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。
二、实验原理2.1 费诺编码思想设有离散无记忆信源∑==⎥⎦⎤⎢⎣⎡ni i n n x p x p x p x p x x x 121211)(,)(.....)()(.....1.按信源符号的概率从大到小的顺序排队 不妨设)(......)()(21n x p x p x p ≥≥≥2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
4.如此重复,直至每个组只剩下一个信源符号为止。
5.信源符号所对应的码字即为费诺码。
例:有一单符号离散无记忆信源⎭⎬⎫⎩⎨⎧=⎥⎦⎤⎢⎣⎡04.008.016.018.022.032.0)(654321x x x x x x X P X对该信源编二进制费诺码)i /(35.2)(gn s bit X H = m L KR 2log =%92.97)(==R x H η∑===61)/(4.2)(i i i k x p K 符号比特2.2 费诺编码流程图三、实验内容使用C\C++实现费诺编码,并自己设计测试案例。
四、实验要求1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。
3.认真撰写实验报告,内容可以自己编排,可以考虑包括以下一些方面:原理概述、程序设计与算法描述、源程序及注释(程序太长可以只选取重要部分)、运行输出结果实例、调试和运行程序过程中产生的问题及采取的措施、对实验的讨论分析、总结。
信息论与编码实验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.改变信道参数和编码方式,观察对实际传输速率的影响。
四、实验结果与分析通过实验,我们可以得到不同信道及编码方式下的信息传输速率,根据信道参数和编码方式的不同,传输速率有时会接近信道容量,有时会低于信道容量。
这是因为在真实的传输过程中,存在信噪比、传输距离等因素导致的误码率,从而降低了实际传输速率。
在实验中,我们还可以观察到不同编码方式对传输速率的影响。
例如,霍夫曼编码适用于信源概率分布不均匀的情况,可以实现数据压缩,提高传输效率。
而区块编码适用于数据容量较大的情况,可以分块传输,降低传输错误率。
此外,通过实验我们还可以了解到信息论中的一些重要概念,如信源熵、信道容量等。
信息论与编码实验一离散信源信息量的计算
信息论与编码实验一离散信源信息量的计算【实用版】目录一、信息论与编码实验一概述二、离散信源的定义与分类三、离散信源信息量的计算方法四、实验过程及结果分析五、总结正文一、信息论与编码实验一概述信息论与编码实验一是一门关于信息论的基本概念和方法的实验课程。
信息论是研究信息传输、存储、处理和控制的科学,其目的是为了提高通信系统的效率和可靠性。
实验一的主要目的是让学生了解离散信源的定义、性质和计算方法,并掌握如何使用 Matlab 软件进行离散信源信息量的计算。
二、离散信源的定义与分类离散信源是指其输出信号为离散信号的信源,常见的离散信源有伯努利信源、马尔可夫信源等。
根据信源的性质和特点,离散信源可以分为离散无记忆信源和离散有记忆信源。
离散无记忆信源是指信源的输出信号只与当前输入信号有关,而与过去的输入信号无关;离散有记忆信源是指信源的输出信号与过去的输入信号有关。
三、离散信源信息量的计算方法离散信源的信息量是指信源输出的符号所包含的信息量,通常用比特(bit)来表示。
离散信源的信息量的计算方法主要有两种:一种是基于概率的计算方法,另一种是基于熵的计算方法。
基于概率的计算方法是通过计算信源输出符号的概率来计算信息量;基于熵的计算方法是通过计算信源的熵来计算信息量。
熵是信息论中用于度量信息量的一个重要概念,它表示信息的不确定性。
四、实验过程及结果分析在实验过程中,学生需要首先了解离散信源的定义和性质,然后通过Matlab 软件计算离散信源的熵,并根据熵的计算结果分析信源的信息量。
在实验中,学生需要编写 Matlab 程序,计算离散信源的熵,并绘制熵的图像。
通过实验,学生可以加深对离散信源的理解和掌握离散信源信息量的计算方法。
五、总结信息论与编码实验一是一门关于信息论的基本概念和方法的实验课程。
通过实验,学生可以了解离散信源的定义和性质,掌握离散信源信息量的计算方法,并熟练使用 Matlab 软件进行离散信源信息量的计算。
信息论与编码理论课程实验报告
二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)
设备:PC机
软件:matlab 2007
0.0055 0.0115 0.0061 0.0176 0
构建信源模型如下:
h i j k l m n
0.0267 0.0672 0.0042 0.0030 0.0521 0.0212 0.0733
o p q r s t u
0.0842 0.0254 0.0048 0.0648 0.0933 0.0739 0.0327
9.实验报告独立完成,无抄袭现象,并按时提交,格式规范。
综合评定:
附录(程序源代码)
1.编写MATLAB程序
clc
clear all
%随机输入一组数据
string='abdddssdsssdabaabaddkkidkidkdiakdjjaidjaid';
%将上述中所有英文字母化为小写
string=lower(string);
自评/互评成绩:100(评阅者签名:熊萌萌)
2、教师评价
评价标准
评语等级
优
良
中
及格
不合格
1.实验态度认真,实验目的明确
2.实验方案或流程图思路清晰、合理
3.实验程序设计合理,能运行
4.实验步骤记录详细,具备可读性
5.实验数据合理
6.实验结论正确
7.实验总结分析合理、透彻
8.实验报告完整、文字叙述流畅,逻辑性强
信息论与编码实验报告
实验一:计算离散信源的熵一、实验设备: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 程序。
信息论与编码课程实验报告
福建农林大学计算机与信息学院信息工程类信息论与编码课程实验报告实验项目列表实验名称1:信源建模一、实验目的和要求(1)进一步熟悉信源建模;(2)掌握MATLAB程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。
二、实验内容(1)假设在一个通信过程中主要传递的对象以数字文本的方式呈现。
(2)我们用统计的方式,发现这八个消息分别是由N1,N2,…,N8个符号组成的。
在这些消息是中出现了以下符号(符号1,符号2,…,符号M)每个符号总共现了(次数1,次数2,…,次数M)我们认为,传递对象的信源模型可表示为:X为随机变量(即每次一个字符);取值空间为:(符号1,符号2,…,符号M);其概率分布列为:(次数1/(N1+…+N8),…,次数M/( N1+…+N8))三、实验环境硬件:计算机软件:MATLAB四、实验原理图像和语声是最常用的两类主要信源。
要充分描述一幅活动的立体彩色图像,须用一个四元的随机矢量场X(x,y,z,t),其中x,y,z为空间坐标;t 为时间坐标;而X是六维矢量,即表示左、右眼的亮度、色度和饱和度。
然而通常的黑白电视信号是对平面图像经过线性扫描而形成。
这样,上述四元随机矢量场可简化为一个随机过程X(t)。
图像信源的最主要客观统计特性是信源的幅度概率分布、自相关函数或功率谱。
关于图像信源的幅度概率分布,虽然人们已经作了大量的统计和分析,但尚未得出比较一致的结论。
至于图像的自相关函数,实验证明它大体上遵从负指数型分布。
其指数的衰减速度完全取决于图像类型与图像的细节结构。
实际上,由于信源的信号处理往往是在频域上进行,这时可以通过傅里叶变换将信源的自相关函数转换为功率谱密度。
功率谱密度也可以直接测试。
语声信号一般也可以用一个随机过程X(t)来表示。
语声信源的统计特性主要有语声的幅度概率分布、自相关函数、语声平均功率谱以及语声共振峰频率分布等。
实验结果表明语声的幅度概率分布可用伽玛(γ)分布或拉普拉斯分布来近似。
信息论与编码技术之实验
前两个是别人的,后两个是自己的,学术交流,抛砖引玉。
信息论与编码 实验报告样板实验室名称:S1-306实验一 二维随机变量信息熵的计算 教学实验报告[实验目的]掌握二变量多种信息量的计算方法。
[实验要求]1.熟悉二变量多种信息量的计算方法,设计实验的数据结构和算法;2.编写计算二维随机变量信息量的书面程序代码。
[实验内容]离散二维随机变换熵的计算说明:(1)利用random 函数和归一化方法构造一个二维离散随机变量(X ,Y );(2)分别计算X 与Y 的熵、联合熵、条件熵:H (X )、H (Y )、H (X,Y )H (X|Y )、I (X|Y );(3)对测试通过的程序进行规范和优化;(4)编写本次实验的实验报告。
[实验步骤]实验过程中涉及的各种熵的主要公式(或定义式):1、离散信源熵(平均不确定度/平均信息量/平均自信息量)()()()()log ()i i i i i i H X p x I x p x p x ==-∑∑2、在给定某个y j 条件下,x i 的条件自信息量为I(x i /y j ),X 集合的条件熵H (X/y j )为 ,,(/)(/)(/)Y X H(X/Y)()(/)()(/)(/)()(/)j i j i j ij j j i j i j j i ji j i j i jH X y p x y I x y p y H X y p y p x y I x y p x y I x y ===∑∑∑∑在给定条件下,集合的条件熵为:H(X/Y)=相应地,在给定X (即各个x i )的条件下,Y 集合的条件熵H(Y/X)定义为:,,(/)()(/)()log (/)i j j i i j j i i j i jH Y X p x y I y x p x y p y x ==-∑∑3、联合熵是联合符号集合 XY 上的每个元素对x i y j 的自信息量的概率加权统计平均值,表示X 和Y 同时发生的不确定度。
信息论与编码实验报告
信息论与编码实验报告一、实验目的信息论与编码是一门涉及信息的度量、传输和处理的学科,通过实验,旨在深入理解信息论的基本概念和编码原理,掌握常见的编码方法及其性能评估,提高对信息处理和通信系统的分析与设计能力。
二、实验原理(一)信息论基础信息熵是信息论中用于度量信息量的重要概念。
对于一个离散随机变量 X,其概率分布为 P(X) ={p(x1), p(x2),, p(xn)},则信息熵H(X) 的定义为:H(X) =∑p(xi)log2(p(xi))。
(二)编码原理1、无失真信源编码:通过去除信源中的冗余信息,实现用尽可能少的比特数来表示信源符号,常见的方法有香农编码、哈夫曼编码等。
2、有噪信道编码:为了提高信息在有噪声信道中传输的可靠性,通过添加冗余信息进行纠错编码,如线性分组码、卷积码等。
三、实验内容及步骤(一)信息熵的计算1、生成一个离散信源,例如信源符号集为{A, B, C, D},对应的概率分布为{02, 03, 01, 04}。
2、根据信息熵的定义,使用编程语言计算该信源的信息熵。
(二)香农编码1、按照香农编码的步骤,首先计算信源符号的概率,并根据概率计算每个符号的编码长度。
2、确定编码值,生成香农编码表。
(三)哈夫曼编码1、构建哈夫曼树,根据信源符号的概率确定树的结构。
2、为每个信源符号分配编码,生成哈夫曼编码表。
(四)线性分组码1、选择一种线性分组码,如(7, 4)汉明码。
2、生成编码矩阵,对输入信息进行编码。
3、在接收端进行纠错译码。
四、实验结果与分析(一)信息熵计算结果对于上述生成的离散信源,计算得到的信息熵约为 184 比特/符号。
这表明该信源存在一定的不确定性,需要一定的信息量来准确描述。
(二)香农编码结果香农编码表如下:|信源符号|概率|编码长度|编码值|||||||A|02|232|00||B|03|174|10||C|01|332|110||D|04|132|111|香农编码的平均码长较长,编码效率相对较低。
信息论与编码实验报告
信息论与编码实验报告一、实验目的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.传输质量:计算了误码率和信噪比,分析了不同编码方法的传输质量。
六、实验总结通过本次实验,我深刻理解了信息论与编码的基本概念和原理,并掌握了信息论与编码实验的实验方法和实验技能。
在实验过程中,我遇到了一些困难,比如对编码方法的理解和实验数据的处理。
信息论与编码实验报告
信息论与编码实验报告实验⼀关于硬币称重问题的探讨⼀、问题描述:假设有N 个硬币,这N 个硬币中或许存在⼀个特殊的硬币,这个硬币或轻或重,⽽且在外观上和其他的硬币没什么区别。
现在有⼀个标准天平,但是⽆刻度。
现在要找出这个硬币,并且知道它到底是⽐真的硬币重还是轻,或者所有硬币都是真的。
请问:1)⾄少要称多少次才能达到⽬的;2)如果N=12,是否能在3 次之内将特殊的硬币找到;如果可以,要怎么称?⼆、问题分析:对于这个命题,有⼏处需要注意的地⽅:1)特殊的硬币可能存在,但也可能不存在,即使存在,其或轻或重未知;2)在⽬的上,不光要找到这只硬币,还要确定它是重还是轻;3)天平没有刻度,不能记录每次的读数,只能判断是左边重还是右边重,亦或者是两边平衡;4)最多只能称3 次。
三、解决⽅案:1.关于可⾏性的分析在这⾥,我们把称量的过程看成⼀种信息的获取过程。
对于N 个硬币,他们可能的情况为2N+1 种,即重(N 种),轻(N 种)或者⽆假币(1 种)。
由于这2N+1 种情况是等概率的,这个事件的不确定度为:Y=Log(2N+1)对于称量的过程,其实也是信息的获取过程,⼀是不确定度逐步消除的过程。
每⼀次称量只有3 种情况:左边重,右边重,平衡。
这3 种情况也是等概率的,所以他所提供的信息量为:y=Log3在K 次测量中,要将事件的不确定度完全消除,所以K= Log(2N+1)/ Log3根据上式,当N=12 时,K= 2.92< 3 所以13 只硬币是可以在3 次称量中达到⽬的的。
通过此式,我们还可以计算得到:通过3 次测量⽽找出异常硬币,N 的最⼤值为13.2.⽅案的提出为了描述⽅便,我们给这12枚硬币分别编号(1)-(12)。
⾸先,任选8个⽐较,如选:⑴⑵⑶⑷⽐⑸⑹⑺⑻1.若⼀样重,则假币在⑼~⑿中,第⼆步:⑼⑽⽐⑾⑴(1)若⼀样重,则可能的假币为⑿。
则第三步:⑴⽐⑿a.若⼀样重,则没有假币;b.不⼀样重,则假币为⑿:如果(1)>(12),则假币轻,反之,假币重;(2)若⑼⑽重,则第三步:⑼⽐⑽a.若⼀样重,则假币为⑾(较轻)b.不⼀样重,则假币为⑼、⑽中较重者(3)若⑼⑽轻,则第三步:⑼⽐⑽a.若⼀样重,则假币为⑾(较重)b.不⼀样重,则假币为⑼、⑽中较轻者2.若⑴⑵⑶⑷重,则第⼆步:⑴⑵⑸⽐⑶⑷⑹(1)若⼀样重,则假币在⑺⑻中,第三步:⑺⽐⑻假币为⑺、⑻中较轻者(2)若⑴⑵⑸端较重,则假币在⑴⑵⑹中,第三步:⑴⽐⑵a.若⼀样重,则假币为⑹(较轻)b.不⼀样重,则假币为⑴⑵中较重者(3)若⑶⑷⑹端较重,则假币在⑶⑷⑸中,第三步:⑶⽐⑷a.若⼀样重,则假币为⑸(较轻)b.不⼀样重,则假币为⑶、⑷中较重者3.若⑴⑵⑶⑷轻,则与上⾯类似,第⼆步:⑴⑵⑸⽐⑶⑷⑹(1)若⼀样重,则假币在⑺⑻中,第三步:⑺⽐⑻假币为⑺、⑻中较重者(2)若⑴⑵⑸端较轻,则假币在⑴⑵⑹中,第三步:⑴⽐⑵a.若⼀样重,则假币为⑹(较重)b.不⼀样重,则假币为⑴⑵中较轻者(3)若⑶⑷⑹端较轻,则假币在⑶⑷⑸中,第三步:⑶⽐⑷a.若⼀样重,则假币为⑸(较重)b.不⼀样重,则假币为⑶、⑷中较轻者3.⽤C语⾔编程实现上述⽅案为:#includevoid main(){int i;float a[12];for(i=0;i<12;i++)scanf("%f",&a[i]);if(a[0]+a[1]+a[2]+a[3]==a[4]+a[5]+a[6]+a[7]){if(a[0]+a[1]+a[2]==a[8]+a[9]+a[10]){if(a[8]==a[11])printf("There is no special coin!\n");else if(a[8]>a[11])printf("There is a special coin:%f(12) and it's lighter than others.\n",a[ 11]); elseprintf("There is a special coin:%f(12) and it's heavier than others.\n",a[ 11]); }else if(a[0]+a[1]+a[2]>a[8]+a[9]+a[10]){if(a[8]==a[9])printf("There is a special coin:%f(11) and it's lighter than others.\n",a[ 10]); else if(a[8]>a[9])printf("There is a special coin:%f(10) and it's lighter than others.\n",a[ 9]); elseprintf("There is a special coin:%f(9) and it's lighter than others.\n",a[8 ]);}else{if(a[8]==a[9])printf("There is a special coin:%f(11) and it's heavier than others.\n",a[ 10]); else if(a[8]>a[9])printf("There is a special coin:%f(9) and it's heavier than others.\n",a[8 ]); elseprintf("There is a special coin:%f(10) and it's heavier than others.\n",a[ 9]); }}else if(a[0]+a[1]+a[2]+a[3]>a[4]+a[5]+a[6]+a[7]){if(a[0]+a[2]+a[5]==a[1]+a[4]+a[8]){if(a[6]==a[7])printf("There is a special coin:%f(4) and it's heavier than others.\n",a[3 ]); else if(a[6]>a[7])printf("There is a special coin:%f(8) and it's lighter than others.\n",a[7 ]); elseprintf("There is a special coin:%f(7) and it's lighter than others.\n",a[6 ]);}else if(a[0]+a[2]+a[5]>a[1]+a[4]+a[8]){if(a[0]==a[2])printf("There is a special coin:%f(5) and it's lighter than others.\n",a[4 ]); else if(a[0]>a[2])printf("There is a special coin:%f(1) and it's heavier than others.\n",a[0 ]);elseprintf("There is a special coin:%f(3) and it's heavier than others.\n",a[2 ]); }else{if(a[1]>a[8])printf("There is a special coin:%f(2) and it's heavier than others.\n",a[1 ]); if(a[5]printf("There is a special coin:%f(6) and it's lighter than others.\n",a[5 ]); }}else{if(a[0]+a[2]+a[5]==a[1]+a[4]+a[8]){if(a[6]==a[7])printf("There is a special coin:%f(4) and it's lighter than others.\n",a[3 ]); else if(a[6]>a[7])printf("There is a special coin:%f(7) and it's heavier than others.\n",a[6 ]); elseprintf("There is a special coin:%f(8) and it's heavier than others.\n",a[7]); }else if(a[0]+a[2]+a[5]{if(a[0]==a[2])printf("There is a special coin:%f(5) and it's heavier than others.\n",a[4 ]); else if(a[0]>a[2])printf("There is a special coin:%f(3) and it's lighter than others.\n",a[2 ]);printf("There is a special coin:%f(1) and it's lighter than others.\n",a[0 ]);}else{if(a[1]printf("There is a special coin:%f(2) and it's lighter than others.\n",a[1 ]);if(a[5]>a[8])printf("There is a special coin:%f(6) and it's heavier than others.\n",a[5 ]);}}}运⾏结果如图:即输⼊12个数表⽰这12枚硬币的重量,最后输出哪⼀枚为假币,并判断其轻重。
信息论实验报告(实验三、香农编码)
学生实验报告 院别 电子工程学院课程名称 信息论与编码 班级实验名称 实验三、香农编码 姓名实验时间 学号指导教师 成绩报 告 内 容 一、实验目的和任务1、理解信源编码的意义; 2、熟悉 MATLAB 程序设计; 3、掌握香农编码的方法及计算机实现; 4、 对给定信源进行香农编码,并计算编码效率;二、实验原理介绍给定某个信源符号的概率分布,通过以下的步骤进行香农编码1、信源符号按概率从大到小排列;12.......n p p p ≥≥≥2、确定满足下列不等式的整数码长i K 为()()1i i i lb p K lb p -≤<-+3、为了编成唯一可译码,计算第i 个消息的累加概率:4、将累加概率i P 变换成二进制数;5、取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。
三、实验设备介绍1、计算机2、编程软件MATLAB6.5以上四、实验内容和步骤对如下信源进行香农编码,并计算编码效率。
12345670.200.190.180.170.150.100.01X a a a a a a a P ⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦(1)先对信源概率进行从大到小的排序(2)计算第i 个消息的累加概率以及每个消息的码长K (i )11()i i k k P p a -==∑(3)调用子函数将累加概率的十进制表示转换成二进制(4)取第i个累加概率二进制的小数点后的K(i)位,即为该消息符号的二进制码字。
五、实验数据记录六、实验结论与心得通过本次实验,加强了对matlab程序的学习,进一步提高了我的编程能力。
信息论与编码实验报告
实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日目录实验一信源熵值的计算 (1)实验二 Huffman信源编码 (5)实验三 Shannon编码 (9)实验四信道容量的迭代算法 (12)实验五率失真函数 (15)实验六差错控制方法 (20)实验七汉明编码 (22)实验一 信源熵值的计算一、 实验目的1 进一步熟悉信源熵值的计算 2熟悉 Matlab 编程二、实验原理熵(平均自信息)的计算公式∑∑=--==qi i i qi i i p p p p x H 1212log 1log )(MATLAB 实现:))(log *.(2x x sum HX -=;或者))((log *)(2i x i x h h -= 流程:第一步:打开一个名为“nan311”的TXT 文档,读入一篇英文文章存入一个数组temp ,为了程序准确性将所读内容转存到另一个数组S ,计算该数组中每个字母与空格的出现次数(遇到小写字母都将其转化为大写字母进行计数),每出现一次该字符的计数器+1;第二步:计算信源总大小计算出每个字母和空格出现的概率;最后,通过统计数据和信息熵公式计算出所求信源熵值(本程序中单位为奈特nat )。
程序流程图:三、实验内容1、写出计算自信息量的Matlab 程序2、已知:信源符号为英文字母(不区分大小写)和空格。
输入:一篇英文的信源文档。
输出:给出该信源文档的中各个字母与空格的概率分布,以及该信源的熵。
四、实验环境Microsoft Windows 7Matlab 6.5五、编码程序#include"stdio.h"#include <math.h>#include <string.h>#define N 1000int main(void){char s[N];int i,n=0;float num[27]={0};double result=0,p[27]={0};FILE *f;char *temp=new char[485];f=fopen("nan311.txt","r");while (!feof(f)) {fread(temp,1, 486, f);}fclose(f);s[0]=*temp;for(i=0;i<strlen(temp);i++){s[i]=temp[i];}for(i=0;i<strlen(s);i++){if(s[i]==' ')num[26]++;else if(s[i]>='a'&&s[i]<='z')num[s[i]-97]++;else if(s[i]>='A'&&s[i]<='Z')num[s[i]-65]++;}printf("文档中各个字母出现的频率:\n");for(i=0;i<26;i++){p[i]=num[i]/strlen(s);printf("%3c:%f\t",i+65,p[i]);n++;if(n==3){printf("\n");n=0;}}p[26]=num[26]/strlen(s);printf("空格:%f\t",p[26]);printf("\n");for(i=0;i<27;i++){if (p[i]!=0)result=result+p[i]*log(p[i]);}result=-result;printf("信息熵为:%f",result);printf("\n");return 0;}六、求解结果其中nan311.txt中的文档如下:There is no hate without fear. Hate is crystallized fear, fear’s dividend, fear objectivized. We hate what we fear and so where hate is, fear is lurking. Thus we hate what threatens our person, our vanity andour dreams and plans for ourselves. If we can isolate this element in what we hate we may be able to cease from hating.七、实验总结通过这次实验,我们懂得了不必运行程序时重新输入文档就可以对文档进行统计,既节省了时间而且也规避了一些输入错误。
信息论与编码实验报告
信息论与编码实验报告实验⼀绘制⼆进熵函数曲线(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)的计算。
信息论与编码实验二
信息论与编码上机报告
完成时间:200 年月日
实验要求
1. 二进制对称信道容量:
利用BPSK 信号在一个加性白高斯噪声信道上传输二进制数据,并在用最佳匹配滤波器检测的输出端利用硬判决解码。
1) 画出该信道的差错概率作为函数,γ作为自变量的图。
γ=ε/N 0
ε—在每个BPSK 信号中的能量
N 0/2—噪声功率谱密度
用最佳检测的BPSK 的差错率是:()
γ2Q p =
2) 画出作为γ函数的信道容量的图。
()
γ21)(1Q H p H C b b -=-=
2. 信道容量与带宽和SNR 的关系
1) 输入功率受限为P 和带宽为W 的带限AWGN 信道的容量由下式给出
⎪⎪⎭⎫ ⎝⎛+=W N P W C 021log 画出容量作为W 和P /N 0的函数关系。
2) 画出离散时间AWGN 信道容量作为输入功率和噪声方差的函数关系
⎪⎭⎫ ⎝⎛+=221log 21σP C。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论与编码实验报告信息论与编码实验报告学院:计算机与通信工程学院专业:计算机科学与技术班级:计1203班学号:姓名:2014年12月29日实验一唯一可译码判别准则实验目的:1.进一步熟悉唯一可译码判别准则;2.掌握C语言字符串处理程序的设计和调试技术。
实验内容:1.已知:信源符号数和码字集合C;2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入;3.输出:判决(是唯一可译码/不是唯一可译码);循环(若继续判决则输入1循环判决,否则输入0结束运行)。
实验原理:根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。
算法:1、考察C 中所有的码字,若Wi是Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中;2、考察C和Fi俩个集合,若Wi ∈C是Wj ∈F的前缀或Wi ∈F是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;3、F=∪Fi即为码C的尾随后缀集合;4、若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。
实验环境及实验文件存档名:1.实验环境:visual C++ 6.02.文件名:weiyikeyi.cpp实验结果及分析:1.源代码:#include<stdio.h>#include<string.h>char c[100][50];char f[300][50];int N,sum=0; //N为输入码字的个数,sum为尾随后缀集合中码字的个数int flag;//判断是否唯一可译标志位void patterson(char c[],char d[]) //检测尾随后缀{int i,j,k;for(i=0;;i++){if(c[i]=='\0'&&d[i]=='\0')//2字符串一样,跳出break;if(c[i]=='\0') //d比c长,将d的尾随后缀放入f中{for(j=i;d[j]!='\0';j++) f[sum][j-i]=d[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0) //查看当前生成的尾随后缀在f集合中是否存在{sum--;break;}}sum++;break;}if(d[i]=='\0') //c比d长,将c的尾随后缀放入f中{for(j=i;c[j]!='\0';j++) f[sum][j-i]=c[j];f[sum][j-i]='\0';for(k=0;k<sum;k++){if(strcmp(f[sum],f[k])==0) //查看当前生成的尾随后缀在f集合中是否存在{sum--;break;}}sum++;break;}if(c[i]!=d[i])//字符不一样了也退出break;}}void yima(){int i,j;printf(" ********唯一可译码判别********\n");printf("请输入码字的个数:");//输入码得个数scanf("%d",&N);while(N>100){printf("输入码字个数过大,请输入小于100的数\n");printf("请输入码字的个数:");scanf("%d",&N);}flag=0;printf("请分别输入码字:\n");for(i=0;i<N;i++){scanf("%s",&c[i]);}for(i=0;i<N-1;i++)//判断如果码本身是否重复for(j=i+1;j<N;j++){if(strcmp(c[i],c[j])==0){flag=1;break;}}if(flag==1)//如果码本身有重复,就可以断定它不是唯一可译码{printf("这不是唯一可译码。
\n");}else{for(i=0;i<N-1;i++) //此处是根据原始编码生成的尾随后缀集合s[1]放入f中{for(j=i+1;j<N;j++){patterson(c[i],c[j]);}}for(i=0;;i++) //根据原始码与s[i]生成s[i+1]也放入f[i]{int s=0;for(j=0;j<N;j++)//判断s[i+1]中的字符串是否与s[i]中一样,重复的则不再添加{if(i==sum){ s=1;break;}elsepatterson(f[i],c[j]);}if(s==1)break;}for(i=0;i<sum;i++) //判断p里的字符串是否与s 中重复,重复则不是唯一的{for(j=0;j<N;j++){if(strcmp(f[i],c[j])==0){flag=1;break;}}}if(flag==1){printf("这不是唯一可译码!\n");}elseprintf("这是唯一可译码!\n");}}void main(){int flag=1;while(flag){yima();printf("是否继续判别?1/0\n");scanf("%d",&flag);}}2.运行结果(1)输入0,01,001时:(2)继续执行,输入1,01,10,1010(3)结束执行实验二霍夫曼编码实验目的:1.进一步熟悉Huffman编码过程;2.掌握C语言递归程序的设计和调试技术。
实验内容:1.输入:信源符号个数r、信源的概率分布P;2.输出:每个信源符号对应的Huffman编码的码字。
实验原理:1.将q个信源符合按概率大小递减排列;()()()ss qs≥≥ppp122.用“0,1”码符号分别代表概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个,从而得到只包含q-1个符号的新信源,称为缩减信源s;13.把缩减信源s的符号仍按概率大小递减次序排1列,再将其最后两个概率最小的信源符号分别用“0”和“1”码符号表示,并且合并成一个符号,;这样又形成了q-2个信源符号的缩减信源s24.依次继续下去,直至信源符号最后只剩下两个信源符号为止,将这最后两个信源符号分别用二元码符号“0”和“1”表示;5.然后从最后一级缩减信源开始,进行回溯,就得到各信源符号所对应的码符号序列,即对应的码字。
实验环境及实验文件存档名:1.实验环境:visual C++ 6.02.文件名:Huffman.cpp实验结果及分析:1.程序源代码:#include<stdio.h>#define N 50#define maxval 10000.0#define maxsize 100typedef struct{char ch;float weight;int lchild,rchild,parent;}hufmtree;typedef struct{char bits[N]; //位串int start; //编码在位串中的起始位置char ch; //字符}codetype;void huffman(hufmtree tree[]);//建立哈夫曼树void huffmancode(codetype code[],hufmtree tree[]);//根据哈夫曼树求出哈夫曼编码int n;int m;void main(){printf("输入信源符号个数\n");scanf("%d",&n);getchar();m = 2*n-1;printf(" *****霍夫曼哈夫曼编码*****\n");printf("总共有%d个字符\n",n);hufmtree tree[2*N-1];codetype code[N];int i,j;//循环变量huffman(tree);//建立哈夫曼树huffmancode(code,tree);//根据哈夫曼树求出哈夫曼编码printf("输出每个字符的哈夫曼编码\n");for(i=0;i<n;i++){printf("%c: ",code[i].ch);for(j=code[i].start;j<n;j++)printf("%c ",code[i].bits[j]);printf("\n");}}void huffman(hufmtree tree[])//建立哈夫曼树{int i,j,p1,p2;//p1,p2分别记住每次合并时权值最小和次小的两个根结点的下标float small1,small2,f;char c;for(i=0;i<m;i++) //初始化{tree[i].parent=0;tree[i].lchild=-1;tree[i].rchild=-1;tree[i].weight=0.0;}printf("依次读入前%d个结点的字符及权值(中间用空格隔开)\n",n);for(i=0;i<n;i++) //读入前n个结点的字符及权值{printf("输入第%d个字符为和权值",i+1); scanf("%c %f",&c,&f);getchar();tree[i].ch=c;tree[i].weight=f;}for(i=n;i<m;i++) //进行n-1次合并,产生n-1个新结点{p1=0;p2=0;small1=maxval;small2=maxval; //maxval 是float类型的最大值for(j=0;j<i;j++) //选出两个权值最小的根结点if(tree[j].parent==0)if(tree[j].weight<small1){small2=small1; //改变最小权、次小权及对应的位置small1=tree[j].weight;p2=p1;p1=j;}elseif(tree[j].weight<small2){small2=tree[j].weight; //改变次小权及位置p2=j;}tree[p1].parent=i;tree[p2].parent=i;tree[i].lchild=p1; //最小权根结点是新结点的左孩子tree[i].rchild=p2; //次小权根结点是新结点的右孩子tree[i].weight=tree[p1].weight+tree[p2].weight; }}//huffmanvoid huffmancode(codetype code[],hufmtree tree[])//根据哈夫曼树求出哈夫曼编码//codetype code[]为求出的哈夫曼编码//hufmtree tree[]为已知的哈夫曼树{int i,c,p;codetype cd; //缓冲变量for(i=0;i<n;i++){cd.start=n;cd.ch=tree[i].ch;c=i; //从叶结点出发向上回溯p=tree[i].parent; //tree[p]是tree[i]的双亲while(p!=0){cd.start--;if(tree[p].lchild==c)cd.bits[cd.start]='0'; //tree[i]是左子树,生成代码'0'elsecd.bits[cd.start]='1'; //tree[i]是右子树,生成代码'1'c=p;p=tree[p].parent;}code[i]=cd; //第i+1个字符的编码存入code[i]}}2.运行结果。