(matlab)あるシーケンスをHuffman符号化する
5425 ワード
使用方法:シーケンスを入力し、このシーケンスを多重(デフォルトは2元)Huffman符号化します.
@author Boychenney
@version 2011年12年30日
パラメータ説明
@param Pj_i変換確率行列
@param Pi初期入力確率分布ベクトル、必ずカラムベクトル
*@param levelのデフォルトは2です.つまり、二元Huffman符号化を行います.
@return comp符号化後のコードワード
*複数の出力が必要な場合、2番目は辞書(dict)、3番目はソースエントロピー(entropy)、4番目は対応する符号化情報(str)
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]);%1~7からなるランダムシーケンスを1000個生成
[comp,dict,entropy,str]=huffEncode(seq,p);%シーケンスをhuffman符号化する
disp('−−符号化されるソースシンボルおよび確率分布−');
table=[1:7;p];
disp(table);
disp('-----二元符号化---=');
disp(str);%二元ハフマン符号化効果を表示
[comp2,dict2,entropy2,str2]=huffEncode(seq,p,3);
disp('-----三元符号化---=');
disp(str2);%三元ハフマン符号化効果を表示
Published with MATLAB® 7.11
@author Boychenney
@version 2011年12年30日
Contents
パラメータの説明
@param Pj_i変換確率行列
@param Pi初期入力確率分布ベクトル、必ずカラムベクトル
*@param levelのデフォルトは2です.つまり、二元Huffman符号化を行います.
@return comp符号化後のコードワード
*複数の出力が必要な場合、2番目は辞書(dict)、3番目はソースエントロピー(entropy)、4番目は対応する符号化情報(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(' :
:%8.4f bit/ ; :%d
:%8.4f; :%8.4f
:%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]);%1~7からなるランダムシーケンスを1000個生成
[comp,dict,entropy,str]=huffEncode(seq,p);%シーケンスをhuffman符号化する
disp('−−符号化されるソースシンボルおよび確率分布−');
table=[1:7;p];
disp(table);
disp('-----二元符号化---=');
disp(str);%二元ハフマン符号化効果を表示
[comp2,dict2,entropy2,str2]=huffEncode(seq,p,3);
disp('-----三元符号化---=');
disp(str2);%三元ハフマン符号化効果を表示
【 】
--- ---
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