香农编码

2018-05-30  本文已影响58人  幻影翔

主代码a12

clear;clc
L=input('输入信源的个数数组L=')
disp(L);
P=input('输入信源的概率分布数组P=');
disp(P);
if sum(P)~=1 ||  length(P)~=length(L)
  display('输入概率不符合概率分布')
  P=input('重新输入一个数组:');
  display(P);
end
%y=fliplr(sort(p)); %从大到小排列  fliplr反转
y=sort(P,'descend');
display('符号概率从大到小排列后为');
display(y);
%计算信号源的信息熵
s = [];
mlength = [];
for i=1:length(y)
    s(i)=log2(1/y(i));     %求自信息熵
    mlength(i)=ceil(s(i));  %进位取整
end
display('各符号的信息熵为:');
display(s);
display('各符号的码长为:');
display(mlength);
%计算累加概率
leisum=zeros(1,length(y));
display('概率累加后为');
leisum(1) = 0;
for i = 2:length(y)
    leisum(i)=y(i-1)+leisum(i-1);
end
display(leisum);
%将累加概率转成二进制数\
display('累加概率转成二进制数');
for i=1:length(leisum)
    display((DEC2bin(leisum(i),mlength(i))));
end
%编码的平均长度和编码效率
k=0;
H = 0;
for i = 1:length(y)
k=k+P(i)*L(i);
H=H+P(i)*log2(1/P(i));
end
display('码字平均长度为')
disp(k);
display('编码效率R');
R=H/k;
display(R);

使用函数

function  y  = DEC2bin(innum,N)
%对小于的的正数进行二进制编码%   
y =zeros(1,N);
for i = 1:N  
    innum = innum * 2;
     y(i)= floor(innum);
    innum = innum-floor(innum);
end
上一篇下一篇

猜你喜欢

热点阅读