- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
信息论与编码课程作业
——霍夫曼编码求信源熵和存储前后的信息量的变化
一:设计目的:
学习离散信源平均信息量的计算方法。
理解和掌握huffman编码的基本原理,实现对信源符号的huffman编码
熟悉 Matlab 编程;
二:设计原理和思路
1.信源熵的计算:
公式: Matlab实现:I=log2(1/p) 或I=-log2(p)
熵(平均自信息)的计算公式
Matlab实现:HX=sum(-x.*log2(x));或者h=h-x(i)*log2(x(i));
2.霍夫曼编码原理;
分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。然后是码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。
1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。在这一过程中每一次都把排序后的信源概率存入矩阵p中,位置索引存入矩阵m中。这样,由排序之后的概率矩阵?p以及索引矩阵m就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。
2、码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。从索引矩阵M 的末行开始回溯。
(1) 在p的末行2元素位置填入0和1。
(2) 根据该行索引1位置指示,将索引1位置的编码(‘1’)填入上一行的第一、第二元
素位置,并在它们之后分别添加‘0’和‘1’。
(3) 将索引不为‘1’的位置的编码值(‘0’)填入上一行的相应位置(第3 列)。
(4) 以m的倒数第二行开始向上,重复步骤(1) ~ (3),直到计算至m的首行为止。
三:设计代码:
clear all;
format long
disp(strcat(信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化,13));
histgram=zeros(1,255);
[c,map]=imread(C:\Documents and Settings\Administrator\桌面\infomation\lenna.bmp);
x=rgb2gray(c);
[a,b]=size(x);
for i=1:a
for j=1:b
k=x(i,j);
histgram(k)=histgram(k)+1;
end
end
f=histgram/a/b;
symbols=find(f~=0); %灰度值
p=f(symbols); %概率
L=length(p);
pp=p;
%霍夫曼编码
m=zeros(L-1,L);
for i=1:L-1
[p,mark]=sort(p);
m(L-i,1:L-i+1)=mark(1:L-i+1);
p=[p(1)+p(2),p(3:L),1];
end
c=cell(L-1,L);
c(1,1)={0};
c(1,2)={1};
for i=2:L-1;
ind=find(m(i-1,:)==1);
temp=char(c(i-1,ind));
c(i,1)={[temp,0]};
c(i,2)={[temp,1]};
snc=find(m(i-1,:)~=1);
for j=3:i+1;
con=snc(j-2);
c(i,j)=c(i-1,con);
end
end
codeL=[];
averge_long=0;
H1=0;
disp(strcat(灰度值,32,32,32,概率,32,32,32,32,32,32,32,32,32,霍夫曼编码:));
for i=1:L;
ind=find(m(L-1,:)==i);
code=char(c(L-1,ind));
codeLength(i)=length(code);
averge_long=averge_long+pp(i)*codeLength(i);
H1=H1+pp(i)*log2(1/pp(i));
disp(strcat(32,num2str(symbols(i)),32,32,32,num2str(pp(i)),32,32,code));
end
disp(strcat(信源熵=,num2str(H1),32,32,32,32,平均码字长度=,num2str(averge_long),32,32,32,32,32,压缩比=,num2str(8/averge_long)));
四:设计运行结果:
信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化
原创力文档


文档评论(0)