信号与系统:基于MATLAB的方法
上QQ阅读APP看书,第一时间看更新

0.4 MATLAB软件介绍

MATLAB是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件。它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便且界面良好的用户环境。它还包括了Toolbox(工具箱)的各类问题的求解工具,可用来求解特定学科的问题。其有如下特点。

(1)可扩展性:MATLAB最重要的特点是易于扩展,它允许用户自行建立指定功能的M文件。对于一个从事特定领域的工程师来说,不仅可利用MATLAB所提供的函数及基本工具箱函数,还可方便地构造出专用的函数,从而大大扩展了其应用范围。

(2)易学易用性:MATLAB不需要用户有高深的数学知识和程序设计能力,不需要用户深刻了解算法及编程技巧。

(3)高效性:MATLAB语句功能十分强大,一条语句可完成十分复杂的任务。如fft语句可完成对指定数据的快速傅里叶变换,这相当于上百条C语言语句的功能。它大大加快了工程技术人员从事软件开发的效率。

MATLAB核心模块提供了基本的数学算法,例如矩阵运算、数值分析算法。MATLAB集成了2D和3D图形功能,以完成相应数值可视化的工作,并且它提供了一种交互式的高级编程语言––M语言,利用M语言可以通过编写脚本或者函数文件实现用户自己的算法。

MATLAB的桌面应用程序开发工具是以MATLAB Compiler为核心的一组编译工具。MATLAB Compiler能够将那些利用MATLAB提供的编程语言––M语言编写的函数文件编译生成为函数库或者可执行文件。

下面介绍MATLAB的数值计算和符号计算。

0.4.1 数值计算

用MATLAB语言,可以很方便地进行数值计算,其特点是将数值型输入数据通过数学运算变换成所需要的数值型数据输出。

1.数学运算

在MATLAB中有部分函数可以用来进行基本的数学运算,主要有如下函数:三角函数(见表0-1)、指数运算函数(见表0-2)、复数运算函数(见表0-3)、取整和求余函数(见表0-4)。需要注意的是,这些函数的参数可以是矩阵,也可以是向量或者多维数组,函数在处理参数时,都是按照数组运算的规则来进行的。表0-5是用于矩阵(数组)操作的常用函数。

表0-1 三角函数

表0-2 指数运算函数

表0-3 复数运算函数

表0-4 取整和求余函数

表0-5 用于矩阵(数组)操作的常用函数

2.用MATLAB产生信号

在MATLAB中,可通过创建向量或矩阵的形式,产生数值型信号。下面举例说明。

【例0-1】利用MATLAB产生信号xt)=cos(10πt),yt)=sin(10πt2),分别画出信号的波形,并在一张图上比较这两个信号的波形。

:通过创建向量来产生一维信号,代码如下:

运行结果如图0-7所示。

图0-7 例0-1信号的波形

【例0-2】利用MATLAB产生信号x1t)=2e3|t|x2t)=2e–3|t|x3t)=sin(6πt)+cos(10πt),x4t)=|t|cos(10πt),分别画出信号的波形。

:先创建时间向量,再利用MATLAB基本函数定义所需要的信号,并用subplot把四个函数绘制在一张图上,代码如下

     t=-1:0.01:1;         %定义从-1到1,间隔为0.01的时间向量
     f1=2*exp(3*abs(t));  %定义函数f1
     subplot(2,2,1)       %画第1个子图
     plot(t,f1)                       %画f1的连续图
     xlabel('t(sec)')                 %X轴标记
     ylabel('f1')                     %Y轴标记
     title('2exp(3|t|)');             %给函数命名
     grid;                            %图形上加网格
     subplot(2,2,2)
     f2=2*exp(-abs(3*t));             %定义函数f2
     plot(t,f2)
     xlabel('t(sec)');ylabel('f2')
     title('2exp(-3|t|)');
     grid
     f3=sin(6*pi*t)+cos(10*pi*t);
     subplot(2,2,3)
     plot(t,f3)
     xlabel('t(sec)');ylabel('f4')
     title('sin(6*pi*t)+cos(10*pi*t)');grid
     f4=abs(t).*cos(10*pi*t);
     subplot(2,2,4)
     plot(t,f4)
     xlabel('t(sec)');ylabel('f3')
     title('|t|cos(10*pi*t)');grid

运行结果如图0-8所示。

图0-8 例0-2信号的波形

除了利用MATLAB的基本函数产生信号外,还可以利用function函数定义所需的任意信号。

【例0-3】利用MATLAB产生信号ft)=te–cost/(1+t2)。

:利用function函数定义所需信号,代码如下:

     function y=f(t)
     y=t*exp(-cos(t))/(1+t^2);

这部分代码放在一个单独的M文件中,文件名为f.m,注意文件名一定要和函数名一样。其他M文件调用该函数时执行下面这段代码。

     t=0:0.1:50;             %创建一个输入向量t
     N=length(t);            %查找向量t的长度,即向量t所包含的元素个数
     y=zeros(1,N);           %将输出向量初始化为0
     for n=1:N,              %当变量n从1变化到N,计算y(n)
       y(n)=f(t(n));         %调用上面定义的函数f
     end
     figure
     plot(t,y)
     grid                    %在图形上加网格
     title('Function f(t)')
     xlabel('t')
     ylabel('y')

运行结果如图0-9所示。

图0-9 例0-3自定义信号的波形

3.存储和加载数据

MAT文件是MATLAB独有的文件格式,提供了跨平台的数据交换能力,也是MATLAB用户最常用的数据文件格式。在MATLAB中,可以将当前工作空间中的变量保存成MAT文件,也可以将MAT文件中的数据导入到MATLAB的工作空间中,这两个过程分别使用save函数和load函数就可以完成。

save函数能够将当前工作空间中的变量保存到指定的数据文件中。例如:

     x=0:3:360;        %创建一个从0°到360°,间隔为3°的输入向量x
     y=sin(x*pi/180);  %将输入向量转换为弧度,取正弦得到向量y
     xy=[x'y'];        %定义向量xy,向量有2列,一列为x,另一列为y
     save sine.mat xy  %将向量xy保存在sine.mat文件中

load函数将数据文件的数据导入到MATLAB的工作空间,例如,要加载上面存储的数据,可用下面的代码

     clear all
     load sine
     whos

运行结果为

     Name     Size     Bytes     Class     Attributes
     xy       121x2    1936      double

由whos函数可知:存储的数据块包括242个元素,1936字节。

加载火车的声音信号:

     clear all
     load train
     sound(y,Fs)
     plot(y)

运行结果:可听到火车开动的声音,显示的声音信号的波形如图0-10所示。

加载图像信号:

     clear all
     load woman
     whos
     colormap('gray')
     imagesc(X)

运行结果为:

     Name     Size       Bytes      Class  Attributes
     X        256x256    524288     double
     map      255x3      6120       double

显示的图像如图0-11所示。

图0-10 火车声音信号的波形

图0-11 图像信号

0.4.2 符号计算

符号计算是利用MATLAB的符号数学工具Symbolic Math Toolbox定义函数,这样就能把对函数进行的代数或微积分运算的结果直接用变量来表示,而不是用数值型的数据来表示。这为用MATLAB对信号进行傅里叶分析和拉普拉斯分析提供了方便。

1.导数和差分

在计算连续信号的导数时,先利用MATLAB的符号数学工具Symbolic Math Toolbox定义函数,然后再对所定义的函数求导。

【例0-4】用MATLAB计算信号y=sint2的导数,并画出该连续信号及其导数的波形。

:先用syms定义符号变量,然后再定义需要求导的函数(它是符号变量的函数),接着对所定义的函数求导,最后绘制图形。代码如下:

     syms t y z                        %定义符号变量
     y=sin(t^2)                        %定义信号y. 注意:由于t不是向量,所以在^前面没有
     z=diff(y)                         %对y求导
     figure(1)                         %对仿真图编号
     subplot(211)
     ezplot(y,[0,2*pi]);               %对0~2*pi范围的信号y作图
     grid
     hold on
     subplot(212)
     ezplot(z,[0,2*pi]);
     grid

运行结果如图0-12所示。

图0-12 连续信号及其导数的波形

【例0-5】用MATLAB计算离散信号y=sink2的差分,并画出该离散信号及其差分信号的波形。

:离散信号的差分采用数值计算方法,代码如下:

     Ts=0.1;                            %定义采样间隔
     t1=0:Ts:2*pi;                      %定义采样时间
     y1=sin(t1.^2);                     %定义离散信号y1,注意与上例y的不同
     z1=diff(y1)./diff(t1);             %求y1的差分--导数的近似
     figure(2)                          %对仿真图编号
     subplot(211)
     stem(t1,y1,'r');
     axis([0 2*pi 1.1*min(y1)1.1*max(y1)])
     subplot(212)
     stem(t1(1:length(y1)-1),z1,'r');
     axis([0 2*pi 1.1*min(z1)1.1*max(z1)])
     legend('Derivative(black'),'Difference(blue)');
     hold off

运行结果如图0-13所示。

图0-13 离散信号及其差分的波形

2.连续信号的积分

在MATLAB里,连续信号的积分采用符号计算,而离散信号的累加采用数值计算。下面举例说明。

【例0-6】用MATLAB计算直线信号y=t的积分,并画出该直线及其积分信号的波形。

:先用符号计算求连续信号y=t的积分,再绘制其曲线。代码如下:

     clf;clear all
     %符号计算
     syms t z s
     for k=1:20,
        z =  int(t,t,0,k);  %用符号函数定义t从0到k的积分
        zz(k)=subs(z);     %把每一个积分值用数值型向量zz保存
     end
     %数值计算
     t1=linspace(-4,4);    %定义[-4,4]区间的100个等间距点
     y=t1;
     n=1:20;
     subplot(211)
     plot(t1,y);grid;
     axis([0 4 0 1.1*max(y)]);
     title('y(t)=t');
     xlabel('t')
     subplot(212)
     stem(n(1:20),zz(1:20));hold on
     plot(n(1:20),zz(1:20),'r');grid;
     title('信号t的积分');
     xlabel('k')
     hold off

运行结果如图0-14所示。

图0-14 直线信号的积分的计算

图0-14显示的是线性函数y=t及其积分的值,即

【例0-7】用MATLAB计算ft)=[sinct)]2的积分,并画出ft)及其积分信号的波形。

:采用符号计算求连续信号y=[sinct)]2的积分,再绘制其曲线。代码如下:

     clear all
     syms t z s
     for k=1:10
         z=int(sinc(t)^2,t,0,k);        %用符号函数定义sinc(t)的平方从0到k的积分
         zz(k)=subs(2*z);               %把每个积分值用向量zz保存
     end
     subplot(211)
     ezplot(sinc(t)^2,[-3,3,-0.1,1.1])
     grid
     subplot(212)
     n=1:10;
     stem(n(1:10),zz(1:10));
     hold on
     plot(n(1:10),zz(1:10),'r');
     grid;
     title('数值积分Ry(t)');
     xlabel('k')
     hold off

运行结果如图0-15所示。它显示了y=[sinct)]2及其积分的值,即

图0-15 连续信号[sin(t)]2的积分的计算

这部分关于MATLAB的介绍为读者提供了理解MATLAB基本操作的必要背景,为初学者进一步学习奠定了基础。在MATLAB里,获取信息的最佳来源是help命令。通过学习和应用,读者会发现MATLAB是进行运算和科学研究的强大工具。