Informationstheorie und Codierung | Matlab-Implementierung der Shannon-Codierung

1. Shannon-Codierungsprinzip

(1) Ordnen Sie die Quellnachrichtensymbole in absteigender Reihenfolge entsprechend ihrer Auftrittswahrscheinlichkeit wie folgt an:

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

(2) Runden Sie die Wahrscheinlichkeit auf, um die ganzzahlige Codelänge K zu ermitteln

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

(3) Um eine eindeutige dekodierbare Nachricht zusammenzustellen, berechnen Sie die kumulative Wahrscheinlichkeit P der i-ten Nachricht

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

(4) Wandeln Sie die akkumulierte Wahrscheinlichkeit in eine Binärzahl um

(5) Nehmen Sie die K-Stellen nach dem Dezimalpunkt des P-Binärsystems, das das binäre Codewort des Nachrichtensymbols ist.


 2. Code

[Hinweis: Hier müssen Sie Ihre eigenen Funktionen shannon und trans erstellen und diese dann aufrufen. Sie müssen wissen, wie man Matlab-Funktionen erstellt und aufruft~]

(1) Hauptfunktion

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

(2) Unterfunktion Shannon [zur Kodierung verwendet]

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) Unterfunktion trans [wird verwendet, um Dezimalzahlen in Binärzahlen umzuwandeln]

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

 

 

 

Supongo que te gusta

Origin blog.csdn.net/zzztutu/article/details/128105690
Recomendado
Clasificación