信息论与编码课程设计哈夫曼编码的分析与实现_第1页
信息论与编码课程设计哈夫曼编码的分析与实现_第2页
信息论与编码课程设计哈夫曼编码的分析与实现_第3页
信息论与编码课程设计哈夫曼编码的分析与实现_第4页
信息论与编码课程设计哈夫曼编码的分析与实现_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、教师评语:吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101学生姓名:学号:指导教师:吕卅王超设计时间:2021.11.182021.11.29成绩评阅教师日期一、设计的作用、目的?信息论与编码?是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的稳固和补充.其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提升实践技能,培养独立分析问题、解决问题及实际应用的水平.通过完成具体编码算法的程序设计和调试工作,提升编程水平,深刻理解信源编码、信道编译码的根本思想和目的,掌握编码的根

2、本原理与编码过程,增强逻辑思维水平,培养和提升自学水平以及综合运用所学理论知识去分析解决实际问题的水平,逐步熟悉开展科学实践的程序和方法二、设计任务及要求通过课程设计各环节的实践,应使学生到达如下要求:1,理解无失真信源编码的理论根底,掌握无失真信源编码的根本方法;2 .掌握哈夫曼编码/费诺编码方法的根本步骤及优缺点;3 .深刻理解信道编码的根本思想与目的,理解线性分组码的根本原理与编码过程;4,能够使用MATLAB或其他语言进行编程,编写的函数要有通用性.三、设计内容一个有8个符号的信源X,各个符号出现的概率为:XX1x2,x3,x4,x5,xx71P(X)_、0.10.

3、070.060.050.04J编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队.并不断重复这一过程,直到最后两个符号配以0和1为止.最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字.哈夫曼编码方式得到的码并非唯一的.在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面,这样可获得较小的码方差.四、设

4、计原理4.1 哈夫曼编码步骤(1)将信源消息符号根据其出现的概率大小依次排列为pl_p2_pn(2)取两个概率最小的字母分别配以0和1两个码元,并将这两个概率相加作为一个新的概率,与未分配的二进制符号的字母重新排队.(3)对重新排列后的两个最小符号重复步骤(2)的过程.(4)不断重复上述过程,知道最后两个符号配以0和1为止.(5)从最后一级开始,向前返回得到的各个信源符号所对应的码元序列,即为相应的码字.4.2 哈夫曼编码特点哈夫曼编码是用概率匹配的方法进行信源匹配方法进行信源.它的特点是:(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码.(2)缩减信

5、源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码.(3)哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的,在对最小的两个速率符号赋值时可以规定大的为“1,小得为“0,如果两个符号的出现概率相等时,排列时无论哪个在前都可以,所以哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的顺序如何排列,他的平均码长是不会改变的,所以编码效率是唯一的.(4)只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显.(5)哈夫曼编码必须精确的统计出原始文件中每个符号出现频率,如果没有这些精确的统计将达不到预期效果.哈夫曼编码通常要经过两遍操作,第一遍进行统计,第二遍产生编码,

6、所以编码速度相对慢.另外实现电路复杂,各种长度的编码的编译过程也是比拟复杂的,因此解压缩的过程也比拟慢.(6)哈夫曼编码只能用整数来表示单个符号,而不能用小数,这很大程度上限制了压缩效果.哈夫曼所有位都是合在一起的,如果改动其中一位就可以使其数据变得面目全非.五、设计步骤5.1 以框图形式画出哈夫曼编码过程(哈夫曼编码要求构建哈夫曼树)表1哈夫曼编码信源编码概率编码过程码字码长X0.601.090.23/.37羌.40.10.1300.18/0.1900.2310.1£.10.1300.1810.09

7、700.091(0.061111X20.180013X30.10113X40.100004X50.0701004X60.0601014X70.05000105X80.04000115哈夫曼树:给定n个实数w1,w2,wn(n>2),求一个具有n个结点的二叉数,使其带权路径长度最小.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(假设根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的带权路径长度为WPL=(W1*L1+W2*L2+W3*L3+.+Wn*Ln),N个权值Wi(i=1,2,.n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=

8、1,2,.n).可以证实哈夫曼树的WPL是最小的.(1)根据与n个权值w1,w2川口对应的n个结点构成具有n棵二叉树的森林F=T1,T2北,其中第i棵二叉树Ti(1<i<n)都只有一个权值为wi的根结点,其左、右子树均为空.(2)在森林F中选出两棵根结点的权值最小的树作为一棵新树的左、右子树,且置新树的根结点的权值为其左、右子树上根结点权值之和.(3)从F中删除构成新树的那两棵,同时把新树参加F中.(4)重复第(2)和第(3)步,直到F中只含有一棵为止,此树便为Huffman图1哈夫曼树5.2 计算平均码长、编码效率、冗余度.平均码长为:_8K=Zp(xi)Ki=0.4X1+0.1

9、8X3+0.1X3+0.1X4+0.07X4+0.06X4+i10.05X5+0.04X5=2.61(码元/符号)信源嫡为:nH(X)p(xi)logp(xi)=-(0.4log0.4+0.1810g0.18+0.1log0.1+i10.1log0.1+0.07+log0.07+0.0610g0.06+0.0510g0.05+0.0410g0.04)=2.55bit/符号信息传输速率为:r=H(Xl=255=0.977bM码元K2.61编码效率为:H(X)2.55=0.977K2.61冗余度为:=1-=1-0.977=0.023六、哈夫曼编码的实现6.1 软件介绍VisualC+6.0,简称V

10、C或者VC6.0,是微软推出的一款C+编译器,将高级语言译为机器语言(低级语言)的程序.VisualC+是一个功能强大的可视化软件开发工具.自1993年Microsoft公司推出VisualC+1.0后,随着其新版本的不断问世,VisualC+已成为专业程序员进行软件开发的首选工具.VisualC+6.0由Microsoft开发,它不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE).VisualC+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWiz

11、ard等开发工具.这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境.Microsoft的主力软件产品.VisualC+是一个功能强大的可视化软件开发工具.VisualC+6.0以拥有语法高亮,自动编译功能以及高级除错功能而著称.比方,它允许用户进行远程调试,单步执行等.还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序.其编译及创立预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称.这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件方案上尤其显著.(1) DeveloperStudio这是一个集成开发环境,我们日常

12、工作的99%都是在它上面完成的,再加上它的标题赫然写着“MicrosoftVisualC+,所以很多人理所当然的认为,那就是VisualC+了.其实不然,虽然DeveloperStudio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍.我们也知道,DeveloperStudio并不是专门用于VC的,它也同样用于VB,VJ,VID等VisualStudio家族的其他同胞兄弟.所以不要把DeveloperStudio当成VisualC+,它充其量只是VisualC+的一个壳子而已.这一点请切记!(2) MFC从理论上来讲,MF

13、C也不是专用于VisualC+,BorlandC+,C+Builder和SymantecC+同样可以处理MFC.同时,用VisualC+编写代码也并不意味着一定要用MFC,只要愿意,用VisualC+来编写SDK程序,或者使用STL,ATL,一样没有限制.不过,VisualC+本来就是为MFC打造的,VisualC+中的许多特征和语言扩展也是为MFC而设计的,所以用VisualC+而不用MFC就等于抛弃了VisualC+中很大的一局部功能.但是,VisualC+也不等于MFC.(3) PlatformSDK这才是VisualC+和整个VisualStudio的精华和灵魂,虽然我们很少能直接接触

14、到它.大致说来,PlatformSDK是以MicrosoftC/C+编译器为核心(不是VisualC+,看清楚了),配合MASM,辅以其他一些工具和文档资料.上面说到DeveloperStudio没有编译程序的功能,那么这项工作是由谁来完成的呢是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成VisualStudio的基石.6.2 编程/*哈夫曼编码*#include<iostream.h>#include<math.h>#include<string.h>#include<stdio.h>#include<std

15、lib.h>#include<vector>usingnamespacestd;structHuffman_InformationSourcecharInformationSign10;doubleProbability;charCode10;intCodeLength;structHuffNodecharInformationSign10;doubleProbabilityHuffNode*LeftSubtree,*middleSubtree,*RightSubtree,*Next;charCode10intCodeLengthclassCHuffman_2public:C

16、Huffman_2()ISNumber=0AvageCodeLength=0.0InformationRate=0.0;CodeEfficiency=0.0Redundancy=0.0CHuffman_2()DestroyBTree(HuffTree);voidHuffman_Input();voidHuffman_Sort();voidHuffman_Tree();voidHuffman_Coding();voidHuffman_CodeAnalyzing();voidHuffman_Display();voidDestroyBTree(HuffNode*TreePointer);priva

17、te:vector<Huffman_InformationSource>ISarray;intISNumber;doubleAvageCodeLengthdoubleInformationRate;doubleCodeEfficiencyHuffNode*HuffTree;private:voidHuffman_Code(HuffNode*TreePointer);;/输入信源信息voidCHuffman_2:Huffman_Input()(Huffman_InformationSourcetemp1="x1",0.40,",0;ISarray.pus

18、h_back(temp1);Huffman_InformationSourcetemp2="x2",0.18,",0;ISarray.push_back(temp2);Huffman_InformationSourcetemp3="x3",0.10,",0;ISarray.push_back(temp3);Huffman_InformationSourcetemp4="x4",0.10,",0;ISarray.push_back(temp4);Huffman_InformationSourcetemp5=

19、"x5",0.07,",0;ISarray.push_back(temp5);Huffman_InformationSourcetemp6="x6",0.06,"",0;ISarray.push_back(temp6);Huffman_InformationSourcetemp7="x7",0.05,"",0;ISarray.push_back(temp7);Huffman_InformationSourcetemp8="x8",0.04,",0;ISar

20、ray.push_back(temp8);ISNumber=ISarray.size();/按概率从大到小排序voidCHuffman_2二Huffman_Sort()Huffman_InformationSourcetemp;intI,j;for(i=0;i<ISNumber-1;i+)for(j=i+1;j<ISNumber;j+)if(ISarrayi.Probability<ISarrayj.Probability)temp=ISarrayi;ISarrayi=ISarrayj;ISarrayj=temp;voidCHuffman_2:Huffman_Tree()in

21、tI;HuffNode*ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;ptr1=newHuffNode;strcpy(ptr1->InformationSign,ISarray0.InformationSign);ptr1->Probability=ISarray0.Probability;strcpy(ptr1->Code,ISarray0.Code);ptr1->LeftSubtree=NULL;ptr1->middleSubtree=NULL;ptr1->RightSubtree=NULL;ptr1->Next=NUL

22、L;HuffTree=ptr1;for(i=1;i<ISNumber;i+)ptr2=newHuffNode;strcpy(ptr2->InformationSign,ISarrayi.InformationSign);ptr2->Probability=ISarrayi.Probability;strcpy(ptr2->Code,ISarrayi.Code);ptr2->LeftSubtree=NULL;ptr2->middleSubtree=NULL;ptr2->RightSubtree=NULL;ptr2->Next=ptr1;ptr1=p

23、tr2;HuffTree=ptr1;intk;ints;k=ceil(double)(ISNumber-3)/(3-1);s=3+k*(3-1)-ISNumber;if(s=1)ptr2=ptr1->Next;ptr4=newHuffNode;strcpy(ptr4->InformationSign,"*");ptr4->Probability=ptr1->Probability+ptr2->Probability;strcpy(ptr4->Code,"");ptr4->LeftSubtree=NULL;ptr4

24、->middleSubtree=ptr1;ptr4->RightSubtree=ptr2;HuffTree=ptr2->Next;temp1=HuffTree;while(temp1&&(ptr4->Probability>temp1->Probability)temp2=temp1;temp1=temp1->Next;ptr4->Next=temp1;if(temp1=HuffTree)HuffTree=ptr4;elsetemp2->Next=ptr4;ptr1=HuffTree;while(ptr1->Next)

25、/合并概率最小的结点ptr2=ptr1->Next;ptr3=ptr2->Next;ptr4=newHuffNode;strcpy(ptr4->InformationSign,"*");ptr4->Probability=ptr1->Probability+ptr2->Probability+ptr3->Probability;strcpy(ptr4->Code,"");ptr4->LeftSubtree=ptr1;ptr4->middleSubtree=ptr2;ptr4->RightS

26、ubtree=ptr3;HuffTree=ptr3->Next;temp1=HuffTree;while(temp1&&(ptr4->Probability>temp1->Probability)(temp2=temp1;temp1=temp1->Next;ptr4->Next=temp1;if(temp1=HuffTree)HuffTree=ptr4;elsetemp2->Next=ptr4;ptr1=HuffTree;/释放:ptr1=NULL;ptr2=NULL;ptr3=NULL;ptr4=NULL;temp1=NULL;tem

27、p2=NULL;strcpy(HuffTree->Code,"");HuffTree->CodeLength=0;/生成哈夫曼码voidCHuffman_2二Huffman_Code(HuffNode*TreePointer)(if(TreePointer=NULL)return;chartempstr10=""if(!TreePointer->LeftSubtree&&!TreePointer->middleSubtree&&!TreePointer->RightSubtree)for(in

28、ti=0;i<ISNumber;i+)if(strcmp(ISarrayi.InformationSign,TreePointer->InformationSign)=0)(strcpy(ISarrayi.Code,TreePointer->Code);ISarrayi.CodeLength=TreePointer->CodeLength;return;return;if(TreePointer->LeftSubtree)(strcpy(tempstr,TreePointer->Code);strcat(tempstr,"2");strc

29、py(TreePointer->LeftSubtree->Code,tempstr);TreePointer->LeftSubtree->CodeLength=TreePointer->CodeLength+1;Huffman_Code(TreePointer->LeftSubtree);if(TreePointer->middleSubtree)(strcpy(tempstr,TreePointer->Code);strcat(tempstr,"1");strcpy(TreePointer->middleSubtree

30、->Code,tempstr);TreePointer->middleSubtree->CodeLength=TreePointer->CodeLength+1;Huffman_Code(TreePointer->middleSubtree);if(TreePointer->RightSubtree)(strcpy(tempstr,TreePointer->Code);strcat(tempstr,"0");strcpy(TreePointer->RightSubtree->Code,tempstr);TreePoint

31、er->RightSubtree->CodeLength=TreePointer->CodeLength+1;Huffman_Code(TreePointer->RightSubtree);voidCHuffman_2:Huffman_Coding()(Huffman_Code(HuffTree);/编码结果voidCHuffman_2:Huffman_CodeAnalyzing()(for(inti=0;i<ISNumber;i+)AvageCodeLength+=ISarrayi.Probability*ISarrayi.CodeLength;intL=1;i

32、ntm=2;/InformationRate=AvageCodeLength/L*(log(m)/10g(2);doubleHx=0;for(intj=0;j<ISNumber;j+)Hx+=-ISarrayj.Probabi1ity*1og(ISarrayj.Probabi1ity)/1og(2);CodeEfficiency=Hx/InformationRate;Redundancy=1-CodeEfficiency;voidCHuffman_2:Huffman_Display()(cout<<"码字:"<<endl;for(inti=0;

33、i<ISNumber;i+)(cout<<"'"<<ISarrayi.InformationSign<<"'"<<":"<<ISarrayi.Code<<endl;cout<<endl;cout<<“平均码长:"<<AvageCodeLength<<endl<<endl;cout<<"编码效率:"<<CodeEfficiency&

34、lt;<endl<<endl;cout<<"冗余度:"<<Redundancy<<endl<<endl;voidCHuffman_2二DestroyBTree(HuffNode*TreePointer)(if(TreePointer!=NULL)(DestroyBTree(TreePointer->LeftSubtree);DestroyBTree(TreePointer->middleSubtree);DestroyBTree(TreePointer->RightSubtree);dele

35、teTreePointer;TreePointer=NULL;voidmain()(CHuffman_3YYY;YYY.Huffman_Input();YYY.Huffman_Sort();YYY.Huffman_Tree();YYY.Huffman_Coding();YYY.Huffman_CodeAnalyzing();YYY.Huffman_Display();6.3 运行结果及分析e'DOCUMENTSANDSETTINGSADMIN1STRATOR桌面.码字;:i'X2'r001*X3iOilX4*:OOOOX5T:0100X6,:0101:OOQIO0001

36、1平均码长,2.61编码效率:0,977011冗余度,0.0229S9Pressanykeytocontinue.图2运行结果运行结果分析:从运行结果上可以看出,该结果与理论计算一致,并且可以看出哈夫曼编码的特点:(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码.(2)缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码.(3)每次缩减信源的最长两个码字有相同的码长.这三个特点保证了所得的哈夫曼码一定是最正确码.因此哈夫曼是一种应用广泛而有效的数据压缩技术.利用哈夫曼编码进行通信可以大大提升信道利用率,加快信息传输速度,降低传输本钱.数

37、据压缩的过程称为编码,解压的过程称为译码.进行信息传递时,发送端通过一个编码系统对待传数据明文预先编码,而接受端将传来的数据密文进行译码.要求数据这样一个简单的哈夫曼编码译码器.在进行哈夫曼编码时,为了得到码方差最小的码,应使合并的信源符号位于缩减信源序列尽可能高的.七、体会及建议在这次课程设计中,通过对程序的编写,调试和运行,使我更好的掌握了哈夫曼树等数据结构方面的根本知识和各类根本程序问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中,加深我对程序运行的环境了解和熟悉的程度,同时也提升了我对程序调试分析的水平和对错误纠正的水平.这次信息论与编码的程序设计,对于我来说是一个挑战.我对数据结构的学习在程序的设计中也有所表达.课程设计是培养学生综合运用所学知识,发现问题、提出问题、分析问题和解决问题的过程,锻炼学生的逻辑思维水平和实践能力,是对学生实际工作水平的具体练习和考察过程.在整个课程程序中,我们充分应用和调用各个程序模块,从而局部实现了此次程序设计的所应该有的功能.就是我在课程设计是比拟成功的方面,而在这个过程中,让我感觉收获最大的就是我们都能利用这次课程设计学到很多我们在课本上没有的知识,充分的发挥了我们的主动性,使我们学会了自主学习,和独立解决问题的水平.很多程序在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论