美文网首页
香农编码

香农编码

作者: 幻影翔 | 来源:发表于2018-05-30 15:01 被阅读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

    相关文章

      网友评论

          本文标题:香农编码

          本文链接:https://www.haomeiwen.com/subject/ytatsftx.html