信息论与编码课程设计(哈夫曼编码的分析与实现)

信息论与编码课程设计(哈夫曼编码的分析与实现)
信息论与编码课程设计(哈夫曼编码的分析与实现)

吉林建筑大学

电气与电子信息工程学院信息理论与编码课程设计报告

设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101

学生姓名:

学号:

指导教师:吕卅王超

设计时间:2013.11.18-2013.11.29

一、设计的作用、目的

《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。

通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法

二、设计任务及要求

通过课程设计各环节的实践,应使学生达到如下要求:

1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;

2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点;

3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;

4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。

三、设计内容

一个有8个符号的信源X ,各个符号出现的概率为:

编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。并不断重复这一过程,直到最后两个符号配以0和1为止。最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。

哈夫曼编码方式得到的码并非唯一的。在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面,

12345678,,,,,

()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ????=????????

这样可获得较小的码方差。

四、设计原理

4.1哈夫曼编码步骤

(1)将信源消息符号按照其出现的概率大小依次排列为

2

1

pn

p

p≥

(2)取两个概率最小的字母分别配以0和1两个码元,并将这两个概率相加作为一个新的概率,与未分配的二进制符号的字母重新排队。

(3)对重新排列后的两个最小符号重复步骤(2)的过程。

(4)不断重复上述过程,知道最后两个符号配以0和1为止。

(5)从最后一级开始,向前返回得到的各个信源符号所对应的码元序列,即为相应的码字。

4.2哈夫曼编码特点

哈夫曼编码是用概率匹配的方法进行信源匹配方法进行信源。它的特点是:(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。

(2)缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码。

(3)哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的,在对最小的两个速率符号赋值时可以规定大的为“1”,小得为“0”,如果两个符号的出现概率相等时,排列时无论哪个在前都可以,所以哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的顺序如何排列,他的平均码长是不会改变的,所以编码效率是唯一的。

(4)只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显。

(5)哈夫曼编码必须精确的统计出原始文件中每个符号出现频率,如果没有这些精确的统计将达不到预期效果。哈夫曼编码通常要经过两遍操作,第一遍进行统计,第二遍产生编码,所以编码速度相对慢。另外实现电路复杂,各种长度的编码的编译过程也是比较复杂的,因此解压缩的过程也比较慢。

(6)哈夫曼编码只能用整数来表示单个符号,而不能用小数,这很大程度上限制了压缩效果。哈夫曼所有位都是合在一起的,如果改动其中一位就可以使其数据变得面目全非。

五、设计步骤

5.1以框图形式画出哈夫曼编码过程(哈夫曼编码要求构建哈夫曼树)。

表1 哈夫曼编码

哈夫曼树:

给定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=1,2,...n)。可以证明哈夫曼树的WPL是最小的。

(1)根据与n个权值{w1,w2…wn}对应的n个结点构成具有n棵二叉树的森林F={T1,T2…Tn},其中第i棵二叉树Ti(1 ≤i ≤n)都只有一个权值为wi的根结点,其左、右子树均为空。

(2) 在森林F 中选出两棵根结点的权值最小的树作为一棵新树的左、右子树,且置新树的根结点的权值为其左、右子树上根结点权值之和。

(3)从F 中删除构成新树的那两棵,同时把新树加入F 中。

(4)重复第(2)和第(3)步,直到F 中只含有一棵为止,此树便为Huffman 树。

图1哈夫曼树

5.2计算平均码长、编码效率、冗余度。

平均码长为:

K =∑=8

1i )(Ki xi p =0.4×1+0.18×3+0.1×3+0.1×4+0.07×4+0.06×4+

0.05×5+0.04×5=2.61(码元/符号)

信源熵为:

∑===n

i xi p xi p X H 1)(log )()(-(0.4log0.4+0.18log0.18+0.1log0.1+

0.1log0.1+0.07+log0.07+0.06log0.06+0.05log0.05+0.04log0.04) =2.55bit/符号

信息传输速率为:

R=

K

X H )(=61.255

.2=0.977bit/码元 编码效率为: η=

K

X H )(=61.255.2=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 开发, 它不仅是一个C++ 编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(integrated development environment ,IDE )。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard 、类向导Class Wizard 等开发工具。 这些组件通过一个名为Developer Studio 的组件集成为和谐的开发环境。Microsoft 的主力软件产品。Visual C++是一个功能强大的可视化软件开发工具。

Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。

(1)Developer Studio 这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C++”,所以很多人理所当然的认为,那就是Visual C++了。其实不然,虽然Developer Studio 提供了一个很好的编辑器和很多Wizard ,但实际上它没有任何编译和链接程序的功能,

真正完成这些工作的幕后英雄后面会介绍。我们也知道,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,只要愿意,用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++编译器为核心(不是Visual C++,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到Developer Studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。

6.2 编程

//**哈夫曼编码**

#include

#include

#include

#include

#include

#include

using namespace std;

struct Huffman_InformationSource

{

char InformationSign[10];

double Probability;

char Code[10];

int CodeLength;;

};

struct HuffNode

{

char InformationSign[10];

double Probability;

HuffNode *LeftSubtree,*middleSubtree,*RightSubtree,*Next;

char Code[10];

int CodeLength;

};

class CHuffman_2

{

public:

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 DestroyBTree(HuffNode *TreePointer);private:

vectorISarray;

int ISNumber;

double AvageCodeLength;

double InformationRate;

double CodeEfficiency;

HuffNode * HuffTree;

private:

void Huffman_Code(HuffNode *TreePointer);

};

//输入信源信息

void CHuffman_2::Huffman_Input()

{

Huffman_InformationSource temp1={"x1",0.40,"",0};

ISarray.push_back(temp1);

Huffman_InformationSource temp2={"x2",0.18,"",0};

ISarray.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_InformationSource 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",0.04,"",0};

ISarray.push_back(temp8);

ISNumber=ISarray.size();

}

//按概率“从大到小”排序

void CHuffman_2::Huffman_Sort()

{

Huffman_InformationSource temp;

int I,j;

for(i=0;i

for(j=i+1;j

if(ISarray[i].Probability

{

temp=ISarray[i];

ISarray[i]=ISarray[j];

ISarray[j]=temp;

}

}

void CHuffman_2::Huffman_Tree()

{

int I;

HuffNode *ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;

ptr1=new HuffNode;

strcpy(ptr1->InformationSign,ISarray[0].InformationSign);

ptr1->Probability=ISarray[0].Probability;

strcpy(ptr1->Code,ISarray[0].Code);

ptr1->LeftSubtree=NULL;

ptr1->middleSubtree =NULL;

ptr1->RightSubtree=NULL;

ptr1->Next=NULL;

HuffTree=ptr1;

for(i=1;i

{

ptr2=new HuffNode;

strcpy(ptr2->InformationSign,ISarray[i].InformationSign);

ptr2->Probability=ISarray[i].Probability;

strcpy(ptr2->Code,ISarray[i].Code);

ptr2->LeftSubtree=NULL;

ptr2->middleSubtree =NULL;

ptr2->RightSubtree=NULL;

ptr2->Next=ptr1;

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;

strcpy(ptr4->InformationSign,"*");

ptr4->Probability=ptr1->Probability+ptr2->Probability;

strcpy(ptr4->Code,"");

ptr4->LeftSubtree =NULL;

ptr4->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;

else

temp2->Next=ptr4;

ptr1=HuffTree;

}

while(ptr1->Next)

{

//合并概率最小的结点

ptr2=ptr1->Next;

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=ptr3->Next;

temp1=HuffTree;

while(temp1&&(ptr4->Probability>temp1->Probability))

{

temp2=temp1;

temp1=temp1->Next;

}

ptr4->Next=temp1;

if(temp1==HuffTree)

HuffTree=ptr4;

else

temp2->Next=ptr4;

ptr1=HuffTree;

}

//释放:

ptr1=NULL;

ptr2=NULL;

ptr3=NULL;

ptr4=NULL;

temp1=NULL;

temp2=NULL;

strcpy(HuffTree->Code,"");

HuffTree->CodeLength=0;

}

//生成哈夫曼码

void CHuffman_2::Huffman_Code(HuffNode *TreePointer)

{

if (TreePointer == NULL)

return;

char tempstr[10]="";

if(!TreePointer->LeftSubtree&&!TreePointer->middleSubtree

&&!TreePointer->RightSubtree)

{

for(int i=0;i

if(strcmp(ISarray[i].InformationSign,TreePointer->InformationSign)==0) {

strcpy(ISarray[i].Code,TreePointer->Code);

ISarray[i].CodeLength=TreePointer->CodeLength;

return;

}

return;

}

if(TreePointer->LeftSubtree)

{

strcpy(tempstr,TreePointer->Code);

strcat(tempstr,"2");

strcpy(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->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);

TreePointer->RightSubtree->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

AvageCodeLength+=ISarray[i].Probability*ISarray[i].CodeLength;

int L=1;

int m=2; /

InformationRate=AvageCodeLength/L*(log(m)/log(2));

double Hx=0;

for(int j=0;j

Hx+=-ISarray[j].Probability*log(ISarray[j].Probability)/log(2);

CodeEfficiency=Hx/InformationRate;

Redundancy=1- CodeEfficiency;

}

void CHuffman_2::Huffman_Display()

{

cout<<"码字:"<

for(int i=0;i

{

cout<<"\'"<

}

cout<

cout<<"平均码长:"<

cout<<"编码效率:"<

cout<<"冗余度:"<< Redundancy <

}

void CHuffman_2::DestroyBTree(HuffNode *TreePointer) {

if (TreePointer!= NULL)

{

DestroyBTree(TreePointer->LeftSubtree);

DestroyBTree(TreePointer->middleSubtree);

DestroyBTree(TreePointer->RightSubtree);

delete TreePointer;

TreePointer = NULL;

}

}

void main()

{

CHuffman_3 YYY;

YYY.Huffman_Input();

YYY.Huffman_Sort();

YYY.Huffman_Tree();

YYY.Huffman_Coding();

YYY.Huffman_CodeAnalyzing();

YYY.Huffman_Display();

}

6.3 运行结果及分析

图2 运行结果

运行结果分析:

从运行结果上可以看出,该结果与理论计算一致,并且可以看出哈夫曼编码的特点:

(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。

(2)缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码。

(3)每次缩减信源的最长两个码字有相同的码长。

这三个特点保证了所得的哈夫曼码一定是最佳码。因此哈夫曼是一种应用广泛而有效的数据压缩技术。利用哈夫曼编码进行通信可以大大提高信道利用率,

加快信息传输速度,降低传输成本。数据压缩的过程称为编码,解压的过程称为译码。进行信息传递时,发送端通过一个编码系统对待传数据(明文)预先编码,而接受端将传来的数据(密文)进行译码。要求数据这样一个简单的哈夫曼编码译码器。

在进行哈夫曼编码时,为了得到码方差最小的码,应使合并的信源符号位于缩减信源序列尽可能高的。

七、体会及建议

在这次课程设计中,通过对程序的编写,调试和运行,使我更好的掌握了哈夫曼树等数据结构方面的基本知识和各类基本程序问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中,加深我对程序运行的环境了解和熟悉的程度,同时也提高了我对程序调试分析的能力和对错误纠正的能力。

这次信息论与编码的程序设计,对于我来说是一个挑战。我对数据结构的学习在程序的设计中也有所体现。课程设计是培养学生综合运用所学知识,发现问题、提出问题、分析问题和解决问题的过程,锻炼学生的逻辑思维能力和实践能力,是对学生实际工作能力的具体训练和考察过程。在整个课程程序中,我们充分应用和调用各个程序模块,从而部分实现了此次程序设计的所应该有的功能。就是我在课程设计是比较成功的方面,而在这个过程中,让我感觉收获最大的就是我们都能利用这次课程设计学到很多我们在课本上没有的知识,充分的发挥了我们的主动性,使我们学会了自主学习,和独立解决问题的能力。

很多程序在结构上是独立的,但是本此设计的程序功能不是零散的,它有一个连接是的程序是一个整体,达到这种统一体十分重要,因为这个输出连接是贯穿始终的。

通过翻阅相关书籍,在网上查询资料学习有关哈夫曼编码的实现过程,我实在是获益匪浅,更加深刻的感觉到哈夫曼编码能够大大提高通信的效率,对于我们通信工程专业来说,学好这门科学是非常重要的,在以后的图像处理和压缩方面这门学科能给我们很大的帮助。同时,学习这门科学也是艰辛的,因为它比较难懂,这不仅需要我们发挥我们的聪明才智,还需要我们在不断的实践中领悟。这次的课程设计,让我体会到了作为一个编程人员的艰辛,一个算法到具体实现,再到应用层面的开发是需要有一个较长的路要走的,不是一朝一夕就可

以实现的,而且在编好程序后,编程人员还要花很多时间去完善,过程是心酸的,外人很难能够真正明白。今后我要更加努力的学习专业知识,提高自我的能力!

这次的程序软件基本上运行成功,可以运用简单的数字告诉程序的操作者下一步该如何进行,使得程序规模相对较小,即功能还不很全面,应用也不很普遍。原来数据结构可以涉及很多知识,而不是枯燥无聊的简单的代码部分而已,利用数据结构方面的知识,我们可以设计出更完善的软件。

总而言之,这次数据结构课程设计让我们感触很深,使我们每个人都了解到学习不应该只局限于课本,因为课本上告诉我们的只是很有限的一部分,只是理论上的死知识,所涉及的范围也是狭窄的。我们若想在有限的范围内学习到无限的知识,就要我们自己懂得争取,懂得自学,懂得充分利用身边的任何资源。

在我们的程序中有一部分查找许多该方面的资料,我竭力将所获得的信息变成自己的资源。我动手上机操作的同时,在了解和看懂的基础上对新学的知识进行改进和创新,但是在我们的程序软件中还有很多的不足,需要加以更新。通过这次课程设计,我们都意识到了自己动手实践的弱势,特别是在编程方面,于是我们知道了计算机的实践操作是很重要的,只有通过上机编程才能充分的了解自己的不足。

通过这次的课程设计,我们深刻意识到自己在学习中的弱点,同时也找到了克服这些弱点的方法,这是在此活动中得到的一笔很大的财富。在以后的时间中,我们应该利用更多的时间去上机实验,多编写程序,相信不久后我们的编程能力都会有很大的提高,能设计出更多的更有创新的软件。同时也感谢老师给我们这次机会,发现自身存在的缺点与不足,从而在以后的大学生活中更好的提升和完善自我。

八、参考文献

[1] 曹雪虹,张宗橙.信息论与编码(第二版).北京:清华大学出版社.2009

[2] 吕锋,王虹,刘皓春,苏扬.信息论与编码.北京:人民邮电出版社.2004

[3] 樊昌信,曹丽娜.通信原理(第六版).北京:国防工业出版社.2006

[4] 王慧琴.数字图像处理.北京:北京邮电大学出版社.2007

[5] 孙丽华. 信息论与纠错编码.电子工业出版社.2005

[6]刘宏.C++程序设计教程.武汉:武汉大学出版社,2005

[7]杨永国,张冬明.Visual C++6.0实用教程.北京:清华大学出版社,2007

[8]严蔚敏,吴伟民.数据结构.北京:清华大学出版社,1997

答案~信息论与编码练习

1、有一个二元对称信道,其信道矩阵如下图所示。设该信道以1500个二元符号/秒的速度传输输入符号。现有一消息序列共有14000个二元符号,并设在这消息中P(0)=P(1)=1/2。问从信息传输的角度来考虑,10秒钟内能否将这消息序列无失真地传送完? 解答:消息是一个二元序列,且为等概率分布,即P(0)=P(1)=1/2,故信源的熵为H(X)=1(bit/symbol)。则该消息序列含有的信息量=14000(bit/symbol)。 下面计算该二元对称信道能传输的最大的信息传输速率: 信道传递矩阵为: 信道容量(最大信息传输率)为: C=1-H(P)=1-H(0.98)≈0.8586bit/symbol 得最大信息传输速率为: Rt ≈1500符号/秒× 0.8586比特/符号 ≈1287.9比特/秒 ≈1.288×103比特/秒 此信道10秒钟内能无失真传输得最大信息量=10× Rt ≈ 1.288×104比特 可见,此信道10秒内能无失真传输得最大信息量小于这消息序列所含有的信息量,故从信息传输的角度来考虑,不可能在10秒钟内将这消息无失真的传送完。 2、若已知信道输入分布为等概率分布,且有如下两个信道,其转移概率矩阵分别为: 试求这两个信道的信道容量,并问这两个信道是否有噪声? 3 、已知随即变量X 和Y 的联合分布如下所示: 01100.980.020.020.98P ?? =?? ??11112222 1111222212111122221111222200000000000000000000000000000000P P ???????? ????==???? ????????11 2222111 22222log 4(00)1/()log 42/log 8(000000)2/(),H bit symbol H X bit symbol C C H bit symbol H X C =-===>=-==1解答:(1)由信道1的信道矩阵可知为对称信道故C 有熵损失,有噪声。(2)为对称信道,输入为等概率分布时达到信道容量无噪声

信息论与编码课程设计报告

目录 一:实验原理----------------------------1 二:程序源代码--------------------------1 三:实验分析-----------------------------6 四:实验结论---------------------------7

赫夫曼编码 一:实验原理 哈夫曼编码的具体步骤归纳如下: ① 概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。 ② 将n个信源信息符号的n个概率,按概率大小排序。 ③ 将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。 ④ 将n-1个概率,按大小重新排序。 ⑤ 重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。 ⑥ 如此反复重复n-2次,得到只剩两个概率序列。 ⑦ 以二进制码元赋值,构成哈夫曼码字。编码结束。 哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大 概信息符号分配码字长度短,小概率信息符号分配码字长度长。 C、哈夫曼编码的特点 (1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;

(2)哈夫曼编码的字长参差不齐,硬件实现不方便; (3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。 二:程序源代码: #define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE 59 #define MAXBIT 10 #define LENTH 30 #include "" #include typedef struct{ float gailv; int flag; int parent; int lchild; int rchild; char ch; int t; }HNodeType; typedef struct{ int bit[MAXBIT]; int start; }HCodeType; typedef struct{ float gailv; char letter; }mytype; /*it's the type of data save in file*/ typedef struct filehuff{ int count; mytype mydata[MAXLEAF]; filehuff(){count=0; }; }; filehuff filedata; char code[MAXVALUE]; HNodeType HuffNode[MAXNODE]; void savetofile() { FILE *fp;

哈夫曼(huffman)编译码器课程设计

兰州商学院陇桥学院 工学系课程设计报告 设计题目:哈夫曼(huffman)编译码器系别: 专业 (方向): 年级、班: 学生姓名: 学生学号: 指导教师: 年月日

目录 哈夫曼(huffman )编译码器 (3) 一、编译码器开发的背景 (3) 二、系统的分析与设计 (3) (一)系统功能要求 (3) (二)系统模块结构设计 (4) 三、系统的设计与实现 (6) (一)main() (6) (二)运算 (7) 1. 权值运算quanzhi() (7) 2. 印二叉树函数huffmantree( ) (7) 3.编译码运算huffmancode() (9) 4. 输出运算 shuchu() (9) 四、系统测试 (10) (一)测试主函数 (10) (二)测试印二叉树函数 (10) (三)测试译码运算函数 (11) 五、总结 (12) 六、附件(代码、部分图表) (13)

哈夫曼(huffman )编译码器 一、编译码器开发的背景 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。 二、系统的分析与设计 (一)系统功能要求 一个完整的系统应具有以下功能: 1)I:初始化(Initialization)。从终端读入字符集大小n,以 及n个字符和n个权值,建立哈夫曼树,并将它存于文件 hfmTree中。 2)E:编码(Encoding)。利用以建好的哈夫曼树(如不在内存, 则从文件hfmTree中读入),对文件ToBeTran中的正文进行编 码,然后将结果存入文件CodeFile中。 3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile 中的代码进行译码,结果存入文件TextFile中。 4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在

数据结构课程设计(哈夫曼编码)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 目录 目录 (1) 1 课程设计的目的和意义 (2) 2 需求分析 (3) 3 系统设计 (4) (1)设计思路及方案 (4) (2)模块的设计及介绍 (4) (3)主要模块程序流程图 (6) 4 系统实现 (10) (1)主调函数 (10) (2)建立HuffmanTree (10) (3)生成Huffman编码并写入文件 (13) (4)电文译码 (14) 5 系统调试 (16) 小结 (18) 参考文献 (19) 附录源程序 (20)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 1 课程设计的目的和意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 作为软件工程专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。 在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。 在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。 数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。

信息论与编码试题集与答案(新)

1. 在无失真的信源中,信源输出由 H (X ) 来度量;在有失真的信源中,信源输出由 R (D ) 来度量。 2. 要使通信系统做到传输信息有效、可靠和保密,必须首先 信源 编码, 然后_____加密____编码,再______信道_____编码,最后送入信道。 3. 带限AWGN 波形信道在平均功率受限条件下信道容量的基本公式,也就是有名的香农公式是log(1)C W SNR =+;当归一化信道容量C/W 趋近于零时,也即信道完全丧失了通信能力,此时E b /N 0为 -1.6 dB ,我们将它称作香农限,是一切编码方式所能达到的理论极限。 4. 保密系统的密钥量越小,密钥熵H (K )就越 小 ,其密文中含有的关于明文的信息量I (M ;C )就越 大 。 5. 已知n =7的循环码4 2 ()1g x x x x =+++,则信息位长度k 为 3 ,校验多项式 h(x)= 3 1x x ++ 。 6. 设输入符号表为X ={0,1},输出符号表为Y ={0,1}。输入信号的概率分布为p =(1/2,1/2),失真函数为d (0,0) = d (1,1) = 0,d (0,1) =2,d (1,0) = 1,则D min = 0 ,R (D min )= 1bit/symbol ,相应的编码器转移概率矩阵[p(y/x )]=1001?? ???? ;D max = 0.5 ,R (D max )= 0 ,相应的编码器转移概率矩阵[p(y/x )]=1010?? ? ??? 。 7. 已知用户A 的RSA 公开密钥(e,n )=(3,55),5,11p q ==,则()φn = 40 ,他的秘密密钥(d,n )=(27,55) 。若用户B 向用户A 发送m =2的加密消息,则该加密后的消息为 8 。 二、判断题 1. 可以用克劳夫特不等式作为唯一可译码存在的判据。 (√ ) 2. 线性码一定包含全零码。 (√ ) 3. 算术编码是一种无失真的分组信源编码,其基本思想是将一定精度数值作为序列的 编码,是以另外一种形式实现的最佳统计匹配编码。 (×) 4. 某一信源,不管它是否输出符号,只要这些符号具有某些概率特性,就有信息量。 (×) 5. 离散平稳有记忆信源符号序列的平均符号熵随着序列长度L 的增大而增大。 (×) 6. 限平均功率最大熵定理指出对于相关矩阵一定的随机矢量X ,当它是正态分布时具 有最大熵。 (√ ) 7. 循环码的码集中的任何一个码字的循环移位仍是码字。 (√ ) 8. 信道容量是信道中能够传输的最小信息量。 (×) 9. 香农信源编码方法在进行编码时不需要预先计算每个码字的长度。 (×) 10. 在已知收码R 的条件下找出可能性最大的发码i C 作为译码估计值,这种译码方 法叫做最佳译码。 (√ )

信息论与编码课程设计..

吉林建筑大学 电气与电子信息工程学院信息理论与编码课程设计报告 设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101 学生姓名: 学号: 指导教师:吕卅王超 设计时间:2013.11.18-2013.11.29

一、设计的作用、目的 《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法 二、设计任务及要求 通过课程设计各环节的实践,应使学生达到如下要求: 1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点; 3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程; 4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。 三、设计内容 一个有8个符号的信源X ,各个符号出现的概率为: 编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。并不断重复这一过程,直到最后两个符号配以0和1为止。最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。 哈夫曼编码方式得到的码并非唯一的。在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面, 12345678,,,,, ()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ????=????????

数据结构哈夫曼编码译码器课程设计报告(有源程序)

JAVA语言实验报告 学院计算机工程学院班级计算1013 姓名 xxxx 学号 201081xxxx 成绩指导老师 xxxx 2012年09月03日

目录 目录 (1) 1 课程设计的目的和意义 (2) 2 需求分析 (3) 3 系统(项目)设计 (5) ①设计思路及方案 (5) ②模块的设计及介绍 (5) ③主要模块程序流程图 (8) 4 系统实现 (11) ①主调函数 (12) ②建立HuffmanTree (12) ③生成Huffman编码并写入文件 (15) ④电文译码 (16) 5 系统调试 (17) 参考文献 (21) 附录源程序 (22)

1 课程设计的目的和意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 作为信息管理专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。 在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。 在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。 数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。

信息论与编码课程设计报告书

信息论与编码课程设计报告设计题目:判断唯一可译码、香农编码 专业班级电信12-03 学号7 学生琳 指导教师成凌飞 教师评分 2015年3月21日

目录 一、设计任务与要求 (2) 二、设计思路 (2) 三、设计流程图 (3) 四、程序运行及结果 (4) 五、心得体会 (6) 参考文献 (7) 附录:源程序 (8)

一、设计任务与要求 通过本次课程设计的练习,使学生进一步巩固信源熵、信源编码的基本原理,掌握具体的编码方法,熟悉编程软件的使用,培养学生自主设计、编程调试的开发能力,同时提高学生的实践创新能力。 1、判断唯一可译码 利用尾随后缀法判断任意输入的码是否为唯一可译码,即设计一个程序实现判断输入码组是否为唯一可译码这一功能。 2、香农编码 熟悉运用香农编码,并能通过C语言进行编程,对任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。 二、设计思路 1、判断唯一可译码 在我们学习使用了克劳夫特不等式之后,知道唯一可译码必须满足克劳夫特不等式。但是克劳夫特不等式仅仅是存在性的判定定理,即该定理不能作为判断一种码是否为唯一可译码的依据。也就是说当码字长度和码符号数满足克劳夫特不等式时,则必可以构造出唯一可译码,否则不能构造出唯一可译码。因此我们必须找到一种能够判断一种码是否为唯一可译码的方法,尾随后缀法。 尾随后缀法算法描述: 设C为码字集合,按以下步骤构造此码的尾随后缀集合F: (1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中; (2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi 是Wj

哈夫曼编译码器课程设计报告完整版

XXX学院本科 数据结构课程设计总结报告 设计题目:实验一、哈夫曼编/译码器 学生姓名:XXX 系别:XXX 专业:XXX 班级:XXX 学号:XXX 指导教师:XXX XXX 2012年6 月21日 xxx学院 课程设计任务书 题目一、赫夫曼编译码器 专业、班级xxx 学号xxx 姓名xxx 主要内容、基本要求、主要参考资料等: 1. 主要内容 利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼的编/译码系统。 2. 基本要求 系统应具有以下功能: (1)C:编码(Coding)。对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中

(2)D:解码(Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。 (3)P:打印代码文件(Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。 (4)T:打印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。 3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编着; 数据结构标准教程胡超、闫宝玉编着 完成期限:2012年6月21 日 指导教师签名: 课程负责人签名: 2012年 6月 21 日 一、设计题目(任选其一) 实验一、哈夫曼编/译码器 二、实验目的 1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力; 2 深化对算法课程中基本概念、理论和方法的理解; 3 巩固构造赫夫曼树的算法; 4 设计试验用程序实验赫夫曼树的构造。 三、运行环境(软、硬件环境) Windows xp sp3,Visual C++ 英文版 四、算法设计的思想 (1)初始化赫夫曼树,输入文件中各字符及其权值,并保存于文件中 (2)编码(Coding)。对文件tobetrans中的正文进行编码,然后将结果存入文件codefile 中 (3)D:解码(Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。 (4)P:打印代码文件(Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。

数据结构课程设计哈夫曼编码(DOC)

《数据结构与算法》课程设计(2009/2010学年第二学期第20周) 指导教师:王老师 班级:计算机科学与技术(3)班 学号: 姓名:

《数据结构与算法》课程设计 目录 一、前言 1.摘要 2.《数据结构与算法》课程设计任务书 二、实验目的 三、题目--赫夫曼编码/译码器 1.问题描述 2.基本要求 3.测试要求 4.实现提示 四、需求分析--具体要求 五、概要设计 六、程序说明 七、详细设计 八、实验心得与体会

前言 1.摘要 随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。 算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。 数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。 《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。 学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。 2.《数据结构与算法》课程设计任务书 《数据结构与算法》是计算机专业重要的核心课程之一,在计算机专业的学习过程中占有非常重要的地位。《数据结构与算法课程设计》就是要运用本课程以及到目前为止的有关课程中的知识和技术来解决实际问题。特别是面临非数值计算类型的应用问题时,需要选择适当的数据结构,设计出满足一定时间和空间限制的有效算法。 本课程设计要求同学独立完成一个较为完整的应用需求分析。并在设计和编写具有一定规模程序的过程中,深化对《数据结构与算法》课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使自己的程序设计与调试水平有一个明显的提高。

信息论与编码期中试卷及答案

信息论与编码期中试题答案 一、(10’)填空题 (1)1948年,美国数学家香农发表了题为“通信的数学理论”的长篇论文,从而创立了信息论。 (2)必然事件的自信息是0 。 (3)离散平稳无记忆信源X的N次扩展信源的熵等于离散信源X的熵的N倍。 (4)对于离散无记忆信源,当信源熵有最大值时,满足条件为__信源符号等概分布_。 (5)若一离散无记忆信源的信源熵H(X)等于2.5,对信源进行等长的无失真二进制编码,则编码长度至少为 3 。 二、(10?)判断题 (1)信息就是一种消息。(? ) (2)信息论研究的主要问题是在通信系统设计中如何实现信息传输、存储和处理的有效性和可靠性。(? ) (3)概率大的事件自信息量大。(? ) (4)互信息量可正、可负亦可为零。(? ) (5)信源剩余度用来衡量信源的相关性程度,信源剩余度大说明信源符号间的依赖关系较小。 (? ) (6)对于固定的信源分布,平均互信息量是信道传递概率的下凸函数。(? ) (7)非奇异码一定是唯一可译码,唯一可译码不一定是非奇异码。(? ) (8)信源变长编码的核心问题是寻找紧致码(或最佳码)。 (? ) (9)信息率失真函数R(D)是关于平均失真度D的上凸函数. ( ? ) 三、(10?)居住在某地区的女孩中有25%是大学生,在女大学生中有75%是身高1.6米以上的,而女孩中身高1.6米以上的占总数的一半。 假如我们得知“身高1.6米以上的某女孩是大学生”的消息,问获得多少信息量? 解:设A表示“大学生”这一事件,B表示“身高1.60以上”这一事件,则 P(A)=0.25 p(B)=0.5 p(B|A)=0.75 (5分) 故p(A|B)=p(AB)/p(B)=p(A)p(B|A)/p(B)=0.75*0.25/0.5=0.375 (4分) I(A|B)=-log0.375=1.42bit (1分)

哈夫曼编码译码器---课程设计报告

目录 目录 (2) 1课程设计的目的和意义 (3) 2需求分析 (4) 3概要设计 (4) 4详细设计 (8) ¥ 5调试分析和测试结果 (11) 6总结 (12) 7致谢 (13) 8附录 (13) 参考文献 (20) .

| ; 1 课程设计目的与意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 作为计算机专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。 ( 在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们

可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。 在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。 数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。 2 需求分析 课题:哈夫曼编码译码器 ) 问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。问题补充:1. 从硬盘的一个文件里读出一段英语文章; 2. 统计这篇文章中的每个字符出现的次数; 3. 以字符出现字数作为权值,构建哈夫曼树,并将哈夫曼树的存储 结构的初态和终态进行输出; 4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破 译。 具体介绍:在本课题中,我们在硬盘中预先建立一个文档,在里面编辑一篇文章。然后运行程序,调用函数读出该文章,显示在界面;再调用函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用函数构建哈夫曼树;并调用函数将哈夫曼的存储结构的初态和终态进行输出。然后调用函数对哈夫曼树进行编码,调用函数将编码写入文件;再调用对编码进行译码,再输出至界面。至此,整个工作就完成了 3 概要设计。

哈夫曼编码课程设计报告

哈夫曼编码课程设计报 告 Last revised by LE LE in 2021

湖南科技学院 数据结构课程设计报告课题: 霍夫曼编码 专业班级:信计1202 学号: 姓名:黄思琪 指导教师: 牛志毅

1 课程设计的目的和意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 2.需求分析 课题:哈夫曼编码译码器系统 问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。 问题补充:1. 从硬盘的一个文件里读出一段英语文章; 2. 统计这篇文章中的每个字符出现的次数; 3. 以字符出现字数作为权值,构建哈夫曼树 4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破译。 具体介绍:在本课题中,我们在硬盘D盘中预先建立一个文档,在里面编辑一篇文章(大写)。然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用tongji()函数对 该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显 示;然后以每个字符出现次数作为权值,调用Create_huffmanTree()函数构建哈夫曼 树。然后调用Huffman_bianma()函数对哈夫曼树进行编码,调用coding()函数将编码 写入文件。

信息论与编码期末试卷

上海大学2011~2012学年度冬季学期试卷(A卷) 课程名:信息论与编码课程号: 07276033学分: 4 应试人声明: 我保证遵守《上海大学学生手册》中的《上海大学考场规则》,如有考试违纪、作弊行为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。 应试人应试人学号应试人所在院系 题号 1 2 3 4 得分——————————————————————————————————————一:填空题(每空2分,共40分) 1:掷一个正常的骰子,出现‘5’这一事件的自信息量为________,同时掷两个正常的骰子,‘点数之和为5’这一事件的自信息量为___________.(注明物理单位) 2:某信源包含16个不同的离散消息,则信源熵的最大值为___________,最小值为_____________. 3:信源X经过宥噪信道后,在接收端获得的平均信息量称为______________. 4:一个离散无记忆信源输出符号的概率分别为p(0)=0.5,p(1)=0.25,p(2)=0.25,则由60个符号构成的消息的平均自信息量为__________. 5:信源编码可提高信息传输的___有效___性,信道编码可提高信息传输的___可靠_性. 6:若某信道的信道矩阵为 ? ? ? ? ? ? ? ? ? ? ? ? 001 100 010 100 ,则该信道为具有____归并____性能的信道 7:根据香农第一定理(定长编码定理)若一个离散无记忆信源X的信源熵为H(X),对其n个符号进行二元无失真编码时,其码字的平均长度必须大于____________ 8:若某二元序列是一阶马尔科夫链,P(0/0)=0.8,P(1/1)=0.7,则‘0’游程长度为4的概率为____________,若游程序列为312314,则原始的二元序列为_________. 9:若循环码的生成多项式为1 ) (2 3+ + =x x x g,则接收向量为(1111011)的伴随多项式为_______________ 10:对有32个符号的信源编4进制HUFFMAN码,第一次取_______个信源进行编码. 11:若一个线性分组码的所有码字为:00000,10101,01111,11010,则该码为(____,_____),该码最多可以纠正_______位错误,共有________陪集. 12:码长为10的线性分组码若可以纠正2个差错,其监督吗至少有__5____位. 13:(7,4)汉明码的一致校验矩阵为 ? ? ? ? ? ? ? ? ? ? 1,0,1,0,1, ,1 0,1,1,0,0, ,1 0,0,0,1,1, ,1 3 2 1 r r r ,则3 2 1 r r r 为__________. _______________________________________________________________ 草稿纸 成绩

信息论与编码课程设计报告,统计信源熵与香农编码

信息论与编码课程设计报告设计题目:统计信源熵与香农编码 专业班级电信 12-06 学号 学生姓名 指导教师 教师评分 2015年 3 月 30日

目录 一、设计任务与要求 (2) 二、设计思路 (2) 三、设计流程图 (3) 四、程序运行及结果 (4) 五、心得体会 (6) 参考文献 (7) 附录:源程序 (8)

一、设计任务与要求 1.统计信源熵 要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。 2.香农编码 要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。 二、设计思路 本次课程设计中主要运用C 语言编程以实现任务要求,分析所需要的统计量以及相关变量,依据具体公式和计算步骤编写语句,组成完整C 程序。 1、信源熵 定义:信源各个离散消息的自信息量的数学期望为信源的平均信息量,一般称为信源的信息熵,也叫信源熵或香农熵,有时称为无条件熵或熵函数,简称熵,记为H ()。 计算公式: ) (log )(-)x (i i i x p x p H ∑= 2、香农编码过程: (1)将信源消息符号按其出现的概率大小依次排列为 n p p ≥???≥≥21p (2)确定满足下列不等式的整数码长i K 为 1)()(+-<≤-i i i p lb K p lb (3)为了编成唯一可译码,计算第i 个消息的累加概率 ∑-==11) (i k k i a p P (4)将累计概率 i P 变换成二进制数。 (5)取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。

三、设计流程图 1、统计信源熵 开始 读取给定文件 判断文件是否打开否 并且不为空 是 统计文本字符,直关闭文件 至文本字符读完。 统计同一字符(不分 大小写)出现的次数 计算字符概率 计算信源熵 输出 结束

信息论与编码课程大作业二进制哈夫曼编码

信息论与编码课程大作业 题目:二进制哈夫曼编码 学生姓名: 学号:2010020200 专业班级: 2010级电子信息班 2013年5月18日

二进制哈夫曼编码 1、二进制哈夫曼编码的原理及步骤 1、1信源编码的计算 设有N 个码元组成的离散、无记忆符号集,其中每个符号由一个二进制码字表示,信源符号个数n 、信源的概率分布P={p(s i )},i=1,…..,n 。且各符号xi 的以li 个码元编码,在变长字编码时每个符号的平均码长为∑==n i li xi p L 1)( ; 信源熵为:)(log )()(1 xi p xi p X H n i ∑=-= ; 唯一可译码的充要条件:11 ≤∑=-n i Ki m ; 其中m 为码符号个数,n 为信源符号个数,Ki 为各码字长度。 构造哈夫曼数示例如下图所示。 1、2 二元霍夫曼编码规则 (1)将信源符号依出现概率递减顺序排序。 (2)给两个概率最小的信源符号各分配一个码位“0”和“1”,将两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结 0.60 0.15 0.09 0.30 1.00 0.60 0.03 0.30 0.15 0.40 0.05 0.04 0.03

果得到一个只包含(n-1)个信源符号的新信源。称为信源的第一次缩减信源,用s1 表示。 (3)将缩减信源 s1 的符号仍按概率从大到小顺序排列,重复步骤(2),得到只含(n-2)个符号的缩减信源s2。 (4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号 的概率之和必为 1,然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。 1、3 二元哈夫曼编码流程图如下图所示。 是 是 开始 等待数据输入 判断输入的概 率是否小于零 判断概率和是 否大于1 生成一个n - 1行n 列的数组 按照哈弗曼的编码规则进行编 码 计算码长 计算编码效率 计算信源熵 显示结果 结束

哈夫曼编译码课程设计报告

一、需求分析 1.运行环境:Microsoft Visual C++ 2.程序所实现的功能: 初始化:输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率),根据权值建 立哈夫曼树,输出每一种字符的哈夫曼编码。 编码:利用求出的哈夫曼编码,对该正文(字符串)进行编码,并输出。 译码:对于得到的一串编码,利用已求得的哈夫曼编码进行译码,将译出的正文输出。 输出哈夫曼树形态:以树的形式输出哈夫曼树。 3.程序的输入,包含输入的数据格式和说明: there are three students(char型) 4.程序的输出,程序输出的形式: ②统计字符出现次数并输出 ③根据字符出现次数求出哈夫曼编码并输出(根据算法差异得到的编码可能不 同,但应具有两个特征,一是编码长度应与表中相同,二是编码应该是前缀编码) ④以树的形式输出哈夫曼树 二、设计说明 1. 算法设计的思想 1) 确定哈夫曼树和哈夫曼编码的储存表示 2)在HT[1..n]中选择parent为0的且weight最小的两个节点s1和

s2 3)w存放n个字符的权值(均>0),构造哈夫曼树HT,输出静态链表(数组)储存哈夫曼树储存结构模拟,然后求出n个字符的哈夫曼编码HC 4)利用哈夫曼编码对密文进行译码,输出译后的字符串 5) 在main()中实现:输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率,然后调用各子函数实现该程序功能 2.主要的数据结构设计说明 Select(HuffmanTree &HT, int n, int &s1, int &s2) {//在HT[1..n]中选择parent为0且weight最小的两个结点, // 其序号分别为s1和s2。 HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) { // w存放n个字符的权值(均>0),构造哈夫曼树HT, // 并求出n个字符的哈夫曼编码HC for (i=n+1; i<=m; i++) { // 建哈夫曼树 // 在HT[1..i-1]中选择parent为0且weight最小的两个结点, // 其序号分别为s1和s2。 Select(HT, i-1, s1, s2); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; HuffmanTran(HuffmanTree &HT,char* &str1,char* &str2,int n) {//利用哈夫曼编码对密文进行译码,输出译后的字符串 3.程序的主要流程图

数据结构课程设计哈夫曼编码[1]

数据结构课程设计 指导教师:吴小平 学院:信息科学与技术学院 班级:软件三班 学号:201313040314 姓名:孙召阳

目录 一、前言 1.摘要 二、实验目的 三、题目--赫夫曼编码/译码器 1.问题描述 2.基本要求 3.测试要求 4.实现提示 四、需求分析--具体要求 前言 1.摘要 随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。 算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。 数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。

二、实验目的 学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。通过此次课程设计主要达到以下目的: 1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方 法和作风。 三、题目--赫夫曼编码/译码器 1. 问题描述 利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站编写一个赫夫曼码的编/译码系统。 2.基本要求 一个完整的系统应具有以下功能: (1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。 (2) E:编码(Encoding)。利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 (3) D:译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。 3.测试要求 (1) 已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。 (2) 用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FA VORITE”。 字符 A B C D E F G H I J K L M 频度186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符N O P Q R S T U V W X Y Z 频度57 63 15 1 48 51 80 23 8 18 1 16 1

相关文档
最新文档