实验课程

THIS NAME

实验课程

当前位置: 首页 >> 实验课程 >> 正文

信息论与编码-香农编码的Matlab仿真实现

发布日期:2024-08-19    作者:孙守英     来源:     点击:

一、实验目的

1、了解香农编码的基本原理及其特点;

2、熟悉掌握香农编码的方法和步骤;

3、掌握Matlab编写香农编码的程序。

二、实验内容

1、写出香农编码的Matlab程序;

2、将程序在计算机上仿真实现,验证程序的正确性并完成仿真。

三、实验原理及说明

给定某个信源符号的概率分布如下,通过以下的步骤进行香农编码:

28775

1、信源符号按概率从大到小排列。

2、对信源符号求累加概率,表达式:Gi=Gi-1+p(xi)

3、求自信息量,确定码字长度。自信息量I(xi)=-log(p(xi));码字长度取大于等于自信息量的最小整数。

4、将累加概率用二进制表示,并取小数点后码字的长度的码。

四、实验设备

1、计算机

2、软件:Matlab

五、实验方法

实验仿真程序如下:

1.主程序

pa=input('请输入信源分布:')

k=length(pa);       %计算信源符号个数

if min(pa)<0||max(pa)>1    %判断信源概率值是否介于01之间

   disp('概率值必须介于01之间,请重新输入信源分布');

   return

elseif sum(pa)~=1     %判断信源累加和是否为1

   disp('概率累加和必须等于1,请重新输入信源分布');

   return

else

   for i=1:k-1      %for循环进行降序排列

       for n=i+1:k

           if (pa(i)<pa(n))

               t=pa(i);

               pa(i)=pa(n);

               pa(n)=t;    

           end

       end

   end

end

disp('信源分布概率从大到小为:'),disp(pa)

y=0;%y赋初值,用来求概率和

f=0;%f赋初值,用来得到子程序最大循环次数

s=zeros(k,1);   %对求和结果进行矩阵初始化

b=zeros(k,1);   %对编码位数矩阵初始化

w=zeros(k,1);  %对二进制矩阵初始化

for m=1:k;       %进行香农编码

   s(m)=y;

   y=y+pa(m);

   b(m)=ceil(-log2(pa(m)));%求得的自信息量向上取整,得到码字长度

   z=zeros(b(m),1);    %对码字矩阵初始化

   x=s(m);

   f=max(b(m));   %把码字最大长度赋给f,用于进行十进制转二进制

   w=dtob(x,f);    %调用子程序将十进制转换为二进制

   for r=1:b(m)

       z(r)=w(r);

   end

  disp('输出结果为:');

  disp('初始概率'),disp(pa(m))

  disp('求和结果'),disp(s(m))

  disp('编码位数'),disp(b(m))

  disp('最终编码'),disp(z')

end

sum0=0;

sum1=0;

for i=1:k       %使用for循环进行信息熵、平均码长求解

   a(i)=-log2(pa(i));  %a(i)表示单个信源的自信息量

   K(i)=ceil(a(i));   %K(i)表示对自信息量向上取整

   R(i)=pa(i)*K(i);

   sum0=sum0+R(i);  %求平均码长

   c(i)=a(i)*pa(i);

   sum1=sum1+c(i);  %信息熵

end

K1=sum0;

H=sum1;

Y=H/K1;   %Y来表示编码效率

disp(['信息熵H(X)=',num2str(H),'(bit/sign)']);

disp(['平均码长K=',num2str(K1),'(bit/sign)']);

disp(['编码效率=',num2str(Y)]);      

2.调用子程序:

 function y=dtob(x,f)

for i=1:f

   temp=x.*2;

   if(temp<1)

       y(i)=0;

       x=temp;

   else

       x=temp-1;

       y(i)=1;

   end

end

仿真结果如下:

请输入信源分布:[0.1 0.2 0.3 0.4]

信源分布概率从大到小为:

   0.4000    0.3000    0.2000    0.1000

输出结果为:

初始概率

   0.4000

求和结果

    0

编码位数

    2

最终编码

    0     0

输出结果为:

初始概率

   0.3000

求和结果

   0.4000

编码位数

    2

最终编码

    0     1

输出结果为:

初始概率

   0.2000

求和结果

   0.7000

编码位数

    3

最终编码

    1     0     1

输出结果为:

初始概率

   0.1000

求和结果

   0.9000

编码位数

    4

最终编码

    1     1     1     0

信息熵H(X)=1.8464(bit/sign)

平均码长K=2.4(bit/sign)

编码效率=0.76935

上一条:信息论与编码-Huffman编码的仿真与实现 下一条:信息论与编码-AWGN波形信道容量的计算实验

关闭