Huffman编码

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)]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值