二进制哈夫曼编码1.docx
《二进制哈夫曼编码1.docx》由会员分享,可在线阅读,更多相关《二进制哈夫曼编码1.docx(9页珍藏版)》请在冰豆网上搜索。
二进制哈夫曼编码1
课程设计任务书
2011—2012学年第一学期
专业:
通信工程学号:
姓名:
课程设计名称:
信息论与编码课程设计
设计题目:
二进制哈夫曼编码的分析与实现
完成期限:
自年月日至年月日共周
一.设计目的
1、深刻理解信源编码的基本思想与目的;
2、理解哈夫曼编码方法的基本过程与特点;
3、提高综合运用所学理论知识独立分析和解决问题的能力;
4、使用MATLAB或其他语言进行编程。
二.设计内容
假设已知一个信源的各符号概率,编写适当函数,对其进行哈夫曼编码,得出二进制码字,平均码长和编码效率,总结此编码方法的特点和应用。
三.设计要求
1、编写的函数要有通用性;
2、信源可以自由选择,符号信源与图像信源均可。
四.设计条件
计算机、MATLAB或其他语言环境
五.参考资料
[1]曹雪虹,张宗橙.信息论与编码.北京:
清华大学出版社,2007.
[2]王慧琴.数字图像处理.北京:
北京邮电大学出版社,2007.
指导教师(签字):
教研室主任(签字):
批准日期:
年月日
摘要
霍夫曼编码是可变字长编码(VLC)的一种。
Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
它是根据可变长最佳编码定理,应用哈夫曼算法而产生的一种编码方法。
在非均匀符号概率分布的情况下,变长编码总的编码效率要高于等字长编码。
因为具体规定了编码的方法,能使无失真编码的效率非常接近与1,所以在压缩信源信息率的实用设备中,哈夫曼编码还是比较常用的。
本课题利用哈夫曼编码的方法实现了对信源符号的熵、平均码长、传输速率、编码效率等的求解。
关键词:
Huffman;可变长编码;信源编码
目录
1.课题描述1
2设计原理1
3设计过程2
3.1课题介绍2
3.1.1Huffman编码特点2
3.1.2哈夫曼编码方法3
3.2设计内容3
3.3设计步骤4
4哈夫曼编码的MATLAB实现5
总结8
参考文献9
1.课题描述
huffman编码是一种二进制编码的算法,目的是缩小原来的数据,简单的说就是将出现概率较高的符号分配较少的码字,而出现概率大的符号分配较长的码字,这样起到压缩数据的作用。
哈夫曼编码是可变字长编码(VLC)的一种。
Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
本课题是利用哈夫曼编码方式来实现对信源符号码字、平均码长及编码效率的求解。
开发工具:
MATLAB。
2设计原理
设计原理如下:
设数字图像像素灰度级集合为{d1,d2,…,dm},其对应的概率分别为p(d1),p(d2),…,p(dm)。
按信息论中信源信息熵的定义,图像的熵定义为:
(2.1)
图像的熵表示像素各个灰度级位数的统计平均值,给出了对此输入灰度级集合进行编码时所需的平均位数的下限。
设βi为数字图像中灰度级di所对应的码字长度(二进制代码的位数),其相应出现的概率为P(di),则该数字图像所赋予的平均码字长度为:
(2.2)
(2.3)
根据信息论中信源编码理论,可以证明在R≧H条件下,总可以设计出某种无失真编码方法。
当然如果编码结果使R远大于H,表明这种编码方法效率很低,占用比特数太多。
最好编码结果是使R等于或接近于H。
这种状态的编码方法,称为最佳编码。
压缩比是指编码前后平均码长之比,如果用n表示编码前每个符号的平均码长,通常为用自然二进制码时的位数,则压缩比可表示为:
(2.4)
一般来讲,压缩比大,则说明被压缩掉的数据量多。
一个编码系统要研究的问题是设法减小编码平均长度R,使编码效率
尽量趋于1,而冗余度趋于0。
3设计过程
3.1课题介绍
3.1.1Huffman编码特点
凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。
为此必须将概率大的信息符号编以短的码字,概率小的符号编以长的码字,使得平均码字长度最短。
哈夫曼(Huffman)编码是最佳变长编码方法的一种,它是根据可变长最佳编码定理,应用哈夫曼算法而产生的一种编码方法。
进行哈夫曼编码时,为得到码方差最小的码,应使合并的信源符号位于缩减信源序列尽可能高的位置上,以减少再次合作的次数,充分利用短码。
哈夫曼码是用概率匹配方法进行信源编码。
它有两个明显的特点:
一是哈夫曼码的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分利用了短码;二是缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码。
哈夫曼编码方法得到的码并非是唯一的,造成并非唯一的原因是:
首先,每次对信源缩减时,赋予信源最后两个概率最小的符号,用0和1可以任意的,所以可以得到不同的哈夫曼码,但不会影响码字的长度。
其次:
对信源进行缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减信源中进行概率排序,其位置放置次序是可以任意的,故会得到不同的哈夫曼码。
此时将影响码字的长度,一般将合并的概率放在上面,这样可以获得较小的码方差。
对于多进制哈夫曼编码,为了提高编码效率,就要使长码的符号数量尽量少、概率尽量小,所以信源符号数最好满足
其中r为进制数,n为缩减的次数。
例如,要进行三进制编码,那么最好信源有7个符号,第1次合并后减少2个成为5个,第2次合并后又减少2个成为3个,这样给每一步赋予三进制符号就没有浪费了。
但如果信源只有6个符号时,为了尽量减少最长码的数量,则应该在第1次合并时添置概率为零的虚拟符号1个,事实上只合并2个概率最小的符号,后面每次合并三个,就可以使得最长码的符号数量最少,也就是长码的概率最小,从而得到最高的编码效率。
哈夫曼变长码的效率是相当高的,它可以单个信源符号编码或用L较小的信源序列编码,对编码器的设计来说也将简单的多。
但是应当注意,要达到很高的效率仍然需要按长序列来计算,这样才能使平均码字长度降低。
3.1.2哈夫曼编码方法
(1)将信源消息符号按其出现的概率大小依次排列为P1≧P2≧…≧Pn
(2)将两个概率最小的字母分别配以0和1两个码元,并将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。
(3)对重排后的两个概率最小符号重复步骤
(2)的过程。
(4)不断继续上述过程,直到最后两个符号配以0和1为止。
(5)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
3.2设计内容
一个有8个符号的信源X,各个符号出现的概率为:
X=
试进行霍夫曼编码,并计算平均码长、编码效率、压缩比、冗余度等。
3.3设计步骤
最终的各符号的霍夫曼编码如下:
u1:
1u2:
001u3:
011u4:
0000
u5:
0100u6:
0101u7:
00010u8:
00011
霍夫曼编码时,对同一源图像序列,霍夫曼编码并不是唯一的。
如果节
标1和标0的对调,则相应的霍夫曼编码变成:
u1:
0u2:
110u3:
100u4:
1111
u5:
1011u6:
1010u7:
11101u8:
11100
对照两组霍夫曼编码不难看出,尽管两者的组成不同,但两者的平均码长是一致的。
再根据以上数据,可分别计算其信源的熵、平均码长、编码效率及冗余度,即
熵:
=-0.4lb0.4-0.18lb0.18-0.10lb0.1-0.07lb0.07-0.06lb0.06
-0.05lb0.05-0.04lb0.04
=2.55
平均码长:
=1×0.04+3×0.18+3×0.10+4×0.10+4×0.07+4×0.06+5×0.05
+5×0.04
=2.61
编码效率:
压缩之前8个符号需要3个比特量化,经压缩之后的平均码字长度为2.61,因此压缩比为:
冗余度为:
对上述信源X的霍夫曼编码,其编码效率已达97.7%,仅有2.3%的冗余。
4哈夫曼编码的MATLAB实现
在matlab中调用了用户自定义文件humanff.m的文件,其源代码为:
function[h,l]=huffman(p)
iflength(find(p<0))~=0;
error('Inputisnotaprob.vector,thereisnegatibecomponent');
end
ifabs(sum(p)-1)>10e-10
error('Inputisnotaprob.vector,thesumofthecomponentisnotequalto1.');
end
n=length(p);%得到输入的元素个数
q=p;
m=zeros(n-1,n);
fori=1:
n-1,
[q,e]=sort(q);
m(i,:
)=[e(1:
n-i+1),zeros(1,i-1)];
q=[q
(1)+q
(2)+q(3:
n),e];
end
fori=1:
n-1,
c(i,:
)=blanks(n*n);
end
%以下计算各个元素码字
c(n-1,n)='0';
c(n-2,2*n)='1';
fori=2:
n-1;
c(n-i,1:
n-1)=c(n-i+1,n*(find(m(n-i+1,:
)==1))-(n-2):
n*(find(m(n-i+1,:
)==1)));
c(n-i,n)='0';
c(n-i,n+1:
2*n-1)=c(n-i,1:
n-1);
c(n-i,2*n)='1';
forj=1:
i-1
c(n-i,(j+1)*n+1:
(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:
)==j+1)-1)+...
1:
n*find(m(n-i+1,:
)==j+1));
end
在计算信源平均信息量的时候调用了message函数,在计算信源平均信息量的时候调用了message函数,message函数的源代码为:
functionr=message(x,n)%参数x是概率分布,n是离散信源的分布值数目
r=0;
fori=1:
n
r=r-x(i)*log(x(i))/log
(2);
end
disp('此离散信源的平均信息量为');
r
通常哈夫曼编码学的效率是小于1的,但当信源为某些特殊情况时,可以是效率达到1,当然是不可能超过1的。
如:
分别调用huffman和message函数如下:
clearall;
p=[1/3,1/6,1/15,1/15,11/30]%定义概率序列
p=
0.33330.16670.06670.06670.3667
截图为:
总结
通过该课程设计,我掌握了编译程序的原理以及步骤,还有编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,构造工具及其相关的技术。
课本上的知识是机械的,抽象的。
在本次课程设计,我有很大的收获。
这首先体现在理论知识的完善上:
采用等长编码的优点是编码过程和解码过程简单,可是这种方法没有考虑各个符号出现的概率,实际上就是将它们当做等概率事件处理的,所以它的编码效率比较低,而哈夫曼编码是根据可变长最佳编码定理,应用哈夫曼算法而产生的一种编码方法,它的平均码长最小,消息传输速率最大,编码效率最高;同时实践能力和动手能力有了质的飞跃!
设计