信息论与编码课程设计.._第1页
信息论与编码课程设计.._第2页
信息论与编码课程设计.._第3页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

4、码字,但不同的排序将会影响码字的长度,一般讲合并 的概率放在上面,这样可获得较小的码方差。四、设计原理4.1 哈夫曼编码步骤(1)将信源消息符号按照其出现的概率大小依次排列为p1 p2 pn(2)取两个概率最小的字母分别配以 0 和 1 两个码元, 并将这两个概 率相加作为一个新的概率,与未分配的二进制符号的字母重新排队。( 3)对重新排列后的两个最小符号重复步骤( 2)的过程。( 4)不断重复上述过程,知道最后两个符号配以0 和 1 为止。( 5)从最后一级开始, 向前返回得到的各个信源符号所对应的码元序 列,即为相应的码字。4.2 哈夫曼编码特点哈夫曼编码是用概率匹配的方法进行信源匹配方法

5、进行信源。它的特 点是:(1 )哈夫曼的编码方法保证了概率大的符号对应于短码, 概率小的符 号对应于长码,充分应用了短码。(2 )缩减信源的最后两个码字总是最后一位不同, 从而保证了哈夫曼 编码是即时码。(3 )哈夫曼编码所形成的码字不是唯一的, 但编码效率是唯一的, 在 对最小的两个速率符号赋值时可以规定大的为“ 1”,小得为“ 0 ”,如果两 个符号的出现概率相等时,排列时无论哪个在前都可以,所以哈夫曼所构 造的码字不是唯一的,对于同一个信息源,无论上述的顺序如何排列,他 的平均码长是不会改变的,所以编码效率是唯一的。(4 )只有当信息源各符号出现的概率很不平均的时候, 哈夫曼编码的 效果

6、才明显。(5 )哈夫曼编码必须精确的统计出原始文件中每个符号出现频率,如果没有这些精确的统计将达不到预期效果。哈夫曼编码通常要经过两遍操 作 ,第一遍进行统计,第二遍产生编码,所以编码速度相对慢。另外实 现电路复杂,各种长度的编码的编译过程也是比较复杂的,因此解压缩的 过程也比较慢。(6 )哈夫曼编码只能用整数来表示单个符号, 而不能用小数, 这很大 程度上限制了压缩效果。哈夫曼所有位都是合在一起的,如果改动其中一 位就可以使其数据变得面目全非。五、设计步骤5.1 以框图形式画出哈夫曼编码过程(哈夫曼编码要求构建哈夫曼树) 。 表 1 哈夫曼编码哈夫曼树:给定n个实数w1 , w2 , wn

7、(n 2),求一个具有 n个结点的二叉数,使其带权路径长度最小。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度为WPL=(W1*L1+W2*L2+W3*L3+.+Wn*Ln),N 个权值 Wi(i=1,2,.n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为 Li(i=1,2,.n)。可以证明哈夫曼树的 WPL是最小的。(1) 根据与n个权值w1,w2 -wn对应的n个结点构成具有n棵二 叉树的森林F=T1,T2n,其中第i棵二叉树Ti(1 i n)都只有一个权值为wi的根结点,其左、

8、右子树均为空。(2) 在森林F中选出两棵根结点的权值最小的树作为一棵新树的左、 右子树,且置新树的根结点的权值为其左、右子树上根结点权值之和。(3) 从F中删除构成新树的那两棵,同时把新树加入F中。(4) 重复第(2)和第(3 )步,直到F中只含有一棵为止,此树便为Huffman 树。图1哈夫曼树5.2计算平均码长、编码效率、冗余度。平均码长为:K=0.4 X1+0.18 X3+0.1 X3+0.1 X4+0.07 X4+0.06 X4+0.05 X5+0.04 X5=2.61 (码元 / 符号)信源熵为:nH(X) p(xi)log p(xi) i 1log0.04)=2.55bit/ 符号

9、信息传输速率为:2 55R= 2.55 =0.977bit/ 码元 2.61编码效率为:2.552.61=0.977冗余度为:=1-=1-0.977=0.023六、哈夫曼编码的实现6.1软件介绍Visual C+ 6.0 ,简称VC或者VC6.0,是微软推出的一款 C+编译 器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C+是一个功能强大的可视化软件幵发工具。自1993年Microsoft公司推出Visual C+1.0 后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件幵发的首选工具。Visual C+6.0由Microsoft幵发,它不 仅是一个

10、C+编译器,而且是一个基于 Windows操作系统的可视化集 成幵发环境(integrateddevelopmentenvironment , IDE )。VisualC+6.0由许多组件组成,包括编辑器、调试器以与程序向导 AppWizard 、 类向导Class Wizard 等幵发工具。这些组件通过一个名为 DeveloperStudio的组件集成为和谐的幵发环境。Microsoft的主力软件产品。Visual C+是一个功能强大的可视化软件幵发工具。Visual C+6.0 以拥有“语法高亮",自动编译功能以与高级除错功 能而著称。比如,它允许用户进行远程调试,单步执行等。还

11、有允许用户 在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其 编译与创建预编译头文件 (stdafx.h) 、最小重建功能与累加连结 (link) 著称。 这些特征明显缩短程序编辑、编译与连结的时间花费,在大型软件计划上 尤其显著。(1) Developer Studio 这是一个集成开发环境,我们日常工作的99% 都是在它上面完成的,再加上它的标题赫然写着“VisMuaicl rosoftC+ ”,所以很多人理所当然的认为,那就是Visual C+ 了。其实不然,虽然 Developer Studio 提供了一个很好的编辑器和很多 Wizard ,但实际 上它没有任何编译和链

12、接程序的功能,真正完成这些工作的幕后英雄后面 会介绍。我们也知道, Developer Studio 并不是专门用于 VC 的,它也同 样用于 VB ,VJ,VID 等 Visual Studio 家族的其他同胞兄弟。所以不要把 Developer Studio 当成 Visual C+ , 它充其量只是 Visual C+ 的一个 壳子而已。这一点请切记!(2)MFC从理论上来讲, MFC 也不是专用于 Visual C+ , Borland C+ , C+Builder 和 Symantec C+ 同样可以处理 MFC 。同时,用 Visual C+ 编写代码也并不意味着一定要用 MFC

13、,只要愿意,用 Visual C+ 来编写 SDK程序,或者使用STL, ATL, 样没有限制。不过,Visual C+本来 就是为 MFC 打造的, Visual C+ 中的许多特征和语言扩展也是为 MFC 而设计的,所以用 Visual C+ 而不用 MFC 就等于抛弃了 Visual C+ 中 很大的一部分功能。但是, Visual C+ 也不等于 MFC 。(3)Platform SDK这才是 Visual C+ 和整个 Visual Studio 的精华和灵魂, 虽然我们很少能直接接触到它。大致说来, Platform SDK 是以 Microsoft C/C+ 编 译器为核心(不是

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

15、;vector>using namespace std;struct Huffman_InformationSourcechar InformationSign10 ;double Probability ;char Code10 ;int CodeLength; ;;struct HuffNodechar InformationSign10 ;double Probability ;HuffNode *LeftSubtree,*middleSubtree,*RightSubtree,*Nextchar Code10 ;int CodeLength ;class CHuffman_2pu

16、blic:CHuffman_2()ISNumber=0 ;AvageCodeLength=0.0 ;InformationRate=0.0 ;CodeEfficiency=0.0 ;Redundancy=0.0 ;CHuffman_2()DestroyBTree(HuffTree) ;void Huffman_Input() ;void Huffman_Sort() ;void Huffman_Tree() ;void Huffman_Coding() ;void Huffman_CodeAnalyzing() ;void Huffman_Display() ;void DestroyBTre

17、e(HuffNode *TreePointer) ; private:vector<Huffman_InformationSource>ISarrayint ISNumber ;double AvageCodeLength ;double InformationRate ;double CodeEfficiency ;HuffNode * HuffTree ;private :void Huffman_Code(HuffNode *TreePointer);;/ 输入信源信息void CHuffman_2:Huffman_Input()ISarray.push_back(temp1

18、);Huffman_InformationSource temp2="x2",0.18,"",0ISarray.push_back(temp2);Huffman_InformationSource temp3="x3",0.10,"",0;ISarray.push_back(temp3);Huffman_InformationSource temp4="x4",0.10,"",0;ISarray.push_back(temp4);Huffman_InformationSour

19、ce temp5="x5",0.07,"",0;ISarray.push_back(temp5);Huffman_InformationSource temp6="x6",0.06,"",0;ISarray.push_back(temp6);Huffman_InformationSource temp7="x7",0.05,"",0;ISarray.push_back(temp7);Huffman_InformationSource temp8="x8",

20、0.04,"",0;ISarray.push_back(temp8);ISNumber=ISarray.size();/ 按概率“从大到小”排序void CHuffman_2:Huffman_Sort()int I,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;void CHuffman_2:Huffman_Tree()i

21、nt I;HuffNode *ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;ptr1=new HuffNode;strcpy(ptr1->InformationSign,ISarray0.InformationSign);ptr1->Probability=ISarray0.Probability;strcpy(ptr1->Code,ISarray0.Code);ptr1->LeftSubtree=NULL;ptr1->middleSubtree =NULL;ptr1->RightSubtree=NULL; ptr1->Ne

22、xt=NULL;HuffTree=ptr1;for(i=1;i<ISNumber;i+)ptr2=new HuffNode;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=ptr

23、1;ptr1=ptr2;HuffTree=ptr1;int k;int s; k=ceil(double)(ISNumber-3)/(3-1); s=3+k*(3-1)-ISNumber;if(s=1)ptr2=ptr1->Next;ptr4=new HuffNode;ptr4->Probability=ptr1->Probability+ptr2->Probability;strcpy(ptr4->Code,"");ptr4->LeftSubtree =NULL;ptr4->middleSubtree=ptr1;ptr4->

24、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)/ 合并概率最小的结点 ptr2=ptr1->Next;

25、ptr3=ptr2->Next; ptr4=new HuffNode; strcpy(ptr4->InformationSign,"*"); ptr4->Probability=ptr1->Probability+ptr2->Probability+ptr3->Probability; strcpy(ptr4->Code,""); ptr4->LeftSubtree=ptr1; ptr4->middleSubtree=ptr2; ptr4->RightSubtree=ptr3; HuffTree

26、=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;temp2=NULL;strcpy(H

27、uffTree->Code,"");HuffTree->CodeLength=0;/ 生成哈夫曼码void CHuffman_2:Huffman_Code(HuffNode *TreePointer)if (TreePointer = NULL)return;char tempstr10=""if(!TreePointer->LeftSubtree&&!TreePointer->middleSubtree&&!TreePointer->RightSubtree)for(int i=0;i<

28、;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");strcpy(TreePoi

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

30、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);TreePointer->Righ

31、tSubtree->CodeLength=TreePointer->CodeLength+1;Huffman_Code(TreePointer->RightSubtree);void CHuffman_2:Huffman_Coding()Huffman_Code(HuffTree);/ 编码结果void CHuffman_2:Huffman_CodeAnalyzing()for(int i=0;i<ISNumber;i+)AvageCodeLength+=ISarrayi.Probability*ISarrayi.CodeLengt h;int L=1;int m=2;

32、 /InformationRate=AvageCodeLength/L*(log(m)/log(2);double Hx=0;for(int j=0;j<ISNumber;j+)Hx+=-ISarrayj.Probability*log(ISarrayj.Probability)/log(2);CodeEfficiency=Hx/InformationRate;Redundancy=1- CodeEfficiency;void CHuffman_2:Huffman_Display()信息论与编码课程设计 .cout<<" 码字: "<<endl

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

34、lt;<CodeEfficiency<<endl<<endl;cout<<" 冗余度: "<< Redundancy <<endl<<endl;void CHuffman_2:DestroyBTree(HuffNode *TreePointer)if (TreePointer!= NULL)DestroyBTree(TreePointer->LeftSubtree);DestroyBTree(TreePointer->middleSubtree);DestroyBTree(TreePo

35、inter->RightSubtree);delete TreePointer;TreePointer = NULL;void mai n()CHuffman_3 YYY;YYY .Huffmann put();YYY.Hu ffman_Sort();YYY .Huffman_Tree();YYY .Huffman_Codi ng();YYY .Huffman_CodeA nalyzi ng();YYY .Huffman_Display();6.3运行结果与分析-"C:DOCUMENTS AND SETTINGSADMINISTRATOR桌面码字xv: i疵001好:011&#

36、39;X4't 0000去雪:0100坯,:01D17' : 00010X8: 00011平均码 2.01編码救率;0.977011冗余度 D.022M9Press any Isey to continue信息论与编码课程设计.图2运行结果运行结果分析:从运行结果上可以看出,该结果与理论计算一致,并且可以看出哈夫曼编码的特点:(1) 哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符 号对应于长码,充分应用了短码。(2) 缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼 编码是即时码。(3)每次缩减信源的最长两个码字有相同的码长。这三个特点保证了所得的哈夫曼码一定

37、是最佳码。因此哈夫曼是一种 应用广泛而有效的数据压缩技术。利用哈夫曼编码进行通信可以大大提高 信道利用率,加快信息传输速度,降低传输成本。数据压缩的过程称为编 码,解压的过程称为译码。进行信息传递时,发送端通过一个编码系统对 待传数据(明文)预先编码,而接受端将传来的数据(密文)进行译码。 要求数据这样一个简单的哈夫曼编码译码器。在进行哈夫曼编码时,为了得到码方差最小的码,应使合并的信源符 号位于缩减信源序列尽可能高的。七、体会与建议在这次课程设计中,通过对程序的编写,调试和运行,使我更好的掌 握了哈夫曼树等数据结构方面的基本知识和各类基本程序问题的解决方 法,熟悉了各种调用的数据类型,在调试

38、和运行过程中,加深我对程序运 行的环境了解和熟悉的程度,同时也提高了我对程序调试分析的能力和对信息论与编码课程设计 .错误纠正的能力。这次信息论与编码的程序设计,对于我来说是一个挑战。我对数据结 构的学习在程序的设计中也有所体现。课程设计是培养学生综合运用所学 知识,发现问题、提出问题、分析问题和解决问题的过程,锻炼学生的逻 辑思维能力和实践能力,是对学生实际工作能力的具体训练和考察过程。 在整个课程程序中,我们充分应用和调用各个程序模块,从而部分实现了 此次程序设计的所应该有的功能。就是我在课程设计是比较成功的方面, 而在这个过程中,让我感觉收获最大的就是我们都能利用这次课程设计学 到很多我们在课本上没有的知识,充分的发挥了我们的主动性,使我们学 会了自主学习,和独立解决问题的能力。很多程序在结构上是独立的,但是本此设计的程序功能不是零散的, 它有一个连接是的程序是一个整体,达到这种统一体十分重要,因为这个 输出连接是贯穿始终的。

温馨提示

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

评论

0/150

提交评论