Matlab Shannon编码

简述:

香农编码是是采用信源符号的累计概率分布函数来分配字码的。香农编码是根据香农第一定理直接得出的,指出了平均码长与信息之间的关系,同时也指出了可以通过编码使平均码长达到极限值。香农第一定理是将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。香农编码属于不等长编码,通常将经常出现的消息变成短码,不经常出现的消息编成长码,从而提高通信效率。 香农编码严格意义上来说不是最佳码,它是采用信源符号的累计概率分布函数来分配码字。

实验需求如下:

输入:信源符号个数q ,每个信源符号的概率分布P从键盘输入
输出:每个信源符号对应的Shannon 编码的码字

在这里插入图片描述

以下采用matlab实现:

close;clear;clc
%% 数据输入
i = 1;
strTemp = ['请输入第',num2str(i),'个概率(0退出):'];
p = [];
p(i)  = input(strTemp);
while(p(end))
    i = i+1;
    strTemp = ['请输入第',num2str(i),'个概率(0退出):'];
    temp = input(strTemp);
    p = [p temp];
end
eps = 1e-5;
if(sum(p)>1.0+eps || sum(p)<1.0-eps)
    error('概率和不等于1');
end

%% 初始化
n = length(p)-1; %由于最后一个数字为0
F = zeros(1,n);
logp = zeros(1,n);
L = zeros(1,n);
for i = 2:n
    F(i) = F(i-1)+p(i-1);
    logp(i-1) = -log2(p(i-1));
    L(i-1) = ceil(logp(i-1));
end
logp(n) = -log2(p(n));
L(n) = ceil(logp(n));
 %% 编码过程
for i = 1:n
    temp1 = L(i);
    temp2 = [];
    temp3 = F(i);
    while(temp1)
        temp4 = fix(2*temp3);
        temp3 = 2*temp3 - temp4;
        temp2 = [temp2  num2str(temp4)];
        temp1 = temp1 - 1;
    end
    fprintf('第%d个的香农编码为:%s\n',i,temp2);
end

运行结果:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值