信息论实验信源的二元Huffman编码.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

信源的二元Huffman编码

一.实验目的

任选C语言,C++,或MATLAB等一种方法编写程序,对离散信源进行二元Huffman编码,计算平均码长及编码效率,并通过1~2个运行的结果,验证程序的正确性。

通过实验,掌握r元Huffman编码的方法,学会平均码长与编码效率等常见计算。

二.实验内容

编写程序实现:

输入:信源的分布,;

输出:二元变长码,平均码长,编码效率。

三.实验方案或步骤(程序设计说明)

(1)把信源符号(i=1,2,…,m)出现的概率按由大到小的顺序排列;

(2)对两个概率最小的符号分别标“0”和“1”,然后把这两个概率相加作为一个新的辅助符号的概率;

(3)将这个新的辅助符号与其他符号一起重新按概率大小顺序排列;

(4)跳到第2步,直到出现概率相加为1为止;

(5)用线将符号连接起来,得到一个码树,树的m个端点对应m个信源符号;

(6)从最后一个概率为1的节点开始,沿着码树分别到达每个信源符号,将一路遇到的“0”和“1”顺序排列起来,就是对应端点的信源符号的码字。

四.实验程序(经调试后正确的源程序)

p=input(\n输入信源X的分布,格式[p1p2…pm]:\n);

if(length(find(p0))~=0)

error(数组中概率有负的);%p概率为负拒绝编码

end

if(abs(sum(p)-1)10e-10)

error(概率之和不为1);%概率之和与1差的绝对值大于10的负10次方

end

n=length(p);%数组中元素的个数,循环操作用

q=p;%信源的概率赋给q,以便后面排序、合并用

m=zeros(n-1,n);%定义m为零数组,记录排列顺序(小概率求和后再重新排列,这就存在排序的问题)

fori=1:n-1

[q,k]=sort(q);%k是排列后的顺序,sort(q)是对q进行升序

m(i,:)=[k(1:n-i+1),zeros(1,i-1)];%概率小的相加之后重新排序,排列顺序记录在m矩阵中

q=[q(1)+q(2),q(3:n),1];%最后两个概率小的合并成一个

end

fori=1:n-1

c(i,:)=blanks(n*n);%blanks(n*n)是一个1行n*n列的数组,里面是空的

end

c(n-1,n)=0;%把c这个空数组的(n-1,n)这个位置赋值0

c(n-1,2*n)=1;%把c这个空数组的(n-1,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

end

fori=1:n

h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);%h是Huffman编码

ll(i)=length(find(abs(h(i,:))~=32));%ll为各码的码长

end

la=sum(p.*ll);%la是平均码长

H=sum(-p.*log2(p));%H是信息熵

RW=H/la;%RW是编码效率

fori=1:n%显示概率及Huffman编码

fprintf(概率:%g 编码 :%s\n,p(i),h(i,:))

end

fprintf(平均码长为:%g\n,la)%显示平均码长

fprintf(编码效率为:%g\n,RW)%显示编码效率

%例1:p=[0.2,0.3,0.4,0.06,0.04];

%例2:p=[0.18,0.17,0.01,0.15,0.2,0.19,0.1];

五.程序运行结果(列举2-3个)

输入信源X的分布,格式[p1p2…pm]:

[0.2,0.3,0.4,0.06,0.04]

概率:0.2 编码 :111

概率:0.3 编码 :10

概率:0.4 编码 :0

概率:0.06 编码 :1101

概率:0.04 编码 :1100

平均码长为:2

编码效率为:0.971767

输入信源X的分布,格式[p1p2…pm]:

[0.18,0.17,0.01,0.15,0.2,0.19,

文档评论(0)

181****7662 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档