实验一数据可视化与绘制函数图像1.数据可视化人们很难直接从一大堆原始的离散数据中体会到它们的含义,画出图形却能使人们用视觉器官直接感受到数据的许多内在本质。
因此,数据可视化是人们研究科学、认识世界所不可缺少的手段。
作为一个优秀的科技软件,MATLAB不仅在数值计算上独占鳌头,而且在数据可视化上也有上乘的表现。
MATLAB可以给出数据的二维、三维乃至四维的图形表现,是一种非常方便作函数图像的工具。
信号是消息的载体,是消息的一种表现形式。
信号可以描述范围极为广泛的一类物理现象,在日常生活和科学研究中占有极其重要的地位。
在数学上,信号可以表示为一个或多个变量的函数。
信号按照自变量取值是否连续可以分为连续时间信号和离散时间信号。
若对信号进行时域分析,其中比较重要的就是对信号随时间变化的二维曲线图进行分析。
对于简单的信号来说,我们可以用手工绘制其波形,但是对于复杂的信号来说,手工绘制极其困难,其精度也不尽如人意。
然而这些对于具有强大图形处理功能的MATLAB来说,我们可以比较容易的绘出函数图形,使读者能够对信号的特征有一个比较直观的印象。
2.MATLAB如何表示信号在matlab中有两种方法来表示信号,一种是用向量来表示,另一种是用符号运算的方法。
用适当的方法表示出信号后,我们就可以利用matlab中的绘图命令绘制出直观的信号波形。
下面我们将结合具体的例子,分别简单介绍一下两种不同的方法。
2.1.表示连续时间信号从严格意义上来说,matlab并不能处理连续信号。
因为我们都知道计算机的数值精度有限、内存容量有限,所以没有办法严格的表示在时间上和数值上具有无限精度的连续信号。
但是在工程应用的时候,都允许存在一定的误差,只要满足允许的误差要求,我们可以对连续信号进行近似的处理。
Matlab表示连续时间信号有两种方法,我们分别介绍如下。
2.1.1.向量表示法向量表示法实际上是根据采样定理,使用间隔足够小的等间隔采样值来表示连续时间信号,在matlab中通常都将这些采样值保存在一个数组向量中。
有关matlab中数组与矩阵计算的内容请参看附录,或通过察看demo->matlab->matrices中给出的例子进行学习。
例:表示并画出信号t = -10:1.5:10 %做图区域为-10到10,采样间隔为1.5f = sin(t>./t %’./’为点除运算,即数组对应元素作除法plot(t,f> %matlab的绘图语句之一title(‘f(t>=Sinc(t>’> %给绘出的图形增加标题xlabel(‘t’> %给横坐标增加文字说明axis([-10,10,-0.4,1.1]> %设置绘图窗口的坐标区域运行结果如图<1)所示,效果不是很好。
我们可以改变采样的间隔t,使间隔更小一点比如:t = -10:0.02:10,再次运行结果如图<2)所示,现在效果就好多了。
在这个例子中我们使用了matlab 的有关绘图语句plot ,title ,xlabel ,axis 它们的用法请查阅matlab联机帮助,或附录中的内容。
2.1.2. 符号运算表示法首先我们需要知道什么是符号运算,我们先看一个例子,在高等数学中积分运算是经常遇到的,例如我们需要求函数的不定积分即,如果用计算机来求解就只能依靠符号计算方法了。
求解这个积分的matlab 程序如下: f = sym(‘sin(x>^2’>。
%定义符号变量f ,代表数学公式sin(x>^2 intf = int(f> %int(>为matlab 中求符号积分的函数 结果为intf =-1/2*cos(x>*sin(x>+1/2*x ,即,我们还可以化简,使用如下语句:intf = simple(intf> %simple(>是用来化简符号公式的函数结果为intf =-1/4*sin(2*x>+1/2*x , 即如果使用符号运算表示法表示信号,则绘图语句应该使用ezplot(>函数,我们通过具体的例子来看看它的使用方法。
例:绘出信号f(t> = sin(pi/4*t>的图像f = sym(‘sin(pi/4*t>’> %定义符号表达式,代表f(t>ezplot(f,[-16,16]> %指定t 的范围,绘制函数f(t>的图像 结果如图所示:在这个例子中,我们用到了符号预算中的下列函数sym(>,int(>,simple(>,ezplot(>有关它们的详细介绍和具体用法请参考matlab帮助,或后面的附录。
2.2.离散信号的表示方法一般说来,离散时间信号可以用f(k>表示<注:这里的记号与《信号与系统》书中不一样,但实质是相同的),其中变量k为整数,代表离散的采样时间点。
例如:f(k>={ …, f(-3>, f(-2>, f(-1>, f(0>, f(1>, f(2>, … }在matlab中使用一个向量f即可以表示一个有限长度的序列,无限长的序列是计算机无法处理的,我们必须将无限长的序列进行截断处理。
但是用一个向量f来表示序列<向量的下标是从1开始的自然数),只是保留了各个采样点的数字,而数值出现的时间点信息被丢失了。
所以要完整表示离散信号需要用两个向量。
如序列:f(k>={ f(-3>=1, f(-2>=2, f(-1>=-1, f(0>=3, f(1>=2, f(2>=4, f(3>=-1}在matlab中应该使用两个向量来表示:k = [-3, -2, -1, 0, 1, 2, 3] 表示时间点f = [1, 2, -1, 3, 2, 4, -1] 表示时间点上的数值绘制离散时间信号的图像应该使用matlab中的stem(>函数,例如:stem(k, f, ‘filled’>,axis([-4, 4, -1.5, 4.5]>结果如下:3.matlab信号表示与绘图举例例<1):绘出连续时间的单位阶越信号u(t>先考虑使用向量法,我们先创建自己一个存在于matlab\work目录下的Heaviside(>函数,该文件内容如下:建立了这个函数之后,我们可以使用下列语句绘出图像:t = -2:0.01:5。
f = Heaviside(t>。
plot(t, f>。
axis([-2, 5, -0.2, 2]>。
结果如图所示:例<2):画出f(t> = u(t + 3> - 2u(t>第一种方法:利用上面的Heaviside(>函数实现f = sym('Heaviside(t+3> - 2*Heaviside(t>'> %定义要画的信号hold on %该命令是为了在一个绘图窗口多次绘制图像用的plot([-5,4],[0,0],'k'>。
%draw x axisplot([0,0],[-3,3],'k'>。
%draw y axisezplot(f, [-5, 4]>。
%绘出信号的图像plot([0,0],[-1,1],'b'>。
%add a vertical line (0,-1>--(0,1>axis([-5, 4, -3, 3]>。
%设定绘图窗口的大小hold off结果如图所示:第二种方法:分别使用向量f和t表示信号的数值与对应时刻,可以写出一个函数来表示阶跃信号以及它的各种时移。
函数名为jieyue<),代码如下function jieyue(t1, t2, t0> %定义函数%画出阶越函数%t1,t2表示信号的起止时刻%t0表示信号平移的时间,向右为正%其中t1<t0<t2t=t1:0.01:t0。
%定义阶越信号的左边时间向量tt=t0:0.01:t2。
%定义阶越信号右边的时间向量n=length(t>。
%求向量的元素个数nn=length(tt>。
u=zeros(1,n>。
%信号左边图像uu=ones(1,nn>。
%信号右边图像plot(tt,uu>。
hold onplot(t,u>。
plot([t0,t0],[0,1]>。
%补上间断点处的竖线hold offtitle('单位阶越信号'>axis([t1,t2,-0.2,1.5]>。
定义了函数之后,我们可以用它很方便的绘出阶越函数u(t-1>的图像jieyue(-1,4,1>运行结果为:4.信号的时域运算和变换信号的时域运算和变换包括:信号相加、相乘、平移、反转、颠倒、尺度变换等。
下面我们将对连续和离散信号分别介绍它们的实现方法4.1.连续信号前面讲过,连续信号在matlab中有两种表示方法,用任何一种方法都能实现上面的运算和变换,但用符号运算的方法则比较简便。
在此我们只介绍符号运算的方法,向量法请参阅离散信号的情况。
下面我们用一个实例来说明。
例:设信号为,请分别画出f(t>,f(t+2>,f(t-2>,f(-t>,f(2t>,-f(t>的图像syms t。
%定义符号变量f=sym('(t/2+1>*(heaviside(t+2>-heaviside(t-2>>'>。
%原信号subplot(2,3,1>, ezplot(f,[-3,3]>。
y1=subs(f,t,t+2>。
%变量代换用t+2替换tsubplot(2,3,2>, ezplot(y1,[-5,1]>。
y2=subs(f,t,t-2>。
subplot(2,3,3>, ezplot(y2,[-1,5]>。
y3=subs(f,t,-t>。
subplot(2,3,4>, ezplot(y3,[-3,3]>。
y4=subs(f,t,2*t>。
subplot(2,3,5>, ezplot(y4,[-2,2]>。
y5=-f。
subplot(2,3,6>, ezplot(y5,[-3,3]>。
运行结果为:4.2.离散信号在matlab中离散序列的时域运算和变换不能用符号运算来实现,而必须用向量表示的方法。
在离散序列的运算时,要求两个序列的时间维数必须相同。