Advertisement

信道编码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)');

全部评论 (0)

还没有任何评论哟~