使用说明:输入序列,然后对此序列进行多元(默认是二元)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