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

對= =最後編碼結果死活轉不成拼接好的字符串就很無語。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章