Matlab-香农编码

信息论实验课第一个作业,是用matlab实现香农编码。拼拼凑凑删删改改做出了一个,但是还不是很理想,数组不知道怎么转换为字符串拼接起来= =。

%香农编码
%output:二进制编码code
%input:信源分布p
function shannon(p)
n = length(p);%信源符号数
p = sort(p,'descend');%降序排列
F = zeros(1,n);%累加概率序列
for i=2:n
    F(i)=F(i-1)+p(i-1);
end
l = zeros(1,n);%码长序列
for i=1:n
    l(i)=ceil(-log2(p(i)));%向上取整
end
disp('最终编码结果:');
for i=1:n
    f = max(l(i));
    w=trans(F(i),f);
    for j=1:l(i)
        code(j)=w(j);
    end
    disp([num2str(p(i)),'->',num2str(code)]);
end

其中十进制转二进制的代码:

(×2取整)

%十进制转换为二进制
function w = trans( F,f )
for i=1:f
    temp=F.*2;
    if(temp<1)
        w(i)=0;
        F=temp;
    else
        F=temp-1;
        w(i)=1;
    end
end

一道老师给的例题:

三、编程实现下列习题:

对于离散无记忆信源

进行二进制编码。

主程序及运行结果:

 

>> p=[0.20 0.19 0.18 0.17 0.15 0.10 0.01]

p =

    0.2000    0.1900    0.1800    0.1700    0.1500    0.1000    0.0100

>> shannon(p)
最终编码结果:
0.2->0  0  0
0.19->0  0  1
0.18->0  1  1
0.17->1  0  0
0.15->1  0  1
0.1->1  1  1  0
0.01->1  1  1  1  1  1  0

对= =最后编码结果死活转不成拼接好的字符串就很无语。

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值