中南大学
(信息论与编码实验报告)
姓 名: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
六、实验小结:
通过本次实验,我了解了信道容量的迭代算法,在理论的掌握基础上,更进一步的实现了程序的运行算法,同时又加深了编程语言上的一些不足和毛病。信道容量是在关于信源分布和信道转移概率的函数,当信道转移概率固定时,信道容量是关于信源分布的上凸形函数。实验过程中固定了信道转移概率,将信道容量看作是信源分布和后验概率的函数。固定信源分布和后验概率其中一个,后进行迭代计算另一个,最后得到最大的信道容量。
实验1绘制二进熵函数曲线串联信道容量曲线一实验内容用Excel或Matlab软件制作二进熵函数曲线串联信道容量曲线二实验环境1计算…
信息论实验实验一哈夫曼编码HuffmanCoding是一种编码方式哈夫曼编码是可变字长编码VLC的一种Huffman于19xx年提…
信息论与编码上机实验报告实验名称信息论与编码学院计算机与通信工程学院专业班级计算机1004姓名李春醒学号4105034920xx年…
实验一唯一可译码的判决准则实验目的1进一步熟悉唯一可译码的判决准则2掌握程序字符处理程序的设计和调试技术实验要求已知信源个数r码字…
中南大学信息论与编码实验报告姓名xxxxx学号xxxxxxxx专业电子信息工程班级电子信息xxxx班指导老师xx实验一关于信源熵的…
课程名称姓名系专业年级学号指导教师职称实验报告信息论与编码年月日目录实验一信源熵值的计算1实验二Huffman信源编码5实验三Sh…
课程名称姓名系专业年级学号指导教师职称实验报告信息论与编码年月日1实验三Shannon编码一实验目的1熟悉离散信源的特点2学习仿真…
中南大学信息论与编码题目关于编码的实验学生姓名杨家骏指导教师赵颖学院信息科学与工程学院学号0909101123专业班级电子信息10…
信息论与编码编码部分实验报告课程名称信息论与编码实验名称关于香农码费诺码Huffman码的实验学院信息科学与工程学院班级电子信息工…
计算机与信息工程学院综合性实验报告一实验目的根据霍夫曼编码的原理用MATLAB设计进行霍夫曼编码的程序并得出正确的结果二实验仪器或…
信息论与编码实验指导书河北工业大学信息工程学院信息论与编码课程组20xx年2月前言当前信息论与编码已经成为电子信息类专业高年级学生…