《数字信号处理》实验指导书

  • 格式:doc
  • 大小:908.00 KB
  • 文档页数:48

1 电子与通信工程系

《数字信号处理》实验指导书

编著:马莉 杨永双

2 第一章 Matlab基础知识

1.1 Matlab语言的发展

MATLAB 语言的首创者 Cleve Moler 教授在数值分析,特别是在数值线性代数的领域中很有影响, 他参与编写了数值分析领域一些著名的著作和两个重要的 Fortran 程序 EISPACK 和LINPACK。他曾在密西根大学、斯坦福大学和新墨西哥大学任数学与计算机科学教授。1980 年前后,当时 的新墨西哥大学计算机系主任 Moler 教授在讲授线性代数课程时,发现了用其他高级语言编程极为不便,便构思并开发了 MATLAB (MATrix LABoratory,即矩阵实验室), 这一软件利用了当时数值线性代数领域最高水平的 EISPACK 和 LINPACK 两大软件包中可靠的子程序,用 Fortran 语言编写了集命令翻译、科学计算于一身的一套交互式软件系统。

所谓交互式语言,是指人们给出一条命令,立即就可以得出该命令的结果。该语言无需像 C 和 Fortran 语言那样,首先要求使用者去编写源程序,然后对之进行编译、连接,最终形成可执行文件。这无疑会给使用者带来了极大的方便。早期的 MATLAB 是用 Fortran 语言编写的,只能作矩阵运算;绘图也只能用极其原始的方法,即用星号描点的形式画图;内部函数也只提供了几十个。但即使其当时的功能十分简单,当它作为免费软件出现以来,还是吸引了大批的使用者。

Cleve Moler 和 John Little 等人成立了一个名叫 The MathWorks 的公司,Cleve Moler 一直任该公司的首席科学家。该公司于 1984 年推出了第一个

MATLAB 的商业版本。 当时的 MATLAB 版本已经用 C 语言作了完全的改写,其后又增添了丰富多彩的图形图像处理、多媒体功能、符号运算和它与其他流行软件的接口功能,使得 MATLAB 的功能越来越强大。

The MathWorks 公司于 1992 年推出了具有划时代意义的 MATLAB 4.0 版本,并于 1993 年推出了其微机版, 可以配合 Microsoft Windows 一起使用, 使之应用范围越来越广。 1994 年推出的 4.2 版本扩充了 4.0 版本的功能,尤其在图形界面设计方面更提供了新的方法。

1997 年推出的 MATLAB 5.0 版允许了更多的数据结构,如单元数据、数据结构体、多维矩阵、对象与类等,使其成为一种更方便编程的语言。1999 年初推出的 MATLAB 5.3 版在很多方面又进一步改进了 MATLAB 语言的功能。

2000 年 10 月底推出了其全新的 MATLAB 6.0 正式版(Release 12),在核心数值算法、界面设计、外部接口、应用桌面等诸多方面有了极大的改进。

虽然 MATLAB 语言是计算数学专家倡导并开发的,但其普及和发展离不开自动控制领域学者的贡献。

甚至可以说,MATLAB 语言是自动控制领域学者和工程技术人员捧红的,因为在 MATLAB 语言的发展进程中,许多有代表性的成就和控制界的要求与贡献是分不开的。迄今为止,大多数工具箱也都是控制方面的。MATLAB 具有强大 3 的数学运算能力、方便实用的绘图功能及语言的高度集成性,它在其他科学与工程领域的应用也是越来越广,并且有着更广阔的应用前景和无穷无尽的潜能。

目前,MATLAB 已经成为国际上最流行的科学与工程计算的软件工具,现在的 MATLAB 已经不仅仅是一个“矩阵实验室”了,它已经成为了一种具有广泛应用前景的全新的计算机高级编程语言了,有人称它为“第四代”计算机语言,它在国内外高校和研究部门正扮演着重要的角色。MATLAB 语言的功能也越来越强大,不断适应新的要求提出新的解决方法。可以预见,在科学运算、自动控制与科学绘图领域 MATLAB 语言将长期保持其独一无二的地位。

1.2 Matlab语言的特色

考虑两个矩阵 A 和 B 的乘积问题,在 C 语言中要实现两个矩阵的乘积并不仅仅是一组双重循环的问题。双重循环当然是矩阵乘积所必需的,除此之外要考虑的问题很多。例如:A 和 B 有一个是复数矩阵怎么考虑;其中一个是复数矩阵时怎么考虑;全部是实系数矩阵时又怎么管理;这样就要在一个程序中有 4

个分支,分别考虑这 4 种情况。然后还得判断这两个矩阵是否可乘。而考虑两个矩阵是否可乘也并不仅仅是判断 A 的列数是否等于 B 的行数这么简单。其中一个若为标量,则它们可以无条件地相乘。其中有标量时又得考虑实数与复数的问题等。所以说,没有几十分钟的时间,用 C 语言并不可能编写出考虑各种情况的子程序。有了 MATLAB 这样的工具,A 和 B 矩阵的乘积用 A*B 这样简单的算式就能表示了。

例1:矩阵生成与运算。考虑金庸作品中经常提及的一个“数学问题”, 该问题用半数学语言描述就是:如何生成一个 3x3 矩阵, 并将自然数 1, 2, ..., 9 分别置成这 9 个矩阵元素,才能使得每一行、每一列、且主、反对角线上元素相加都等于一个相同的数。

这样的矩阵称为“魔方矩阵”。用 MATLAB 的 magic() 函数,我们可以由下面的命令立即生成这样的矩阵:

>> A=magic(3)

A =

8 1 6

3 5 7

4 9 2

还可以由 B=magic(10) 一次生成 10x10 的魔方矩阵。如果想求出矩阵的行列式和特征值,可以分别由 det(B) 与 eig(B) 立即得出结果,而同样的工作在 C 下并不是很简单就可以得出的,算法选择不好,还可能得出错误的结果。 4 例2:考虑一个二元函数

如何用三维图形的方式表现出这个曲面?

用 C 这类语言,绘制图形是一个难点,且从一个机器移植程序到另一个机器,大部分调试程序时间都花在这上。但使用 MATLAB 这类高级语言,完成这样的工作就是几个直观语句的事。且得出的图形美观准确、可以将语句毫不变化地移植到另外的机器上,得出完全一致的结果,如下所示。

>> [x,y] = meshgrid(-3:1/8:3);

z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2)- 10*(x/5 - x.^3 - y.^5)...

.*exp(-x.^2-y.^2)- 1/3*exp(-(x+1).^2 - y.^2);

surf(x,y,z), shading interp; colorbar

例3:微分方程的数值解法是在科学与工程计算中经常遇到的问题。假设著名的

Lorenz 模型的状态方程表示为:

若令 且初值为, 为一个小常数,假设 则我们可以由下面的几个语句就可以描述微分方程:

function xdot = lorenzeq(t,x) xdot=[-8/3*x(1)+x(2)*x(3); 5 -10*x(2)+10*x(3);

-x(1)*x(2)+28*x(2)-x(3)];

这样下面几个语句就能求解该微分方程,绘制出时间曲线与相空间曲线,如下所示。

>> t_final=100; x0=[0;0;1e-10];

[t,x]=ode45('lorenzeq',[0,t_final],x0);

plot(t,x),

figure; plot3(x(:,1),x(:,2),x(:,3)); axis([10 40 -20 20 -20 20]);

例4:设有解析函数,利用 MATLAB 的符号运算工具箱可以对该函数进行解析推导,得出诸如高阶导数、积分、Taylor 幂级数展开等。

>> syms x; f='x^2*(sin(x))^2';

diff(f); f1=simple(ans)

f1 =

x-x*cos(2*x)+x^2*sin(2*x)

>> diff(f,x,2); f2=simple(ans)

f2 =

1-cos(2*x)+4*x*sin(2*x)+2*x^2*cos(2*x)

>> diff(f,x,3); f3=simple(ans)

f3 =

6*sin(2*x)+12*x*cos(2*x)-4*x^2*sin(2*x)

>> diff(f,x,4); f4=simple(ans)

f4 =

24*cos(2*x)-32*x*sin(2*x)-8*x^2*cos(2*x)

>> int(f4,x)

ans =

6*sin(2*x)+12*x*cos(2*x)-4*x^2*sin(2*x)

>> taylor(x^2*(sin(x))^2,15,x) 6 ans =

x^4-1/3*x^6+2/45*x^8-1/315*x^10+2/14175*x^12-2/467775*x^14

例5: MATLAB 语言可以编写程序,容易地实现图形用户界面。例如编写矩阵处理 matx_proc.m 界面如下。

1.3 Matlab语言

Matlab语言的编写可以在命令窗也可以在编辑窗中进行,所谓命令窗就是在打开matlab后出现的窗口,而编辑窗则是在命令窗中单击file|new|M-file即可。用matlab编写的程序统称为M文件,M文件有两种:脚本和函数。

一、脚本

所谓脚本就是M文件的简单类型,它们没有输入输出参数,只是一些函数和命令的组合,脚本可以在matlab环境下直接执行,他们可以访问存在于整个工作空间内的数据,由脚本建立的变量在脚本执行完后仍保留在工作空间中,可以继续对其进行操作,直到使用clear命令清除了这些变量。

二、函数

和其它高级语言一样,函数是matlab语言的最重要的内容,matlab提供的各种工具都是以函数的形式给出的。

函数也是M文件的最主要形式,他接收输入参数,返回输出参数。函数只能访问函数本身的工作空间中的变量,从matlab命令空间或其它函数中也不能对该函数工作空间中的变量进行访问。

函数文件与脚本文件类似之处在于它们都是一个有“.M”扩展名的文本文件,而且,函数文件和脚本文件一样,都是由文本编辑器所创建的外部文本文件。