使用說明:輸入序列,然後對此序列進行多元(默認是二元)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