MATLAB实现香农-范诺编码

clear all;
str = ['d', 'a', 'c', 'b', 'b', 'c', 'b', 'b', 'd', 'e'];
%统计字符串中的字符种类,调用函数,放入数组b中
string = unique(str); 
%统计每种字符的个数,放入数组a中
for i = 1 : length(string)
    num(i) = length(strfind(str, string(i)));
end
%排序,若数组b中的第一个元素为字符‘a’, 则数组a中的第一个元素为字符‘a’出现的次数
for i = 1 : length(num)-1
    for j = i+1 : length(num)
        if num(i) < num(j)
            t1 = num(i); num(i) = num(j); num(j) = t1;
            t2 = string(i); string(i) = string(j); string(j) = t2;
        end
    end
end
string
num
H = 0; %熵
%统计每种字符出现的频率,放入数组P中
for i = 1 : length(num)
    P(i) = num(i) / sum(num);
    H = H + P(i) * log2( 1/P(i) );
end
P
%计算码字长度 Ni
N = [ ];
for i = 1 : length(P)
    cnt = 1;
    while true
        if P(i)/2 <= power(2,-1*cnt) && power(2,-1*cnt) <= P(i)
            break;
        end
        cnt = cnt + 1;
    end
    N = [N, cnt];
end
N
%计算累加概率 Ai
A = 0;
for i = 2 : length(string)
    A(i) = A(i-1) + P(i-1);
end
A
L = 0; %平均码长
%转换为二进制
for i = 1 : length(A)
    tmp = A(i);
    code = [];
    for j = 1 : N(i) %每个字符的编码长度 = Ni
        if tmp >= power(2, -1*j) 
            tmp = tmp - power(2, -1*j);
            code = [code '1'];
        else
            code = [code '0'];
        end
    end
    fprintf("%c:%s\n", string(i), code);
    L = L + P(i) * length(code);
end
fprintf("平均码长 L = %f\n", L);
fprintf("图像熵 H = %f\n", H);
fprintf("编码效率η = %f\n", H/L);


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值