基于MATLAB的霍夫曼编码仿真 - 图文

2026/1/25 18:39:04

河南大学民生学院本科毕业论文

(3)将缩减信源s1的符号仍按概率从大到小顺序排列,重复步骤二,得到只含(n-2)个符号的缩减信源s2。

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

4.2 多元霍夫曼编码规则

由二进制霍夫曼编码的方法很容易推广到r进制的情况,只是编码的过程中构成缩减信源时,每次都是将r个概率最小的信源符号合并,然后分别用码符号 0,1,...,(r-1)表示。

为了充分利用短码,使霍夫曼码的平均码长最短,必须使最后一个缩减信源恰好有r个信源符号,因此对于r元霍夫曼码,信源S符号个数q必须满足

q?(r?1)??r

其中?表示信源缩减次数。如果不满足上式,则可以在最后增补一些概率为零的信源符号,因此上式又可以写成

q?i?(r?1)??r

i为增加的信源符号数,并且是满足上式的最小正整数或0。这样处理后得到的r元霍夫曼码可充分利用短码,一定是紧致码。

4.3 扩展信源霍夫曼编码

对离散无记忆信源的N次扩展信源进行编码便得到N次扩展码。

采用霍夫曼编码法能够使码的平均长度最短,信息的冗余量最小。然而这种编码方法所形成的码字很不规整,这样不利于硬件的译码。在很多处理机中,我们采用一种新的折中的方法,称为扩展编码法。这种方法是由定长编码与霍夫曼编码法相结合形成的。有等长扩展法和不等长扩展编码方法,为了便于实现分级译码,我们一般采用等长扩展编码法,当然,也可以根据具体需要采用每次扩展位数不等的不等长扩展法。

5 MATLAB性能仿真

Problem 1:

对信源S编码,其中

8

河南大学民生学院本科毕业论文

p(s1)?0.4,p(s2)?0.2,p(s3)?0.2,p(s4)?0.1,p(s5)?0.1;

现对该离散无记忆平稳信源进行霍夫曼编码。 对应霍夫曼编码求熵仿真如下: function h=entropy(p)

%H=ENTROPY(P) returns the entropy function of %the probability vector p. p=[0.4,0.2,0.2,0.1,0.1], if length(find(p<0))~=0,

error('Not a prob. vector, negative component(s)') end

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

error('Not a prob. vector, components do not add up to 1') end

h=sum(-p.*log2(p)); 程序运行结果显示: p =

0.4000 0.2000 0.2000 0.1000 0.1000 ans = 2.1219

5.1 二元霍夫曼编码仿真

(1) 对problem 1进行二元霍夫曼编码程序如下: function [h,l]=huffmancode(P) P=input('输入概率:'); n=length(P); for i=1:n-1

for j=i+1:n

if P(i)<=P(j) p=P(i); P(i)=P(j); P(j)=p; end end end

disp('概率分布'); Q=P;

m=zeros(n-1,n); for i=1:n-1

[Q,b]=sort(Q);%sort函数是对Q进行升序排列,返回值l显示排序后位置的变动信息

9

河南大学民生学院本科毕业论文

m(i,:)=[b(1:n-i+1),zeros(1,i-1)]; Q=[Q(1)+Q(2),Q(3:n),1]; end

for i=1:n-1

c(i,:)=blanks(n*n);%blanks是空格函数 end

% 以下计算各个元素码字 c(n-1,n)='1'; c(n-1,2*n)='0'; for i=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)='1';

c(n-i,n+1:2*n-1)=c(n-i,1:n-1); c(n-i,2*n)='0'; for j=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

for i=1:n

h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n); ll(i)=length(find(abs(h(i,:))~=32));%码长 end

l=sum(P.*ll);%平均码长 h1=-log2(P);%自信息量 H=P*(h1');%熵 H

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

disp('编码效率') G=H/l

disp('二元霍夫曼编码') (2)运行结果为:

输入概率:[0.4,0.2,0.2,0.1,0.1] 概率分布 H =

2.1219

二元霍夫曼编码平均码长 l =

2.2000 编码效率

10

河南大学民生学院本科毕业论文

G =

0.9645

二元霍夫曼编码 ans = 1 000 01 0011 0010

5.2 三元霍夫曼编码仿真

(1)对problem 1进行三元霍夫曼编码程序如下: function [h,l]=huffman(p);

%HUFFMAN Huffman code generator

% [h,l]=huffman(p), Huffman code generator % returns h the Huffman code matrix, and l the % average codeword length for a source with % probability vector p. S=input('输入概率:'); n=length(S); for i=1:n-1

for j=i+1:n

if S(i)<=S(j) s=S(i); S(i)=S(j); S(j)=s; end end end

disp('概率分布'); S p=S;

N=length(p); r=3;

q=[p(1:N),zeros(1,ceil((N-r)/(r-1))*(r-1)+r-N)];

n=length(q);

A=(n-r)/(r-1)+1; m=zeros(A,n); for i=1:A

[q,l]=sort(q);

m(i,:)=[l(1:n-2*(i-1)),zeros(1,2*(i-1))];

11


基于MATLAB的霍夫曼编码仿真 - 图文.doc 将本文的Word文档下载到电脑
搜索更多关于: 基于MATLAB的霍夫曼编码仿真 - 图文 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219