情報理論とコーディング | シャノンコーディングの 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) 累積確率を2進数に変換する

(5) P 2 進法の小数点以下の K 桁を取得します。これは、メッセージ シンボルの 2 進コード ワードです。


 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 [10 進数を 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

3. 事例紹介

 

 

 

おすすめ

転載: blog.csdn.net/zzztutu/article/details/128105690