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、问题背景: 1949年香农在《有噪声时的通信》一文中提出了信道容量的概念和信道编码定理,为信道编码奠定了理论基础。无噪信道编码定理(又称香农第一定理)指出,码字的平均长度只能大于或等于信源的熵。有噪信道编码定理(又称香农第二定理)则是编码存在定理。它指出只要信息传输速率小于信道容量,就存在一类编码,使信息传输的错误概率可以任意小。随着计算技术和数字通信的发展,纠错编码和密码学得到迅速的发展。 2、课题分析: 运用matlab编写程序求解任给信源符号概率的香农编码。给定一组信源符号概率,通过所编写的程序对信源符号概率编码,求出此信源符号概率对应的香农编码。 3、编程方法: 据课本上的介绍编码香农码的方法。 首先,给定信源符号概率,要先判断信源符号概率是否满足概率分布,即各概率之和是否为1,如果不为1就没有继续进行编码的必要,虽然任可以正常编码,但编码失去了意义。 其次,对信源符号概率进行从小到大的排序,以便进行下一步。从第一步就知道信源符号的个数n,于是构造一个nx4的零矩阵D,以便储存接下来运算的结果。把排好序的信源符号概率以列的形式赋给D的第一列。 再次,做编码的第二步,求信源符号概率的累加概率(方法见程序),用来编写码字。 接着求各信源符号概率对应的自信息量,用于求解码长k。 然后,我们对刚求的自信息量对无穷方向取最小正整数,得到的最小正整数就是该信源符号所对应编码的码长k,有了码长,接下来就可以求解码字。 最后,对所求到的累加概率求其二进制,取其小数点后的数,所取位数由该信源符号对应的码长决定,所用的步骤结束,依次得到各信源符号的香农编码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值