(matlab)对某一序列进行Huffman编码

使用说明:输入序列,然后对此序列进行多元(默认是二元)Huffman编码

@author Boychenney

@version 2011年12年30日

Contents

参数说明

@param Pj_i 转换概率矩阵

@param Pi 初始输入概率分布向量,一定要求是列向量

*@param level 默认为2,即进行二元Huffman编码

@return comp 编码后的码字

*如果要多个输出,则第二个是字典(dict),第三个输出是信源熵(entropy),第四个是相应的编码信息(str)

function [comp,varargout]=huffEncode(seq,p,level) 
%默认进行二元Huffman编码 
if nargin < 3 
 level=2; 
end 

 

%计算比例log2(r) 
a=log2(level); 

 

%获得长度 
len=length(p); 

 

%给符号编号,从1开始到len 
symbols=1:len; 

 

%调用huffmandict函数生成字典——符号映射成码字 
[dict,avg_len]=huffmandict(symbols,p,level); 

 

%计算熵,在这之前需要处理概率为零的值 
p(p<1e-6)=1; 
entropy=-p*log2(p.'); 

 

%对序列进行编码:huffmanenco 
comp=huffmanenco(seq,dict); 

 

%计算其它参数 
source_len=length(seq); %输入序列长度 
eta = entropy/(avg_len*a); % 理论编码效率:eta=H(x)/(平均码长*log2(r)) 
codeseq_len=length(comp); %编码后序列的长度 
actual_avg_len=codeseq_len/source_len; %实际平均码长=编码后序列长/编码前序列长 
actual_eta= entropy/(actual_avg_len*a); %实际编码效率=H(x)/(实际平均码长*log2(r)); 

 

%生成信息 
str = sprintf('编码信息:\n 信息源熵:%8.4f bit/符号;输入的序列长度:%d\n 理论平均长度:%8.4f;实际平均长度:%8.4f\n 理论编码效率:%8.4f%%;实际编码效率:%8.4f%% ',... 
 entropy,source_len,avg_len,actual_avg_len,eta*100,actual_eta*100); 
 %决定输出 
 if nargout>1 
 varargout{1}=dict; 
 end 
 if nargout>2 
 varargout{2}=entropy; 
 end 
 if nargout>3 
 varargout{3}=str; 
 end 

 

【代码示例】 

p=[0.2,0.19,0.18,0.17,0.15,0.1,0.01];%信源有7个符号,且概率分布为p

slen=1000;

seq=randsrc(1,slen,[1:7;p]);%生成1000个由1~7组成的随机序列

[comp,dict,entropy,str]=huffEncode(seq,p);%对序列进行huffman编码

disp('---待编码信源符号及概率分布---');

table=[1:7;p];

disp(table);

disp('-----二元编码---=');

disp(str);%显示二元Huffman编码效果

[comp2,dict2,entropy2,str2]=huffEncode(seq,p,3);

disp('-----三元编码---=');

disp(str2);%显示三元Huffman编码效果

【结果】 
---待编码信源符号及概率分布--- 
 Columns 1 through 6 

 

 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 
 0.2000 0.1900 0.1800 0.1700 0.1500 0.1000 

 

 Column 7 

 

 7.0000 
 0.0100 

 

-----二元编码---= 
编码信息: 
 信息源熵: 2.6087 bit/符号;输入的序列长度:1000 
 理论平均长度: 2.7200;实际平均长度: 2.7440 
 理论编码效率: 95.9075%;实际编码效率: 95.0686% 
-----三元编码---= 
编码信息: 
 信息源熵: 2.6087 bit/符号;输入的序列长度:1000 
 理论平均长度: 1.8000;实际平均长度: 1.7980 
 理论编码效率: 91.4386%;实际编码效率: 91.5404% 


Published with MATLAB® 7.11

你可能感兴趣的:(Huffman)