信道编码Huffman编码信息论与编码

信道编码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)');
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值