信息论与编码|香农编码的Matlab实现

1. 香农编码原理

(1)将信源消息符号按其出现的概率大小依次降序排列为:

\LARGE \mathop p\nolimits_1 \ge \mathop p\nolimits_2 \ge \mathop p\nolimits_3 \ge \cdots \ge \mathop p\nolimits_n \

(2)对概率向上取整求整数码长K

\LARGE \mathop K\nolimits_i = \left\lceil { - \mathop {\log }\nolimits_2 \mathop p\nolimits_i } \right\rceil \

(3)为了编成唯一可译码,计算第i个消息的累加概率P

\LARGE \mathop P\nolimits_i = \sum\limits_{k = 1}^{i - 1} {p\left( {\mathop a\nolimits_k } \right)} \

(4)将累加概率转换成二进制数

(5)取P二进制的小数点后K位,即为该消息符号的二进制码字


 2. 代码

【说明:这里需要自创函数shannon和trans,然后调用。需要了解Matlab函数创建和调用方法哦~】

(1)主函数

p = input('请输入离散信源概率分布:\n');
shannon(p)

(2)子函数shannon【用于编码】

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

(3)子函数trans【用于十进制转二进制】

%十进制转换为二进制
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

3. 案例展示

 

 

猜你喜欢

转载自blog.csdn.net/zzztutu/article/details/128105690