Huffman编码原理:
(1)将信源符号按概率从大到小的顺序排列,令
P(x1)≥P(x2) ≥ P(x3) ≥ P(x4) ≥ P(x5) ≥ P(x6) ≥…≥ P(xn)
(2)给两个概率最小的信源符号xn-1 和xn各分配一个码位“0”和“1”,将这两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结果得到一个只包含n-1个信源符号的新信源。称为信源的第一次缩减信源,用S1表示。
(3)将新信源的符号仍按照概率从大到小的顺序排列,重复步骤(2),得到一个只包含n-2个信源符号的缩减信源,用S2表示。
(4)重复上述步骤,直至缩减的信源只包含两个符号为止,此时所剩的两个符号的概率之和必为1。然后从最后一级缩减信源开始,依编码路径向前返回,就得到信源符号所对应的码字。
在matlab中,可以采用huffmandict函数直接编码,实例如下;
%% Hufman encode
% 二元霍夫曼编码
% Writer:Miracle
clear;
clc;
%% 输入矩阵
while(1)
p=input('请输入概率矩阵(1*n):');
if (sum(p<0)+sum(p>1)+sum(abs(p)))>1 % 判断矩阵所有元素在[0,1]之间且和为1
disp('重新输入');
else
n=length(p);
break;
end
end
%% 霍夫曼编码
symbols = 1:n;
dict = huffmandict(symbols,p);
H_p=sum(p.*log2(1./p)); % 熵的计算
average_code=0; % 平均码长重置
for i=1:n
average_code=p(i)*length(dict{i,2})+average_code;
dict(i,3)=num2cell(p(i));
end
efficiency = H_p/average_code; % 编码效率
%% 显示
disp(["序号","编码","概率"]);
disp(dict);
disp(['编码效率为',num2str(efficiency)]);