信道编码Huffman编码信息论与编码
MATLAB做的信息论与编码的实验一小部分
结果编码是数字数组,还可计算平均码长,编码效率,编码后信息传输速率
话不多说,直接代码
function [W,L,q,r]=huffman(P)
%哈夫曼编码
n=length(P);
p=P;
mark=zeros(n-1,n);
for i=1:n-1
[p,num]=sort(p);
mark(i,:)=[num(1:n-i+1),zeros(1,i-1)];
p=[p(1)+p(2),p(3:n),1];
end
for i=1:n-1
table(i,:)=blanks(n*n);
end
table(n-1,n)='1';
table(n-1,2*n)='0';
for i=2:n-1
table(n-i,1:n-1)=table(n-i+1,n*(find(mark(n-i+1,:)==1))-(n-2):n*(find(mark(n-i+1,:)==1)));
table(n-i,n)='1';
table(n-i,n+1:2*n-1)=table(n-i,1:n-1);
table(n-i,2*n)='0';
for j=1:i-1
table(n-i,(j+1)*n+1:(j+2)*n)=table(n-i+1,n*(find(mark(n-i+1,:)==j+1)-1)+1:n*find(mark(n-i+1,:)==j+1));
end
end
for i=1:n
W(i,1:n)=table(1,n*(find(mark(1,:)==i)-1)+1:find(mark(1,:)==i)*n);
l(i)=length(find(abs(W(i,:))~=32));
end
L=sum(P.*l);
sum1=0;
for i=1:n %使用for循环进行信息熵、平均码长求解
a(i)=-log2(P(i)); %a(i)表示单个信源的自信息量
K(i)=ceil(a(i)); %K(i)表示对自信息量向上取整
c(i)=a(i)*P(i);
sum1=sum1+c(i); %信息熵
end
H=sum1;
r=H/L;
q=H/L;
[m,n]=size(W);
W=reshape(W',1,m*n);
W=double(W)-double('0')
W(find(W==-16))=[];
s1 = 'Huffman 编码所得码字 W:';
s2=' Huffman 编码的平均码字长度L:';
s3=' Huffman 编码的编码效率 Q:';
s4='Huffman 编码后信息传输速率 R:';
disp(s1),disp(W);
disp(s2),disp(L);
disp(s3),disp(q);
disp(s4),disp(r);
上面是哈夫曼的编码函数,在主程序里面,直接调用就行
[w,l,q,r]=huffman(S);%w为编码,L为平均长度,q为编码效率,r编码后信息传输速率
最后显示一下结果
用到的离散无记忆信源S=[0.4,0.2,0.2,0.1,0.1];%离散无记忆信源
Huffman 编码所得码字 W:
1 0 0 0 0 1 0 0 1 1 0 0 1 0
Huffman 编码的平均码字长度L:
2.2000
Huffman 编码的编码效率 Q:
0.9645
Huffman 编码后信息传输速率 R:
0.9645
我没写单位,要加的话在函数中每一行disp后面再加一个disp就行
算了,我加上吧
disp(s1),disp(W);
disp(s2),disp(L,'(bit/sign)');
disp(s3),disp(q);
disp(s4),disp(r,'(bit/CodeSign)');