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

上传人:b****6 文档编号:8469665 上传时间:2023-01-31 格式:DOCX 页数:8 大小:398.17KB
下载 相关 举报
信息论与编码课程大作业二进制哈夫曼编码.docx_第1页
第1页 / 共8页
信息论与编码课程大作业二进制哈夫曼编码.docx_第2页
第2页 / 共8页
信息论与编码课程大作业二进制哈夫曼编码.docx_第3页
第3页 / 共8页
信息论与编码课程大作业二进制哈夫曼编码.docx_第4页
第4页 / 共8页
信息论与编码课程大作业二进制哈夫曼编码.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

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

《信息论与编码课程大作业二进制哈夫曼编码.docx》由会员分享,可在线阅读,更多相关《信息论与编码课程大作业二进制哈夫曼编码.docx(8页珍藏版)》请在冰豆网上搜索。

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

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

 

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

 

信息论与编码课程大作业

 

题目:

二进制哈夫曼编码

学生姓名:

学号:

2010020200

专业班级:

2010级电子信息班

 

2013年5月18日

二进制哈夫曼编码

1、二进制哈夫曼编码的原理及步骤

1、1信源编码的计算

设有N个码元组成的离散、无记忆符号集,其中每个符号由一个二进制码字表示,信源符号个数n、信源的概率分布P={p(si)},i=1,…..,n。

且各符号xi的以li个码元编码,在变长字编码时每个符号的平均码长为

信源熵为:

唯一可译码的充要条件:

其中m为码符号个数,n为信源符号个数,Ki为各码字长度。

构造哈夫曼数示例如下图所示。

 

 

1、2二元霍夫曼编码规则

(1)将信源符号依出现概率递减顺序排序。

(2)给两个概率最小的信源符号各分配一个码位“0”和“1”

,将两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结果得到一个只包含(n-1)个信源符号的新信源。

称为信源的第一次缩减信源,用s1表示。

(3)将缩减信源s1的符号仍按概率从大到小顺序排列,重复步骤

(2),得到只含(n-2)个符号的缩减信源s2。

(4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号的概率之和必为1,然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。

1、3二元哈夫曼编码流程图如下图所示。

2、二元哈夫曼编码程序

p=input('pleaseinputanumber:

')%提示输入界面

n=length(p);

fori=1:

n

ifp(i)<0

fprintf('\nTheprobabilitiesinhuffmancannotlessthan0!

\n');

p=input('pleaseinputanumber:

')%如果输入的概率数组中有小于0的值,

end

end

ifabs(sum(p)-1)>0

fprintf('\nThesumoftheprobabilitiesinhuffmancanmorethan1!

\n');

p=input('pleaseinputanumber:

')%如果输入的概率数组总和大于1,则重

end

q=p;

a=zeros(n-1,n);%生成一个n-1行n列的数组

fori=1:

n-1

[q,l]=sort(q);%对概率数组q进行从小至大的排序,并且用l数组返回一个q排序前的顺序编号

a(i,:

)=[l(1:

n-i+1),zeros(1,i-1)];%由数组l构建一个矩阵,该矩阵表明概率合并

q=[q

(1)+q

(2),q(3:

n),1];%将排序后的概率数组q的前两项,即概率最小的两

end

fori=1:

n-1

c(i,1:

n*n)=blanks(n*n);

end

c(n-1,n)='0';%由于a矩阵的第n-1行的前两个元素为进行huffman编码加和运算时所得的最

c(n-1,2*n)='1';

fori=2:

n-1

c(n-i,1:

n-1)=c(n-i+1,n*(find(a(n-i+1,:

)==1))-(n-2):

n*(find(a(n-i+1,:

)==1)));

c(n-i,n)='0';%根据之前的规则,在分支的第一个元素最后补0

c(n-i,n+1:

2*n-1)=c(n-i,1:

n-1);

c(n-i,2*n)='1';%根据之前的规则,在分支的第一个元素最后补1

forj=1:

i-1

c(n-i,(j+1)*n+1:

(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:

)==j+1)-1)+1:

n*find(a(n-i+1,:

)==j+1));

end

end%完成huffman码字的分配

fori=1:

n

h(i,1:

n)=c(1,n*(find(a(1,:

)==i)-1)+1:

find(a(1,:

)==i)*n);

ll(i)=length(find(abs(h(i,:

))~=32));%计算每一个huffman编码的长度

end

disp('二元霍夫曼编码平均码长')

l=sum(p.*ll)%计算平均码长

%fprintf('\nhuffmancode:

\n');

h

disp('信源熵')

hh=sum(p.*(-log2(p)))%计算信源熵

%fprintf('\nthehuffmaneffciency:

\n');

disp('编码效率')

t=hh/l%计算编码效率

3、运行结果及分析

当输入数据[0.01,0.02,0.03,0.04,0.10,0.15,0.20,0.25,0.20]时

3、1运行结果:

pleaseinputanumber:

[0.01,0.02,0.03,0.04,0.10,0.15,0.20,0.25,0.20]

p=

Columns1through5

0.01000.02000.03000.04000.1000

Columns6through9

0.15000.20000.25000.2000

二元霍夫曼编码平均码长

l=

2.7400

h=

1110100

1110101

111011

11100

1111

110

00

10

01

信源熵

hh=

2.6883

编码效率

t=

0.9811

3、2分析:

1、在哈弗曼编码的过程中,对缩减信源符号按概率有大到小的顺序重新排列,应使合并后的新符号尽可能排在靠前的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。

2、哈弗曼编码效率相当高,对编码器的要求也简单得多。

3、哈弗曼它保证了信源概率大的符号对应于短码,概率小的符号对应于长码,每次缩减信源的最后两个码字总是最后一位码元不同,前面的各位码元都相同,每次缩减信源的最长两个码字有相同的码长。

4、哈弗曼的编法并不一定是唯一的。

4、体会

此次设计用matlab编程实现哈夫曼对信源无失真编码。

由于课本知识点的不太理解,一点都不知道编码的过程,后来通过阅读<<信息论与编码>>课本、网上查阅资料,最后才对本次设计有了一定的理解,详细理解了哈夫曼的具体编码过程。

经过理解,发现这种编码其实挺简单的,最重要的是怎样用程序把他实现,这对我们的编程能力也是一次考验。

设计要求中要求计算信源熵,这又考察了现代通信原理的知识。

所以这次设计所设计的知识面广,有利于我们对相关知识进一步加深、巩固。

更加深刻的感觉到哈夫曼编码能够大大提高通信的效率

通过这次设计,让我明白,在平时的学习中,对于每一个知识点都不能一知半解,否则在具体的实际运用中就会现“原形”。

比如这次哈夫曼编码,如果我们只读一下它的编码过程的步骤,不实际举一个例子来验证,我们就很有可能在很多地方犯错。

所以需要我们在阅读课本的时候还要仔细思考课本有关编码的示例,这对于我们掌握课本知识尤其重要的。

这次设计编程的思路,编辑,调试等让我明白编程时一定要保持清醒的头脑,有严谨的思维才能将实验要求实现得完整;调试过程会发现很多问题,这时不能烦躁,要耐心的去发现问题,不断掌握matlab软件的各种调试方法。

此次的实践又是对我的一次警醒,要有认真的态度,才有可能做好每一件事的!

最后非常感谢一直给我教导的老师和帮助同学们,他们的支持和鼓励让我在遇到挫折时能够战胜它,也让我成功了完成了这次课程设计。

今后我要更加努力的学习专业知识,提高自我的能力!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1