(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章