信息论与编码实验报告

中南大

(信息论与编码实验报告)

姓    名:xxxxx  

   学    号: xxxxxxxx  

   专    业:电子信息工程  

   班    级:电子信息xxxx班   

指导老师:     xx       

实验一关于信源熵的实验

一、实验目的

1.   掌握离散信源熵的原理和计算方法。

2.   熟悉matlab 软件的基本操作,练习使  用matlab 求解信源的信息熵。

3.   自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具

求解图像熵。

4.   掌握Excel的绘图功能,使用Excel绘制散点图、直方图。

二、实验原理

1.   离散信源相关的基本概念、原理和计算公式

产生离散信息的信源称为离散信源。离散信源只能产生有限种符号。

随机事件的自信息量I(xi)为其对应的随机变量xi 出现概率对数的负值。

即: I (xi )= -log2p ( xi)

随机事件X 的平均不确定度(信源熵)H(X)为离散随机变量 xi 出现概

率的数学期望,即:

?  

2.二元信源的信息熵

设信源符号集X={0,1} ,每个符号发生的概率分别为p(0)= p,p(1)= q,

p+ q =1,即信源的概率空间为 :

?               

则该二元信源的信源熵为:

H( X)  = - plogp–qlogq  = - plogp –(1 - p)log(1- p) 

即:H (p) = - plogp –(1 - p)log(1- p)    其中 0 ≤ p  ≤1

3.   MATLAB二维绘图

用matlab 中的命令plot( x ,  y) 就可以自动绘制出二维图来。

例1-2,在matlab 上绘制余弦曲线图,y  = cos x ,其中 0 ≤ x  ≤ 2?。

>>x =0:0.1:2*pi; %生成横坐标向量,使其为 0,0.1,0.2,…,6.2

>>y =cos(x );  %计算余弦向量

>>plot(x ,y )   %绘制图形

4.   MATLAB求解离散信源熵

求解信息熵过程:

1) 输入一个离散信源,并检查该信源是否是完备集。

2) 去除信源中符号分布概率为零的元素。

3) 根据平均信息量公式,求出离散信源的熵。

5.   图像熵的相关知识

图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。图像的

一维熵表示图像中灰度分布的聚集特征所包含的信息量,令Pi 表示图像中灰度

值为i 的像素所占的比例,则定义灰度图像的一元灰度熵为:

图像熵计算过程:

1) 输入一幅图像,并将其转换成灰度图像。

2) 统计出图像中每个灰度阶象素概率。

3) 计算出一幅图像的一维熵。

6.   Excel的绘图功能

比如:用Excel或制作二元熵函数曲线。具体步骤如下:

1)启动Excel应用程序。

2)准备一组数据 p。在 Excel的一个工作表的 A 列(或其它列)输入一组 p ,

取步长为0.01 ,从0 至100 产生101 个p(利用Excel填充功能)。

3)使用 Excel的计算功能,在 B 列中用二元熵函数计算公式,求得 A 列中

各数值对应的二元熵值。比如:在单元格B2中输入公式:

=-A2*LOG(A2,2)-(1-A2)*LOG(1-A2,2)

4)使用Excel的图表向导,图表类型选“XY散点图”,子图表类型选“无

数据点平滑散点图”,绘制二元熵函数散点图。

三、实验内容

1、使用matlab 软件绘制二元信源熵函数曲线,并说明其物理意义。

2、使用 matlab 软件求解离散单符号信源熵,请自己构造两个信源空间,根

据求解结果说明其物理意义。

3、使用 matlab 软件计算图像一维图像熵,请自己选择任意两幅图像,根据

求解结果说明其物理意义。

4、使用Excel软件,绘制二元信源熵函数曲线的散点图。

5、使用Excel软件,绘制(3)中两幅图像的灰度直方图(0 到255 各灰度

占图像像素的比例值,使用柱状图绘制其比列分布)。

四、程序设计与算法描述

(1)绘制二元信源熵函数曲线

实验代码:

clc;

p=0.00001:0.001:1;

H=-(p).*log2(p)-(1-p).*log2(1-p);

plot(p,H);

实验结果如下:

物理意义:(1)信源熵为信源的平均不确定性,而概率的大小决定了信息量的大小。     

(2)由上图可知概率为1时,信息量最小,不确定性最低;概率等于0.5时熵最大。

(2)求解离散单符号信源熵

程序代码:

(1)clc;

X=[1 2 3 4 5 6]

P=[1/6 1/6 1/6 1/6 1/6 1/6]

H=6*(-(1/6)*log(1/6))

(2)clc;

X=[0 1 2 3 4 5 6 7 8 9]

P=[0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1]

H=10*(-0.1)*log(0.1)

实验结果如下所示:

图1:

图2:

计算图像一维图像熵

选择的两幅图像如下:

实验代码如下:

(1)clear all;

close all;

fid=fopen('lena.img','r');

image1=fread(fid,[256,256],'uint8');

fclose(fid);

imshow(image1,[]);

[C1 R1]=size(image1);

image1_size=C1*R1;

H1=0;

n=zeros(256,1);

for i=1:C1

    for j=1:R1

        image1_level=image1(i,j)+1;                           

        n(image1_level)=n(image1_level)+1;     

    end

end

for k=1:256

    P(k)=n(k)/image1_size;                    

    if P(k)~=0;                      

    H1=-P(k)*log2(P(k))+H1;                

    end

end

H1

(2)fid=fopen('fing_128.img','r');

image2=fread(fid,[256,256],'uint8');

fclose(fid);

imshow(image2,[]);

[C2 R2]=size(image2);

image2_size=C2*R2;

H2=0;

n=zeros(256,1);

for i=1:C2

    for j=1:R2

        image2_level=image2(i,j)+1;                            

        n(image2_level)=n(image2_level)+1;     

    end

end

for k=1:256

    P(k)=n(k)/image1_size;                    

    if P(k)~=0;                      

    H2=-P(k)*log2(P(k))+H2;                

    end

end

H2

(3)Excel软件,绘制二元信源熵函数曲线的散点图

取步长为0.01 ,从0 至100 产生101 个p

各数值对应的二元熵值。比如:在单元格B2中输入公式:

      =-A2*LOG(A2,2)-(1-A2)*LOG(1-A2,2)

使用Excel的图表向导,图表类型选“XY散点图”,子图表类型选“无

数据点平滑散点图”,绘制二元熵函数散点图。

在Excel中的数据如下:

所绘制图像如下:

(5)用Excel软件,绘制(3)中两幅图像的灰度直方图

实验步骤:先在MATLAB里面计算出(3)中各级灰度值的概率,(3)中的图像都是128*128的,灰度级有256个。

求出各灰度级的相关概率代码如下:

(1) clear all;

close all;

fid=fopen('lena.img','r');

image1=fread(fid,[256,256],'uint8');

fclose(fid);

imshow(image1,[]);

[C1 R1]=size(image1);

image1_size=C1*R1;

H1=0;

n=zeros(256,1);

for i=1:C1

    for j=1:R1

        image1_level=image1(i,j)+1;                           

        n(image1_level)=n(image1_level)+1;     

    end

end

for k=1:256

    P(k)=n(k)/image1_size;                    

    if P(k)~=0;                      

    H1=-P(k)*log2(P(k))+H1;                

    end

end

H1

(2)fid=fopen('fing_128.img','r');

image2=fread(fid,[256,256],'uint8');

fclose(fid);

imshow(image2,[]);

[C2 R2]=size(image2);

image2_size=C2*R2;

H2=0;

n=zeros(256,1);

for i=1:C2

    for j=1:R2

        image2_level=image2(i,j)+1;                           

        n(image2_level)=n(image2_level)+1;     

    end

end

for k=1:256

    P(k)=n(k)/image1_size;                    

    if P(k)~=0;                      

    H2=-P(k)*log2(P(k))+H2;                

    end

end

H2

(1)

(2)

实验结果分析:由图1灰度直方图可以看出,图片1灰度级主要分布在25到145内,而对应其图片可知,图像中灰度值较低的部分占图像中大半部分,灰度值偏中部分占较小部分,暗黑部分和安灰部分出现明显差异,在灰度直方图中表现为出现图片熵值突变的结果,因此统计结果完全正确。

由图2灰度直方图可知,其灰度值分布较均匀,而图像中无明显的暗部和暗灰出现,因此可以得出期统计结果也是正确的。

五、实验心得

通过本次的试验,让我深刻的认识到了信息论与编码在实际生活中的应用的重要性,虽然在实验过程中遇到了许多的问题,但我加深了对信息论与编码这门课知识点的认识,学会了怎么样去计算信源熵,怎样去把它具体实现出来。还有,之前我很少用过Excel,也没用过Excel画图表,经过这次学习后,我基本上掌握了。

在此次实验过程中,让我知道了做实验之前预习是很重要的,通过查找资料可以解决一些我们不能解决的问题的方法。所以我以后要好好预习,学好这门科,只有学好了这门知识,才能够在以后运用好它,发挥出、实现它的有用价值。

五、附录

参考书籍:

《matlab数字图像处理》  20## 机械工业出版社

《数字信号处理》   20## 机械工业出版社

《信息论与编码(第二版)》姜丹编著中国科学技术大学出版社

 

第二篇:信息论与编码课程实验报告

福建农林大学计算机与信息学院

信息工程类

信息论与编码课程实验报告


实验项目列表

实验名称1:信源建模

一、实验目的和要求

(1)进一步熟悉信源建模;

(2)掌握MATLAB程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。

二、实验内容

(1)假设在一个通信过程中主要传递的对象以数字文本的方式呈现。

(2)我们用统计的方式,发现这八个消息分别是由N1,N2,…,N8个符号组成的。在这些消息是中出现了以下符号

(符号1,符号2,…,符号M)

每个符号总共现了

(次数1,次数2,…,次数M)

我们认为,传递对象的信源模型可表示为:X为随机变量(即每次一个字符);取值空间为:(符号1,符号2,…,符号M);其概率分布列为:(次数1/(N1+…+N8),…,次数M/( N1+…+N8))

三、  实验环境

硬件:计算机       软件:MATLAB

四、实验原理

图像和语声是最常用的两类主要信源。要充分描述一幅活动的立体彩色图像,须用一个四元的随机矢量场X(x,y,z,t),其中x,y,z为空间坐标;t为时间坐标;而X是六维矢量,即表示左、右眼的亮度、色度和饱和度。然而通常的黑白电视信号是对平面图像经过线性扫描而形成。这样,上述四元随机矢量场可简化为一个随机过程X(t)。图像信源的最主要客观统计特性是信源的幅度概率分布、自相关函数或功率谱。关于图像信源的幅度概率分布,虽然人们已经作了大量的统计和分析,但尚未得出比较一致的结论。至于图像的自相关函数,实验证明它大体上遵从负指数型分布。其指数的衰减速度完全取决于图像类型与图像的细节结构。实际上,由于信源的信号处理往往是在频域上进行,这时可以通过傅里叶变换将信源的自相关函数转换为功率谱密度。功率谱密度也可以直接测试。

语声信号一般也可以用一个随机过程X(t)来表示。语声信源的统计特性主要有语声的幅度概率分布、自相关函数、语声平均功率谱以及语声共振峰频率分布等。实验结果表明语声的幅度概率分布可用伽玛(γ)分布或拉普拉斯分布来近似。语声信号的自相关函数,根据实验也可以大致认为属于负指数分布类型,且样点间相关性很强,一般高达0.9以上。语声信号的平均功率谱的测试表明,语声主要能量集中在1千赫以下。语声的共振峰频率是语声功率谱的主要峰值。这样的峰值并非一个,而且它的值随音调的变化有一定的变动范围。人们对汉语、英语的共振峰分布已获得一定的测试结果。

五、算法程序

function DMS=Get_DMS_From_Message(storytxt_name)

%storytxt_name:纯文本的文件名,注意这个文件应该与这个程序在同一目录里

Message=textread('The Secret Garden.txt','%c');

MinChar=min(Message);

MaxChar=max(Message);

Message_Len=length(Message);

%assume that the char between MinChar and MaxChar will be use in the
%message.

Char_List=zeros(1,MaxChar-MinChar+1);

for i=1:Message_Len

Char_List(Message(i)-MinChar+1)=Char_List(Message(i)-MinChar+1)+1;
end

Pro_List=Char_List/Message_Len;

NumOfChar=length(Char_List);

%Discrete Memoryless Source

DMS=cell(NumOfChar,2);

for i=1:NumOfChar

DMS{i,1}=char(i+MinChar-1);

DMS{i,2}=Pro_List(i);end

六、实验小结

由分形编码方法的数学原理可知,在编码过程中所得到的迭代函数系统IFS是紧缩的,它的吸引子可以通过对任意初始图像的不断迭代变换而得到。从严格的数学角度来说,需要迭代无数多次才能得到吸引子。但是在实际应用过程中,只需要迭代有限次N后即可收敛,在进行N+1迭代,图像的质量只是轻微的变化。一般情况下,N=8。

实验2:信源编码实验

一、实验目的和要求

(1)进一步熟悉Shannon编码算法;

(2)掌握MATLAB程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。

二、实验内容和原理

(1)输入:信源符号个数q、信源符号s、信源概率分布P;

(2)输出:信源符号与码字的对应关系表(编码表)。

(3)香农编码:

a. 将信源发出的N个消息符号按其概率的递减次序排列

b. 按下式计算第个消息的二进制代码组的码长,并取整

           

c. 计算第个消息的累加概率(为小数)

d. 将累加概率变换成二进制数

e. 去掉小数点,并根据取小数点后的前几位为对应的代码组

三、 实验环境

硬件:计算机       软件:MATLAB

四、  算法描述及实验步骤

1、算法描述:

(1)将q个信源符号按其概率的递减次序排列;

(2)计算出各个信源符号的累加概率;

(3)按下式计算第i个消息的二无代码组的码长li:

  li =log(1/p(si)),其中li 取比结果大(或者等于)的最小整数;

   (4)将累加概率F(si)(十进制小数)变换成二进制小数。根据码长li取小数点后li 个二进制符号作为第i个消息的码字。   

2、算法程序

q= input('输入信源符号个数q=')

p=zeros(1,q);   %程序设计需要信道矩阵初始化为零

fprintf('输入信源概率\n')

for i=1:q

     p(1,i)=input('p=');%输入信源概率

end

p=sort(p,'descend');   %从大到小依次排列信源概率

p    %从大到小依次输出信源概率

f=zeros(1,q);

l=zeros(1,q);

for i=1:q

    for k=1:i-1

        f(i)=f(i)+p(k);

    end

    l(i)=-log2(p(i));

    l(i)=ceil(l(i));

end

for i=1:q

    x=f(i);

    p=zeros(1,l(i));

for t=1:l(i)

    p(t)=floor(x*2);

    x=x*2-p(t);

end

p

end

运行结果:

Code_Book =   

 'e'    '0000'   't'    '0001'   'a'    '0011'          'o'    '0100'            

 'h'    '0101'   'n'    '0110'   's'    '01111'        'r'    '10001'            

 'i'    '10011'  'd'    '10100'  'l'    '10110'       'w'    '101111'          

 'u'    '110000'  'g'   '110010' 'y'    '110011'     'm'    '110100'          

 'f'    '110101'  'c'   '110110'  '.'    '1101111'  'b'    '1110001'         

 'p'    '1110011' 'k'    '1110101' '''    '1110110'   '"'    '1111000'         

  ','    '1111001' 'v'    '11110101''M'   '11110111''I'    '11111000'        

 'T'    '111110011'     'S'    '111110101'         '-'    '111110110'       

 'H'    '1111101111'    'A'    '1111110001'       'W'    '1111110010'      

 '?'    '1111110100'    'q'    '1111110101'       '!'    '1111110110'      

 'B'    '11111101111'   'x'    '11111110000'     'D'    '11111110010'     

 'E'    '11111110100'   'Y'    '11111110101'     'j'    '11111110111'     

 'C'    '11111111000'   'N'    '11111111001'    'P'    '111111110101'    

 'O'    '111111110111'  'L'    '111111111000'    'R'   '111111111001'    

 ';'    '111111111011'  'z'  '1111111111000'   '`'    '1111111111010'   

 'G'    '11111111110111'':' '11111111111001' 'F'    '111111111110100' 

 'J'    '111111111110110'   'V'    '111111111110111' 

 'Q'    '111111111111001'   'U'    '1111111111110100'

 '('    '1111111111110110'  '1'    '1111111111110111'

 ')'    '1111111111111000'  'K'    '1111111111111001'

 '0'    '11111111111110101’ '2'    '11111111111110111'

  '3'    '11111111111111000''4'    '11111111111111001'

  '5'    '11111111111111010''6'    '11111111111111011'

  '7'    '11111111111111100' '8'    '11111111111111101'

  '9'    '11111111111111110'

五、   实验小结:

在实验过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。通过这次实验之后,一定把以前所学过的知识重新温故,第二次实验吸取经验,巩固知识,培养自己分析问题和解决问题的能力,提高编程和动手能力,从而具备解决综合性实际问题的能力,更好地完成教学任务和提升自己的能力。

实验3:连续信源模型与率失真函数

一、        实验目的

(1)理解信息率失真函数的定义与物理意义;

(2)分析离散信源在误码失真下的信息率失真函数表达式;

(3)率失真函数的绘制;

(4)理解相关参数的变化对信源熵及信道容量的影响。

二、        实验内容

(1)绘制率失真函数曲线;

(2)分析曲线特性。

三、        实验原理

二元对称信源的函数

设二元信源,其分布概率,而接收变量,设汉明失真矩阵为:,因而最小失真度。并能找到满足该最小失真的试验信道,且是一个无噪无损信道,其信道矩阵为:,

要达到最大允许失真,唯一确定,此时,可计算得信息传输率,一般情况下,当

可以计算出二元对称信源信息率真函数为

四、        实验步骤

(1)输入二元对称信道概率w;

(2)计算信源熵;

(3)计算率失真函数;

(4)绘制曲线

五、        实验结果

(1)绘制曲线

在matlab中输入w=0.6得到曲线:

(2)曲线特性

(3)图像的分析

a.  R(D)在定义域内是失真度D的U型下凸函数;

b.  R(D)在定义域内是关于D的连续函数;

c.  R(D)是单调递减的,失真度越大,所要求的信息率越小,其中最小为0,最大为信源熵;d.  当D相同时,信源越趋于等概率分布,R(D)就越大。

六、        实验小结

通过这次实验,我们不仅了解了信息率失真函数的定义与物理意义,而且利用matlab绘制出了率失真函数的图形。

通过matlab的画图工具,更加直观的看出率失真函数是一个下凸的连续函数,当失真率D=0.5时,率失真函数取得最小值。

通过对实验结果的分析,对最大离散熵定理有了进一步的认识。即信源越趋于等概率分布,其熵越大。也就是说不确定性越大,要去除这不确定性所需的信息传输率就越大,R(D)就是去除信源不确定性所必须的信息传输率。

实验4:信道容量的迭代算法

一、实验目的:

(1)进一步熟悉信道容量的迭代算法;

(2)学习如何将复杂的公式转化为程序;

(3)掌握高级语言数值计算程序的设计和调试技术。

二、实验要求:     

(1)已知:信源符号个数r、信宿符号个数s 、信道转移概率矩阵P;

(2)输入:任意的一个信道转移概率矩阵。信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入;

(3)输出:信道容量C。

三、实验原理:

(1) procedure ChannelCapacity(r, s, ())

(2) initialize: 信源分布,相对误差门限,

(3) repeat

(4)

(5)

(6)

(7) until

(8) output   C         

(9) end procedure

四、算法程序:

#include<stdio.h>

#include<math.h>

#define MAX 100

double Calculate_a(int k,double pa[]);

double Calculate_C1(double pa[],double a[]);

double Calculate_C2(double a[]);

int r,s;

double pba[3][3];

void main()

{

int i,j;

double C1,C2,E;

double a[MAX],pa[3];

E=0.000001;

r=3;

s=3;

pa[0]=0.2;

pa[1]=0.3;

pa[2]=0.5;

pba[3][3]={0.5,0.33333333,0.16666666,0.16666666,0.5,0.333333333,0.33333333,0.16666666,0.5};

do

{

for(i=0;i<r;i++)

a[i]=Calculate_a(i,pa);

C1=Calculate_C1(pa,a);

C2=Calculate_C2(a);

if(C2-C1>=E)

{

double sum=0;

for(i=0;i<r;i++)

sum+=pa[i]*a[i];

for(i=0;i<r;i++)

pa[i]=pa[i]*a[i]/sum;

}

else

{

printf("最佳信源概率:\n");

for(i=0;i<r;i++)

printf(" %lf \n",pa[i]);

}

}while(C2-C1>=E);

printf("信道容量为:%lf\n",C1/log(2));

}

double Calculate_a(int k,double pa[])

{

int i,j;

double temp,sum2=0;

for(j=0;j<s;j++)

{

double sum1=0;

for(i=0;i<r;i++)

{

sum1+=pa[i]*pba[i][j];

}

temp=pba[k][j]/sum1;

temp=log(temp);

sum2+=pba[k][j]*temp;

}

return exp(sum2);

}

double Calculate_C1(double pa[],double a[])

{

int i;

double sum=0;

for(i=0;i<r;i++)

sum+=pa[i]*a[i];

return log(sum);

}

double Calculate_C2(double a[])

{

int i;

double max=a[0];

for(i=0;i<r;i++)

if(max<a[i]) max=a[i];

return log(max);

}

五、程序运行结果:

最佳信源概率:

 0.333330

 0.333334

 0.333337

信道容量为:0.125815

Press any key to continue

六、实验小结:

通过本次实验,我了解了信道容量的迭代算法,在理论的掌握基础上,更进一步的实现了程序的运行算法,同时又加深了编程语言上的一些不足和毛病。信道容量是在关于信源分布和信道转移概率的函数,当信道转移概率固定时,信道容量是关于信源分布的上凸形函数。实验过程中固定了信道转移概率,将信道容量看作是信源分布和后验概率的函数。固定信源分布和后验概率其中一个,后进行迭代计算另一个,最后得到最大的信道容量。

相关推荐