主代码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
网友评论