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

合集下载

2024版信息论与编码教案

2024版信息论与编码教案

应用:算术编码在图像、视频和音频压 缩等领域具有广泛应用,如JPEG 2000、 H.264等标准中采用了算术编码技术。 与霍夫曼编码相比,算术编码具有更高 的压缩比和更好的性能表现。
06
多媒体信息压缩编码
多媒体信息压缩编码的基本概念与原理
压缩编码的必要性
多媒体数据量大,存储和传输成本高,需通过压缩编码降低数据 量。
典型编码方法
03
详细介绍几种典型的编码方法,如香农编码、哈夫曼编码、算
术编码等。
教学目标与要求
掌握信息论与编码的基本理论
通过学习,使学生能够深入理解信息论与编 码的基本概念和原理。
培养编码实践能力
通过案例分析、实验等环节,提高学生的编 码实践能力。
培养创新能力
鼓励学生探索新的编码方法,培养创新思维 和解决问题的能力。
编码分类
包括无损编码和有损编码,前者 可以完全恢复原始信息,后者则 会损失部分信息以换取更高的压 缩比。
霍夫曼编码的原理与应用
• 原理:霍夫曼编码是一种可变长度编码方法,根据信源符 号出现的概率来构造最优编码。它利用概率大的符号用较 短的码字表示,概率小的符号用较长的码字表示,从而实 现平均码长最短。
信息论的基本概念
信息
信息是事物运动状态或存在方式的不确定性的描述。
信息系统
由信源、信道、信宿等组成的传输和处理信息的系统。
信息论
研究信息的传输、处理、存储和检索等过程中的基本 理论和方法。
信息的度量与性质
信息的度量
用概率和统计的方法对信息进行量化,如香农 信息熵、互信息等。
信息的性质
包括普遍性、客观性、可传递性、可共享性、 可压缩性等。
压缩编码的可能性

《信息论与编码》课程教学大纲.doc

《信息论与编码》课程教学大纲.doc

《信息论与编码》课程教学大纲Information Theory & Codec.一、课程教学目标1、性质和地位:信息论与编码是通信工程(与计算机通信)专业的一门重要的专业课。

该课程是继通信原理与程控交换之后,为从事通信信息的编码研究学习而开设的专业必修或选修课。

2、知识要求:本课程的教学目的是通过教学和必要的练习、实践环节,使学生了解信息论的信源、信源炳概念,熟悉信源、信道编码定理,掌握一些重要的编码方法,为将来从事通信信息资源研发应用打好必要的基础。

3、能力要求:除课堂学习理论知识之外,通过练习与实践掌握一些常用的编码定理与编码方法,加深对信息论编码与通信可靠性、安全性的关系的认识。

二、教学原则和基本要求本课程教学采用课堂讲授与课外作业为主,以必要实习、实践(4~8学时)为辅的方法教学,通过本课程学习应达到如下基本要求:1.了解信息论信源炳重要基本概念;2.了解信息论的信源、信道编码定理;3.掌握信源炳的计算;4.掌握无失真信源最佳编码法(香农码、费诺码、哈夫曼码);5.掌握限失真信源常用编码法;6.了解几种信道差错编码及密码编码原理与方法。

三、教学内容和学时分配1.总体安排:本课程授课时间为48学时,3学分。

具体授课内容与学时列表分配如下: 教学内容章目本课程学分:3学时分配讲课学时课堂讨论编程实习合计第一章绪论1第二章信源及信源嫡8第三章无失真信源编码72第四章限失真信源编码9第五章信道编码132第六章密码学6合计444482.具体要求:第一章绪论[目的要求]了解信息论的发展及通信系统的模型。

[教学内容]信息论的发展,通信系统的模型。

[重点难点]无。

[教学方法]课堂教学。

[作业]无。

[课时]1学时第二章信源及信源炳[目的要求]了解信源的信息量与嫡的概念,掌握信源炳的计算。

[教学内容]信源的描述分类,离散信源的炳和互信息,连续信源的炳和互信息, 离散序列信源的炳,冗余度。

[重点难点]自信息量、互信息,炳的计算。

信息论与编码技术》实验教案

信息论与编码技术》实验教案

信息论与编码技术实验教案第一章:信息论基础1.1 实验目的1. 了解信息的基本概念及其度量方法;2. 掌握信息的熵、冗余度和信道容量等基本概念。

1.2 实验原理1. 信息的基本概念:信息、消息、信源等;2. 信息的度量:平均信息量、熵、冗余度等;3. 信道容量和编码定理。

1.3 实验设备与材料1. 计算机及投影仪;2. 相关实验软件。

1.4 实验步骤1. 讲解信息的基本概念及其度量方法;2. 分析实际例子,演示信息的熵、冗余度和信道容量的计算过程;3. 让学生通过实验软件进行相关计算和分析。

1.5 思考与讨论1. 信息量与消息长度的关系;2. 信道容量在实际通信系统中的应用。

第二章:数字基带编码2.1 实验目的1. 掌握数字基带编码的基本原理;2. 学会使用相关软件进行数字基带编码的仿真。

2.2 实验原理1. 数字基带编码的定义和分类;2. 常用数字基带编码方法:NRZ、RZ、曼彻斯特编码等;3. 数字基带编码的性能评估:误码率、带宽利用率等。

2.3 实验设备与材料1. 计算机及投影仪;2. 相关实验软件。

2.4 实验步骤1. 讲解数字基带编码的基本原理和方法;2. 演示常用数字基带编码的仿真效果;3. 让学生通过实验软件进行数字基带编码的仿真实验。

2.5 思考与讨论1. 数字基带编码的优缺点;2. 如何在实际通信系统中选择合适的基带编码方法。

第三章:信道编码与误码控制3.1 实验目的1. 了解信道编码的基本原理;2. 掌握常见的信道编码方法;3. 学会使用相关软件进行信道编码的仿真。

3.2 实验原理1. 信道编码的定义和作用;2. 常用信道编码方法:卷积编码、汉明编码、里德-所罗门编码等;3. 误码控制原理:检错、纠错等。

3.3 实验设备与材料1. 计算机及投影仪;2. 相关实验软件。

3.4 实验步骤1. 讲解信道编码的基本原理和方法;2. 演示常用信道编码的仿真效果;3. 让学生通过实验软件进行信道编码的仿真实验。

信息论与编码课程设计 河南理工大学

信息论与编码课程设计   河南理工大学

一设计目的信息论与编码是我们电子信息工程的一门重要的专业课,通过对本次课程设计,学习将学到的理论知识用于实践,同时也学习了用软件编写程序,进一步对本课程知识的巩固和理解。

学习分析问题,解决问题的方法和途径,提高对本专业的学习兴趣。

二设计任务与要求(1)统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。

(2)哈夫曼编码要求:任意输入消息概率,利用哈夫曼编码方法进行编码,并计算信源熵和编码效率。

三理论简介3.1通信系统的模型通信系统的模型通信系统的性能指标主要是有效性、可靠性、安全性和经济性,通信系统优化就是使这些指标达到最佳,除了经济性,这些指标正是信息论的研究对象,可以通过各种编码处理来使通信系统的性能最优化。

根据信息论的各种编码定理和上述通信系统的指标,编码问题可以分为3类:信源编码、信道编码和加密编码。

3.1.1 信源编码由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余度,提高编码效率。

信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。

前者适用于离散信源或数字信号;后者主要用于连续信源或模拟信号。

本次课程设计就是利用的无失真信源编码。

3.1.2 信道编码信源编码器的作用:把信源发出的消息变换成由二进制码元(或多进制码元)组成的代码组,这种代码组就是基带信号。

同时通过信源编码可以压缩信源的冗余度,以提高通信系统传输消息的效率。

信源译码器的作用:把信道译码器输出的代码组变换成信宿所需要的消息形式,它的作用相当于信源编码器的逆过程。

3.1.3 加密编码加密编码是研究如何隐蔽消息中的信息内容,以便在传输过程中不被窃听,提高通信系统的安全性。

3.2 信源熵3.2.1 信源的描述和分类& 按信源在时间和幅度上的分布情况离散信源:文字、数据、电报连续信源:语音、图像& 按发出符号的数量单个符号信源:指信源每次只发出一个符号代表一个消息符号序列信源:指信源每次发出一组含二个以上符号的符号序列代表一个消息 & 按符号间的关系无记忆信源有记忆信源3.2.2 离散信源熵& 自信息量:随机事件的自信息量定义为其概率对数的负值,即在信息论中常用的对数底是2,信息量的单位为比特(bit);& 联合自信息量两个消息xi ,yj 同时出现的联合自信息量:& 条件自信息量在事件yj 出现的条件下,随机事件xi 发生的条件概率为p(xi / yj) ,则它的条件自信息量定义为条件概率对数的负值:& 离散信源熵为信源中各个符号不确定度的数学期望,即单位为:比特/符号 或者 比特/符号序列。

信息与编码论课程设计

信息与编码论课程设计

信息与编码论课程设计一、课程目标知识目标:1. 学生能理解信息与编码的基本概念,掌握不同编码方式的特点及应用场景。

2. 学生能掌握二进制、十进制等数制转换方法,并运用这些方法进行编码和解码。

3. 学生了解信息安全的基本原理,认识到保护信息的重要性。

技能目标:1. 学生具备运用二进制进行简单计算和信息编码的能力。

2. 学生能够运用所学知识,分析并解决实际问题,例如:设计一个简单的加密和解密程序。

3. 学生能够通过合作与交流,共同探讨信息与编码的应用,提高团队协作能力。

情感态度价值观目标:1. 学生培养对信息科学的兴趣,激发探究精神,树立创新意识。

2. 学生认识到信息与编码在科技发展和社会生活中的重要作用,增强社会责任感。

3. 学生在合作交流中,学会尊重他人,培养良好的沟通能力和团队协作精神。

课程性质:本课程为理论与实践相结合的课程,旨在帮助学生掌握信息与编码的基本知识,提高实际操作能力。

学生特点:六年级学生具有一定的逻辑思维能力和自主学习能力,对新鲜事物充满好奇,喜欢探索和挑战。

教学要求:注重启发式教学,引导学生主动参与,培养实践操作能力;关注学生个体差异,因材施教,提高教学质量。

通过分解课程目标为具体学习成果,使学生在课程学习中获得全面、均衡的发展。

二、教学内容1. 信息与编码基本概念:介绍信息的定义、特性及编码的必要性;讲解不同编码方式(如:文字编码、图像编码、声音编码等)及其应用场景。

教材章节:第一章 信息与编码基本概念2. 数制转换:重点讲解二进制与十进制的转换方法,拓展至其他进制转换;通过实例分析,使学生掌握数制转换在实际应用中的运用。

教材章节:第二章 数制转换及其应用3. 编码与解码:以二进制编码为例,讲解编码和解码的基本原理;引导学生运用所学知识进行简单的编码与解码实践。

教材章节:第三章 编码与解码技术4. 信息安全:介绍信息安全的基本原理,如加密、解密、数字签名等;通过案例分析,使学生了解信息安全在现实生活中的重要性。

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

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

目录一:实验原理----------------------------1二:程序源代码--------------------------1三:实验分析-----------------------------6四:实验结论---------------------------7赫夫曼编码一:实验原理哈夫曼编码的具体步骤归纳如下:① 概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。

② 将n个信源信息符号的n个概率,按概率大小排序。

③ 将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。

④ 将n-1个概率,按大小重新排序。

⑤ 重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。

⑥ 如此反复重复n-2次,得到只剩两个概率序列。

⑦ 以二进制码元(0.1)赋值,构成哈夫曼码字。

编码结束。

哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大概信息符号分配码字长度短,小概率信息符号分配码字长度长。

C、哈夫曼编码的特点(1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;(2)哈夫曼编码的字长参差不齐,硬件实现不方便;(3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。

二:程序源代码:#define MAXVALUE 10000#define MAXLEAF 30#define MAXNODE 59#define MAXBIT 10#define LENTH 30#include "stdio.h"#include<iostream>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;if((fp=fopen("datafile.txt","wb"))==NULL){printf("打开失败 ....");return;}if(fwrite(&filedata,sizeof(filedata),1,fp)!=1) printf("写入文件失败 ....");fclose(fp);}void openfile(){ FILE *fp;if((fp=fopen("datafile.txt","rb"))==NULL){return;}fread(&filedata,sizeof(filedata),1,fp);}void translate(){char c;int i,j,k=0,m,n=0;printf("请输入你想要译码的二进制序列 ");printf("\n");getchar();scanf("%c",&c);for(i=0;(i<MAXVALUE)&&(c=='1'||c=='0');i++){ code[i]=c;scanf("%c",&c);}printf("对应的信源符号为:");for(j=0;j<=MAXVALUE&&HuffNode[j].parent!=-1;j++) m=j+1;for(j=0,k=m;j<=i;j++){if(code[j]=='0'){n=HuffNode[k].lchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}else{n=HuffNode[k].rchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}}}void Huffman(){HCodeType HuffCode[MAXLEAF],cd;int i,j,m1,m2,x1,x2,c,p,m;if(filedata.count==0){ printf("\n输入信源符号总数 : ");scanf("%d",&m);filedata.count=m;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch='a';}for(i=0;i<m;i++){ printf("请输入 (概率,信源符号):");scanf("%f %c",&HuffNode[i].gailv,&HuffNode[i].ch); filedata.mydata[i].gailv=HuffNode[i].gailv; filedata.mydata[i].letter=HuffNode[i].ch;savetofile();}}else{ m=filedata.count;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch=3;}for(i=0;i<m;i++){ HuffNode[i].gailv=filedata.mydata[i].gailv;HuffNode[i].ch=filedata.mydata[i].letter;}}for(i=0;i<m-1;i++){ m1=m2=MAXVALUE;x1=x2=0;for(j=0;j<m+i;j++){ if(HuffNode[j].gailv<m1&&HuffNode[j].flag==0){ m2=m1;x2=x1;m1=HuffNode[j].gailv;x1=j;}else if(HuffNode[j].gailv<m2&&HuffNode[j].flag==0){ m2=HuffNode[j].gailv;x2=j;}}HuffNode[x1].parent=m+i;HuffNode[x2].parent=m+i;HuffNode[x1].flag=1;HuffNode[x2].flag=1;HuffNode[m+i].gailv=HuffNode[x1].gailv+HuffNode[x2].gailv;HuffNode[m+i].lchild=x1;HuffNode[m+i].rchild=x2;}for(i=0;i<m;i++){ cd.start=m-1;c=i;p=HuffNode[c].parent;while(p!=-1){ if(HuffNode[p].lchild==c)cd.bit[cd.start]=0;else cd.bit[cd.start]=1;cd.start--;c=p;p=HuffNode[c].parent;}for(j=cd.start+1;j<m;j++)HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start;}printf("对应的赫夫曼编码如下:");printf("\n信源符号概率编码\n");for(i=0;i<m;i++){printf("%c %f ",HuffNode[i].ch,HuffNode[i].gailv); for(j=HuffCode[i].start+1;j<m;j++)printf("%d",HuffCode[i].bit[j]);printf("\n");}printf("按任意键继续......\n");}main(){char yn;printf("\n");printf("\n");printf(" 信息论与编码实验 \n");openfile();Huffman();for(;;){printf("\n是否想要把序列译码为信源符号 ?: (输入 y or n) "); scanf("%c",&yn);if(yn=='y'||yn=='Y')translate();elsebreak;}return 0;system("pause");}三:实验分析编码实例如下:由图中可以看出,符合基本的赫夫曼编码的原理,概率大的用短码,概率小的用长码。

《信息论与编码技术》课程教学大纲

《信息论与编码技术》课程教学大纲

04
05
信息论基础
包括信息的定义、度量方 法、信源编码、信道编码
等基本概念和原理。
先进编码技术
介绍LDPC码、Polar码等 先进编码技术的原理、性
能和应用。
实验与课程设计
通过实验和课程设计环节 ,加深对理论知识的理解 和掌握,提高实践能力和
创新能力。
02
信息论基础
信息的定义与度量
信息的概念
信息是事物运动状态或存在方式的不确定性的描述。
其他新型编码技术
喷泉码
介绍喷泉码的基本原理和特点,如无需反馈重传、适用于广播和多播通信等。探讨喷泉码在多媒体传输、深空 通信等领域的应用。
网络编码
阐述网络编码的基本原理和思想,如中间节点对接收到的信息进行编码再传输等。分析网络编码在提高网络吞 吐量、增强网络鲁棒性等方面的优势。探讨网络编码在无线网络、P2P网络等领域的应用。
对未来学习的建议与期望
培养创新思维
01
鼓励学生提出新的编码方法和算法,培养创新思维和
实践能力
跨学科学习
02 鼓励学生跨学科学习,将信息论与编码技术与计算机
科学、数学、物理学等学科相结合,拓展视野和思路
关注社会影响
03
引导学生关注编码技术对社会的影响和应用价值,培
养社会责任感和使命感
感谢您的观看
THANKS
编码的定义
将信息转换为可在通信系统中传输的信号的过程 。
编码的分类
根据编码目的和原理,可分为信源编码、信道编 码和加密编码等。
编码的评价指标
包括编码效率、误码率、抗干扰能力等。
线性分组码
01
线性分组码的定义
一种将信息序列划分为等长的组 ,并对每组独立进行编码的方法 。

信息与编码论课程设计

信息与编码论课程设计

信息与编码论课程设计一、课程目标知识目标:1. 理解信息与编码的基本概念,掌握不同编码方式的原理及特点;2. 学会运用二进制、十进制等数制进行信息转换,并掌握其相互转换的方法;3. 了解信息安全的基本知识,提高信息保护意识。

技能目标:1. 能够运用所学知识对信息进行编码和解码操作;2. 培养学生的逻辑思维能力和问题解决能力,通过案例分析和课堂讨论,提高学生的信息处理能力;3. 能够运用所学知识对简单的信息安全问题进行识别和防范。

情感态度价值观目标:1. 培养学生对信息科学的兴趣,激发他们探索未知领域的热情;2. 增强学生的团队合作意识,培养他们在合作中互相学习、共同进步的精神;3. 提高学生的信息安全意识,培养他们尊重知识产权、遵守网络道德的观念。

本课程旨在通过系统的理论讲解和丰富的实践操作,帮助学生掌握信息与编码的基本知识,提高他们的信息素养。

针对学生的年龄特点和认知水平,课程设计注重理论与实践相结合,以激发学生的学习兴趣和探究欲望。

在教学过程中,注重培养学生的逻辑思维能力和问题解决能力,为我国信息技术领域培养具有创新精神和实践能力的后备人才。

二、教学内容1. 信息与编码基本概念:信息的定义、编码的原理、不同编码方式的特点;教材章节:第一章 信息与编码概述2. 数制及其转换:二进制、十进制、八进制、十六进制等数制的概念及相互转换方法;教材章节:第二章 数制及其转换3. 编码算法:ASCII编码、Unicode编码、Base64编码等编码算法的原理与应用;教材章节:第三章 编码算法4. 信息安全:加密算法、数字签名、安全协议等基本概念及其应用;教材章节:第四章 信息安全5. 实践操作:开展信息编码与解码、信息安全防护等实验,巩固理论知识;教材章节:第五章 实践操作教学内容安排和进度:第一周:信息与编码基本概念、数制及其转换;第二周:编码算法、信息安全;第三周:实践操作。

教学内容注重科学性和系统性,结合教材章节进行合理组织,旨在帮助学生全面掌握信息与编码的相关知识。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程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)将信源消息符号按照其出现的概率大小依次排列为≥Λ21≥pnpp≥(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 =∑=81i )(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(码元/符号)信源熵为:∑===ni 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=KX H )(=61.255.2=0.977bit/码元 编码效率为: η=KX 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 <iostream.h>#include <math.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <vector>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:vector<Huffman_InformationSource>ISarray;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<ISNumber-1;i++)for(j=i+1;j<ISNumber;j++)if(ISarray[i].Probability<ISarray[j].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<ISNumber;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;elsetemp2->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;elsetemp2->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<ISNumber;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<ISNumber;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<ISNumber;j++)Hx+=-ISarray[j].Probability*log(ISarray[j].Probability)/log(2);CodeEfficiency=Hx/InformationRate;Redundancy=1- CodeEfficiency;}void CHuffman_2::Huffman_Display(){cout<<"码字:"<<endl;for(int i=0;i<ISNumber;i++){cout<<"\'"<<ISarray[i].InformationSign<<"\'"<<": "<<ISarray[i].Code<<endl;}cout<<endl;cout<<"平均码长:"<<AvageCodeLength<<endl<<endl;cout<<"编码效率:"<<CodeEfficiency<<endl<<endl;cout<<"冗余度:"<< Redundancy <<endl<<endl;}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)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。

相关文档
最新文档