详解MATLAB Simulink通信系统建模与仿真(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-29 20:08:11

点击下载

作者:刘学勇

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

详解MATLAB Simulink通信系统建模与仿真

详解MATLAB Simulink通信系统建模与仿真试读:

前言

随着科学技术的发展,计算机仿真技术呈现出越来越强大的活力,它大大节省了人力、物力和时间成本,在当今教学、科研、生产等各个领域发挥着巨大的作用。MATLAB凭借其强大的功能在众多的计算机仿真软件中脱颖而出,成为国际上最流行的科学与工程计算的工具软件。MATLAB不仅功能强大而且易于操作,使用户能集中精力于所研究的问题上,而不必在编程上花费过多时间。世界各国在通信系统的教学中,均采用MATLAB及Simulink作为辅助教学软件,一方面可以摆脱繁杂的大规模计算;另一方面还可以使学生有机会自己动手构建模型,所花的代价要远小于实际建模。

目前,系统地介绍MATLAB/Simulink通信系统仿真设计的书非常少,很多书的重点都是各种模块的设计和性能分析的基本理论,缺少通过大量实例讲解MATLAB/Simulink通信系统建模与仿真设计的内容,本书就是为尝试弥补这方面的不足而编写的。

本书共分12章,可分为三大部分。

第1部分包括第1~2章,主要介绍MATLAB的基础知识、MATLAB/Simulink集成环境、M语言编程环境,以及Simulink模块的使用,使读者对MATLAB/Simulink能有一个基本的了解。

第2部分包括第3~8章,主要介绍使用MATLAB/Simulink进行通信系统仿真中各个常用模块使用方法,包括通信信号与系统分析、信道、模拟调制与解调、数字基带传输、数字信号载波传输、信道编码/译码,以及交织等模块。读者通过这些内容的学习,可掌握通信系统常用模块的仿真方法与技术,并能学会搭建简单的系统模型。

第3部分包括第9~12章,是通信系统的综合仿真实例,包括OFDM系统仿真、CDMA系统仿真、多址接入协议概述及MIMO系统仿真。它们都是当前通信界的研究热点,读者通过学习,将会对通信系统有一个更深入的了解,同时对使用MATLAB/Simulink进行通信系统仿真的方法会有更大的提高。

本书的最大特点就是将理论与实际紧密结合,内容通俗易懂,使读者对使用MATLAB/Simulink进行通信系统仿真应用有一个基本的认识。本书的另一大特色就是注重仿真应用的系统化,书中严格按照各种理论系统进行仿真过程的设计,使所有的仿真内容都可以找到理论根源,从而巩固加深了读者对理论的理解。

本书配有光盘1张,包含书中所有实例的程序源代码和相关的教学视频,方便读者学习和使用。所有的程序都用MATLAB/Simulink进行了验证。此外,还有大量的上机习题,读者如果能认真分析相应习题,对整个通信系统的工作会获得更加生动、具体的认识。书中的综合案例,读者稍加修改,便可以应用于自己的工作中或者完成自己的课题,可以说是物有所值。

本书主要由刘学勇编著,参与编写的还有张玉兰、李龙、魏勇、王华、李辉、刘峰、徐浩、李建国、马建军、唐爱华、苏小平、朱丽云、马淑娟、周毅等。

由于时间仓促,同时限于作者的水平,书中难免存在一些错误和不足之处,欢迎广大读者批评指正。编著者2011.8第1章MATLAB基础与通信系统仿真

MATLAB语言是一种广泛应用于工程计算及数值分析领域的新型高级语言,自1984年由美国MathWorks公司推向市场以来,历经二十多年的发展与竞争,现已成为国际公认的最优秀的工程应用开发软件。MATLAB功能强大、简单易学、编程效率高,深受广大科技工作者的欢迎。在欧美各高等院校,MATLAB已经成为线性代数、自动控制理论、数字信号处理、动态系统仿真、图像处理等课程的基本教学工具,成为本科生、硕士生及博士生必须掌握的基本技能。本章首先对MATLAB的基本用法及通信系统仿真做一简单介绍。1.1 MATLAB简介

MATLAB软件系列产品是一套功能强大的数值运算和系统仿真软件,被誉为“巨人肩膀上的工具”。借助于MATLAB,能够迅速地测试设计构想,综合评测系统性能。1.1.1 MATLAB的起源

20世纪70年代,时任美国新墨西哥大学计算机科学系主任的Cleve Moler出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK矩阵软件工具包库程序的“通俗易用”的接口,即用FORTRAN编写的萌芽状态的MATLAB(MATrix LABoratory,矩阵实验室)。1984年,由Little、Moler、Steve Bangert合作成立MathWorks公司,并把MATLAB正式推向市场。从这时起,MATLAB的内核采用C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。与大家常用的FORTRAN和C等高级语言相比,MATLAB的语法规则更简单,更贴近人的思维方式,被称为“草稿纸式的语言”。它以超群的风格与性能风靡全世界,成功地应用于各工程学科的研究领域。目前,MATLAB软件版本每年都在不断更新之中,新版本兼容旧版本,旧版本的程序可以不加修改地在新版本中运行。但新版本的程序不一定能在旧版本中运行,这点读者需要注意。本书中所使用的版本为MATLAB7.0。1.1.2 MATLAB的特点

为什么MATLAB如此备受青睐?就让我们来看一下MATLAB有什么特点吧。

1. 数值计算和符号计算功能

MATLAB具备强大的数值计算和符号计算功能。数值计算功能包括:矩阵运算、多项式和有理分式运算、数据统计分析、数值积分等。它的数值计算速度快,精度高,收敛性好,函数库功能强大。此外,在解决数学问题的过程中,往往需要继续大量的符号计算和推导,MATLAB的符号计算可以得到问题的解析。强大的数值计算功能和符号计算功能是MATLAB优于其他计算软件的决定因素之一。

2. 强大的MATLAB编程语言

MATLAB除了命令行的交互式操作以外,还可以以程序方式工作。使用MATLAB可以很容易地实现C或FORTRAN语言的几乎全部功能,包括Windows图形用户界面的设计。

3. 具有很好的图形功能

MATLAB可以轻而易举地绘制二维、三维及四维图形,并可进行图形和坐标的标识、视角和光照设计、色彩精细控制等。利用图形用户界面GUI制作工具,可以制作用户菜单和控件。使用者可以根据自己的需求编写出满意的图形界面。

4. 可以直接处理声音和图像文件

MATLAB支持的声音和图像文件格式很多,如wav、bmp、gif、pcx、tif、jpeg等文件。在MATLAB中只需要简单的命令,就可以将声音文件或图像文件读入系统中并对它们进行相应的处理。而如果使用高级语言,需要程序员自己对文件格式有一定的了解,然后再根据文件格式进行相应的数据读取。

5. 具有功能强大的工具箱

MATLAB包括基本部分和各种可选的工具箱。基本部分中有数百个内部函数,可以满足一般应用的需要。其工具箱分为两大类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能、可视建模仿真功能及文字处理功能等。学科性工具箱专业性比较强,如控制系统工具箱、信号处理工具箱、通信系统工具箱、神经网络工具箱、最优化工具箱、金融工具箱等,用户可以直接利用这些工具箱进行相关领域的科学研究。

6. 使用方便,具有很好的扩展功能

使用MATLAB语言编写的程序可以直接运行,无须编译。通过MATLAB Compiler和C/C++Math Libraby,用户还可以将MATLAB语言编写的M文件转变为独立于平台的EXE可执行文件。

MATLAB的应用接口程序API是MATLAB提供的十分重要的组件,由一系列接口指令组成。用户可在FORTRAN或C语言中,把MATLAB当作计算引擎使用。

7. 强大的Simulink仿真工具

Simulink是MATLAB的又一个重要的分支产品,是一个结合了框图界面和交互仿真能力的系统级建模、仿真和分析工具。它以MATLAB的核心数学、图形和语言为基础,可以让用户毫不费力的完成从算法开发、仿真到模型验证的全过程。Simulink lockset提供了丰富的专业模块库,广泛用于控制、DSP、通信等系统仿真领域。用户也可以利用已有的模块或自己编写的C程序或MATLAB程序建立自己的模块及模块库。

正是由于以上特点,使MATLAB在短时间内获得了广泛的流行。现在从通信、自动控制、航空航天、汽车工业、工业设计,MATLAB都凭借其强大的功能获得用武之地。广大学生可以使用MATLAB来帮助进行信号处理、通信原理、自动控制等课程的学习;科技人员可以使用MATLAB进行理论研究、算法开发、产品原型的设计与仿真等。

下面就来介绍一下MATLAB的使用。1.2 MATLAB程序设计“工欲善其事,必先利其器”。要熟练使用MATLAB,必须掌握MATLAB程序设计方法。在这一节中,主要介绍MATLAB的工作环境,MATLAB的基本语法及用MATLAB进行图形处理和数据可视化的方法,最后介绍M文件编程。1.2.1 MATLAB工作环境

MATLAB安装比较简单,与Windows下其他软件的安装大同小异,因此,就不再浪费篇幅介绍MATLAB的安装。MATLAB安装完成后,会自动在Windows桌面上生成一个快捷方式,它是指向安装目录下\bin\win32\matlab.exe的链接,双击它即可打开MATLAB集成环境的基本窗口,如图1-1所示。图1-1 MATLAB集成环境窗口

在MATLAB集成环境窗口中,可以看到,除了标题栏、菜单栏、工具条外,它还包含三个窗口,分别是命令窗口(Command Window)、工作区变量窗口(Workspace)、历史命令窗口(Command History)及一个项目启动菜单(Start)。

1. 命令窗口

命令窗口是MATLAB提供的人机交互窗口。任何MATLAB自带的命令及函数都可以在此窗口中输入后立即执行。其执行的最终结果也在此窗口中显示。如输入“100+300”,MATLAB命令窗口显示如下: >>100+300 ans= 400

其中,第1行是输入的命令,第2~3行是MATLAB执行命令后的输出结果。ans是MATLAB默认的输出结果变量名。如果指定了输出变量名,则ans会被指定的变量名代替。

例如: >>x=100+300 x= 400

是不是就像使用计算器一样简单?

2. 工作区变量窗口

工作区变量窗口显示当前工作区中定义的变量及它们的值,例如,在命令窗口中执行完刚才输入的两条命令后,工作区变量窗口中显示的内容如图1-2所示。图1-2 MATLAB的工作区变量窗口

可以看到,刚才输入的两条命令生成的输出变量的值都显示在工作区变量窗口中。由于MATLAB中的变量类型很多,有的变量代表的可能是一个矢量或是一个矩阵,这时在工作区变量窗口中一行显示不下,如果想查看矢量或矩阵中所有元素的值,可在工作区变量窗口中双击代表该矢量或矩阵的变量,MATLAB会单独显示该变量中的所有元素的值,如图1-3所示。与图1-2相比,图1-3多了一个“Array Editor”窗口,类似于Excel表格,如果变量有多个元素,该窗口将显示出变量所有元素的值。由于ans变量只有一个元素,因此,窗口中也只显示了一个值。查看完毕后,单击窗口右上角的叉号按钮,即可关闭。图1-3 单独查看某个变量所有元素的值

3. 历史命令窗口

在历史命令窗口中,显示MATLAB最近执行过的相关命令,用户可以方便地在该窗口中查阅已执行过的命令,在该窗口中双击某条命令,便可重新执行该命令。

4. 项目启动菜单

项目启动菜单类似于Windows系统左下角的“开始”菜单,主要帮助用户快速启动相关的内容。

MATLAB的退出与普通应用程序一样,值得一提的是,它有一个专有的快捷键“Ctrl+Q”。1.2.2 MATLAB的帮助系统

MATLAB提供的命令和函数很多,在学习MATLAB的过程中,不可避免地要遇到一些不会使用的命令和函数,这时可以通过MATLAB提供的帮助系统来了解函数的使用方法。学会使用这些帮助方法,对于快速掌握MATLAB是必不可少的。下面介绍一下MATLAB的帮助系统。

1. 查看命令或函数帮助

当已知命令或函数名,想了解该命令或函数的具体应用方法是,可以在命令窗口中输入help帮助命令,其格式为“help ×××”,其中,×××代表要查询的命令或函数名。例如,如果想了解sin函数的应用方法,在命令窗口中输入命令。 >>help sin

MATLAB执行后,命令窗口中显示出如下内容: SIN Sine. SIN(X) is the sine of the elements of X. See also asin, sind. Overloaded functions or methods (ones with the same name in other directories) help sym/sin.m Reference page in Help browser doc sin

在以上的sin函数帮助信息中,首先介绍了sin函数是什么函数及它的功能,接着给出了与sin函数相关的其他函数名称,用户可以利用help命令查询这些相关函数,最后两行给出了sin函数帮助信息的相关文档链接,打开该链接可以更加详细的了解sin函数的有关介绍。

其他命令或函数的帮助信息查询方法与sin函数类似,只要MATLAB自带有用户所查询的命令或函数,MATLAB都会给出相应的帮助信息,内容显示格式与sin函数的帮助信息格式类似。因此,学会利用help命令是掌握MATLAB命令和函数使用方法的必备技能。

2. 联机帮助系统

当知道相关的命令或函数名时,可以使用help命令,当对需要使用的相关命令或函数不甚了解,甚至不知道需要利用的命令或函数在MATLAB中的名字是什么时该怎么办?MATLAB的联机帮助系统可以很好的解决这一问题。

在MATLAB集成环境中,选择菜单“Help→Matlab Help”或者单击工具栏中的“?”图标就可以启动MATLAB的联机帮助系统,其界面如图1-4所示。图1-4 MATLAB的联机帮助系统

可以看到,MATLAB联机帮助系统界面主要包括两个主窗口,帮助导航窗口(Help Navigator)和内容显示窗口。帮助导航窗口主要包括内容(Contents)、索引(Indexs)、查询(Search)、演示(Demos)四个标签项。单击相应的标签项可以切换到相应的子窗口。内容显示框用来为用户显示所查询的内容。

例如,假设要对某个数求它的正弦值,但不知道MATLAB中的相应的函数名,单击Search标签项,切换到查询子窗口,在文本框中输入sin,回车后MATLAB会列出所有包含sin字符串的函数名,其中第一个正是要查询的sin函数,这时在右边的内容显示窗口显示了有关sin函数的说明及使用sin函数的例子。

此外,演示子窗口也是一个学习使用MATLAB的重要窗口。它里面包含了许多利用MATLAB进行处理问题的演示。通过观看这些演示,可以很快了解MATLAB,高效地寻找到相关问题的解决方法。

总之,熟练掌握MATLAB联机帮助系统的使用,可以大大提高MATLAB的应用水平。

3. PDF文件帮助系统

为了方便用户打印,MATLAB还提供了PDF格式的帮助文档,它们在安装文件夹help\pdf_doc目录下。如作者的MATLAB安装目录为D:\MATLAB7,PDF帮助文档在目录D:\MATLAB7\help\pdf_doc下。

4. MATLAB网络资源

MATLAB的官方网站如下:

http://www.mathworks.com

网站上提供了大量的MATLAB的相关资料及源代码,读者可充分利用它们来解决自己学习及科研时遇到的问题。1.2.3 MATLAB的基本操作

MATLAB功能强大,但在实际应用时,大部分都是一些最基本的操作,掌握了这些基本操作,可以解决常见的普通问题。而更复杂的编程,可以通过组合一些基本的操作来实现。

1. 变量

与其他高级语言如C语言和FORTRAN语言相比,MATLAB的变量不需要事先声明类型,用MATLAB进行数学计算,就像用计算器计算算术一样方便。

1)变量与赋值

MATLAB中的变量命名以字母开头,后接字母、数字或下画线的字符序列,最多63个字符,区分字母的大小写。赋值语句为 变量=表达式

例如: x=5

表示将5赋值给x。

MATLAB内部有很多预定义变量和常数,用以表达特殊含义。常用的有如下几种。(1)变量ans:指示当前未定义变量名的答案。(2)常数eps:表示浮点相对精度,其值是从1.0到下一个最大浮点数之间的差值。该变量值作为一些MATLAB函数计算的相对浮点精度,按IEEE标准,eps=2−52,近似为2.2204e−016。(3)常数Inf:表示无穷大。当输入或计算中有除以0时产生Inf。(4)虚数单位i、j:表示复数虚部单位,相当于。(5)NaN:表示不定型值,是由0/0运算产生的。(6)常数pi:表示圆周率π,其值为3.141 592 653 589 7…。(7)nargin:函数的输入变量个数。(8)nagout:函数的输出变量个数。

2)变量的删除与修改

clear命令用于删除工作空间中的变量,who和whos显示驻留的变量名清单。例如,输入x=1和y=2后,分别输入who和whos命令,MATLAB显示如下: >>who Your variables are: x y >>whos Name Size Bytes Class x 1x1 8 double array y 1x1 8 double array Grand total is 2 elements using 16 bytes

可见,whos命令比who提供了更详细的关于变量的信息。

3)局部变量和全局变量

局部变量是指那些每个函数体内自己定义的,不能从其他函数和MATLAB工作空间访问的变量。

全局变量是指用关键字“global”声明的变量。全局变量名应尽量大写,并能反映它本身的含义。如果需要在工作空间和几个函数中都能访问一个全局变量,必须在工作空间和这几个函数中都声明该变量是全局的。

2. 矩阵及其运算

MATLAB具有强大的矩阵运算和数据处理功能,对矩阵的处理必须遵从代数规则。

1)一般矩阵的生成

对于一般的矩阵MATLAB的生成方法有多种。最简单的方法是从键盘直接输入矩阵元素。直接输入矩阵元素时应注意:各元素之间用空格或逗号隔开,用分号或回车结束矩阵行,用中括号把矩阵所有元素括起来。例如,在工作空间产生一个3×3矩阵A。输入如下: >>A=[1 2 3;4 5 6;7 8 9]

或 >>A=[1 2 3 4 5 6 7 8 9]

运行结果: A= 1 2 3 4 5 6 7 8 9

若要显示整行或整列,则可以用冒号(:)来表示。冒号(:)代表矩阵中行(ROWS)或列(COLUMNS)的全部。例如,执行命令 >>A(:,2)

就会显示第2列的全部,结果为 ans= 2 5 8

2)特殊矩阵的生成(1)eye (m,n)或eye (m)产生m*n或m*m的单位矩阵。例如: >>eye(3,4) ans= 1 0 0 0 0 1 0 0 0 0 1 0 >>eye(3) ans= 1 0 0 0 1 0 0 0 1(2)zeros (m,n)或zeros (m)产生m*n或m*m的零矩阵。例如: >>zeros(3,4) ans= 0 0 0 0 0 0 0 0 0 0 0 0 zeros(3) ans= 0 0 0 0 0 0 0 0 0(3)ones (m,n)或ones (m)产生m*n或m*m的全部元素为1的矩阵。例如: >>ones(3,4) ans= 1 1 1 1 1 1 1 1 1 1 1 1 >>ones(3) ans= 1 1 1 1 1 1 1 1 1(4)randn (m,n)或randn (m)产生m*n或m*m的随机矩阵。矩阵中每一行,每一列元素都服从均值为0,方差为1的高斯分布。例如: >>randn(3,4) ans= −0.4326 0.2877 1.1892 0.1746 −1.6656 −1.1465 −0.0376 −0.1867 0.1253 1.1909 0.3273 0.7258 >>randn(3) ans= −0.5883 0.1139 −0.0956 2.1832 1.0668 −0.8323 −0.1364 0.0593 0.2944(5)rand(m,n)或rand (m)产生m*n或m*m的随机矩阵。矩阵中每一行,每一列元素都服从[0,1]上的均匀分布。例如: >>rand(3,4) ans= 0.8811 0.9080 0.5462 0.1807 0.1481 0.3087 0.7018 0.4898 0.7603 0.0767 0.3564 0.9676 >>rand(3) ans= 0.9463 0.0518 0.3909 0.9391 0.2810 0.3541 0.5695 0.3267 0.0782

randn和rand函数是通信系统仿真中常用的函数,经常用它们来产生各种不同要求的随机数,例如,产生8个噪声功率为10的高斯白噪声样值如下: >>sqrt(10)*randn(1,8) ans= 2.1820 2.5792 2.251 3 4.0801 2.1143 3.7658 −3.8025 −0.0626

其中,sqrt函数是开方运算。

3)矩阵运算

矩阵的运算有基本运算和函数运算两种类型。基本运算包括矩阵的加、减、乘、除、乘方、求转置、求逆等,其主要特点是通过MATLAB提供的基本运算符+、-、*、/(\)、^等即可完成。函数运算主要是通过调用MATLAB系统内置的运算函数来求取矩阵的行列式(det(A)),求秩(rank(A)),求特征值和特征矢量([V,D]=eig(A)),求Jordan标准形(jordan(A))和矩阵分解等。需要用时可以参阅联机帮助和相关参考书。例如: 1. >>A=[1 2 3;4 5 6]; 2. >>B=[6 5 4;3 2 1]; 3. >>C=A+B %计算两个矩阵的和 4. >>D=B' %求矩阵B的转置矩阵 5. >>E=A*D %做矩阵乘法,必须要满足矩阵乘法的基本要求 6. >>F=A.*B %求矩阵A和B对应元素的乘积 7. >>G=A./B %矩阵A的对应元素除以矩阵B的对应元素 8. >>H=det(E) %求E的行列式值 9. >>I=E^(−1) %求E的逆矩阵 10. >>J=inv(E)

说明:程序的第1行定义了矩阵A,其中语言最后的“;”表示让MATLAB在执行后不在命令窗口输出当前运行结果值。在后面讲到的m脚本文件编程时,因为有很多结果是中间结果值,让MATLAB不显示这些中间结果值可提高程序的执行速度。第2行定义了矩阵B。第3行是计算矩阵A和B的和。最后的“%”表示后面的字符是注释,MATLAB在执行时会忽略掉本行%后面的内容。在编写M文件时,注释可以对程序的功能加深理解。第4行是求矩阵B的转置矩阵。需要注意的是如果矩阵B是复数矩阵,则B'求的是B的共轭转置矩阵,转置矩阵的命令是B.'。第5行是求矩阵A和D的乘积,它们之间的运算满足矩阵乘法的要求。此外,MATLAB还提供了两个维数相同矩阵对应元素乘除运算命令,分别是“.*”和“./”,如第6行和第7行所示。第8行是求矩阵E的行列式,第9行和第10行都是求矩阵E的逆矩阵。其中,inv函数是MATLAB提供的专门求方阵的逆矩阵的函数。以上命令的执行结果如下: C= 7 7 7 7 7 7 D= 6 3 5 2 4 1 E= 28 10 73 28 F= 6 10 12 12 10 6 G= 0.1667 0.4000 0.7500 1.3333 2.5000 6.0000 H= 54 I= 0.5185 −0.1852 −1.3519 0.5185 J= 0.5185 −0.1852 −1.3519 0.51851.2.4 MATLAB图形处理和数据可视化

作为一个功能强大的工具软件,MATLAB具有很强的图形处理功能,提供了大量的二维、三维图形函数。由于系统采用面向对象的技术和丰富的矩阵运算,所以,在图形处理方面非常方便又高效。

1. plot函数

函数格式:plot(x,y),其中x和y为坐标矢量。

函数功能:以矢量x、y为轴,绘制曲线。

例1.1 在区间0≤x≤2pi内,绘制正弦曲线y=sin(x),其程序为 1. x=0:pi/100:2*pi; 2. y=sin(x); 3. plot(x,y)

说明:程序的第1行表示以0为初始值,pi/100为步长,2*pi为结束值生成矢量x。第2行表示计算矢量x的sin值。第3行是画出以x为横坐标,y为纵坐标绘制曲线。程序执行后生成的图形如图1-5所示。图1-5 y=sin(x)曲线

plot函数还可以为plot(x, y1, x, y2, x, y3, …)形式,其功能是以公共矢量x为x轴,分别以y1,y2,y3,…为y轴,在同一幅图内绘制出多条曲线。

例1.2 同时绘制正、余弦两条曲线y1=sin(x)和y2=cos(x),其程序为 1. x=0:pi/100:2*pi; 2. y1=sin(x); 3. y2=cos(x); 4. plot(x,y1,x,y2)

程序运行结果如图1-6所示。图1-6 同时绘制sin(x)和cos(x)曲线

plot可以以不同颜色与线形表示不同的曲线,其格式为plot(x,y1,'cs',…),其中c表示颜色,s表示线形。

例1.3 用不同线形和颜色重新绘制例1.2图形,其程序为 1. x=0:pi/100:2*pi; 2. y1=sin(x); 3. y2=cos(x); 4. plot(x,y1,'go',x,y2,'b-.')

其中,参数'go'和'b-.'表示图形的颜色和线形。g表示绿色,o表示图形线形为圆圈;b表示蓝色,-.表示图形线形为点画线。更多参数说明,读者可以查看MATLAB帮助。程序运行结果,如图1-7所示。图1-7 plot函数的不同颜色和线形

在绘制图形的同时,可以对图形加上一些说明,如图形名称、图形某一部分的含义、坐标说明等,将这些操作称为添加图形标记。其命令如下: 5. title('sin(x),cos(x)曲线'); 6. xlabel('时间'); 7. ylabel('振幅'); 8. text(x(190),y1(190),'sin(x)曲线'); 9. text(x(190),y2(190),'cos(x)曲线');

其中,title用来说明图形的名称,xlabel用来说明横坐标代表的参数含义,ylabel说明纵坐标代表的参数含义,text是在图形的特定位置添加注释,x(190)代表x矢量的第190个值,因此本例中分别在坐标(x(190),y1(190))和坐标(x(190),y2(190))处添加注释。上述命令执行后,结果如图1-8所示。图1-8 图形添加说明

用户若对坐标系统不满意,可利用axis命令对其重新设定。最常用的命令格式为axis([xmin xmax ymin ymax]),分别设定x轴和y轴的最小值和最大值。其他的命令格式,读者请参考MATLAB帮助。

MATLAB绘出的图形默认是不显示坐标网格,让图形显示坐标网格的命令是grid on,不显示坐标网格的命令是grid off。给图形加图例命令为legend。该命令把图例放置在图形空白处,用户还可以通过鼠标移动图例,将其放到希望的位置。其命令格式为legend('曲线1图例说明','曲线2图例说明',…)。

例1.4 在坐标范围0≤x≤2π,−2≤y≤2内重新绘制例1.3图形,并显示坐标网格和图例说明。其程序为 1. x=linspace(0,2*pi,200); %生成含有200个数据元素的矢量x 2. y1=sin(x); 3. y2=cos(x); 4. plot(x,y1,'go',x,y2,'b-.') 5. title('sin(x),cos(x)曲线'); 6. xlabel('时间'); 7. ylabel('振幅'); 8. text(x(150),y1(150),'sin(x)曲线'); 9. text(x(150),y2(150),'cos(x)曲线'); 10. axis ([0 2*pi-2 2]); %设定坐标轴范围 11. grid on %显示坐标网格 12. legend('sin(x)','cos(x)'); %图例说明

说明:在本程序中第1行用到了linespace函数,它的作用是以第1个参数和第2个参数为区间,生成含有第3个参数元素的矢量。本例中就是在[0, 2*pi]生成200个数据元素的矢量。程序的第10行是设定x轴范围为[0,2*pi],y轴范围为[−2, 2]。第11行是让MATLAB在图形上显示坐标网格,最后一行加上图例说明。程序运行结果如图1-9所示。图1-9 例1.4程序运行结果

2. subplot函数

subplot(m,n,p)命令将当前图形窗口分成m×n个绘图区,即每行n个,共m行,区号按行优先编号,且选定第p个区为当前绘图区。

例1.5 在同一个图形窗口中,同时绘制y1=sinx,y2=cosx,y3=sin(2x),y4=(cos2x),0≤x≤2π。程序为 1. x=linspace(0,2*pi,60); 2. y1=sin(x); 3. subplot(2,2,1); %整个绘图区分为2×2区域,且当前绘图区位1号绘图区 4. plot(x,y1); 5. title('sin(x)') 6. axis([0 2*pi−1 1]); 7. y2=cos(x); 8. subplot(2,2,2); %指定当前绘图区为2号绘图区 9. plot(x,y2); 10. title('cos(x)') 11. axis([0 2*pi−1 1]); 12. y3=sin(2*x); 13. subplot(2,2,3); %指定当前绘图区为3号绘图区 14. plot(x,y3); 15. title('sin(2x)') 16. axis([0 2*pi−1 1]); 17. y4=cos(2*x); 18. subplot(2,2,4); %指定当前绘图区为4号绘图区 19. plot(x,y4); 20. title('cos(2x)') 21. axis([0 2*pi−1 1]);

说明:程序的第3行把整个绘图区分为2×2区域,且指定了当前绘图区为1,第8、13、18行分别指定当前绘图区为2、3、4。程序运行结果如图1-10所示。图1-10 例1.5程序运行结果

3. 多图形窗口

需要建立多个图形窗口,绘制并保持每一个窗口的图形,可以使用figure命令。每执行一次figure命令,就创建一个新的图形窗口,该窗口自动为活动窗口,若需要还可以返回该窗口的识别号码,称该号码为句柄。句柄显示在图形窗口的标题栏中,即图形窗口标题。用户可通过句柄激活或关闭某图形窗口,而axis、xlabel、title等许多命令也只对活动窗口有效。

例1.6 用figure命令重新绘制例1.5中的y1,y2,y3,y4。 1. x=linspace(0,2*pi,60); 2. y1=sin(x); 3. H1=figure; %创建新窗口并返回句柄到变量H1 4. plot(x,y1); 5. title('sin(x)') 6. axis([0 2*pi−1 1]); 7. y2=cos(x); 8. H2=figure; %创建第2个窗口并返回句柄到变量H2 9. plot(x,y2); 10. title('cos(x)') 11. axis([0 2*pi−1 1]); 12. y3=sin(2*x); 13. H3=figure; %创建第3个窗口并返回句柄到变量H3 14. plot(x,y3); 15. title('sin(2x)') 16. axis([0 2*pi−1 1]); 17. y4=cos(2*x); 18. H4=figure; %创建第4个窗口并返回句柄到变量H4 19. plot(x,y4); 20. title('cos(2x)') 21. axis([0 2*pi−1 1]);

说明:程序与例1.5的不同分别是在第3、8、13、18行用figure命令代替了subplot命令。程序的运行结果如图1-11所示。在这里由于排版的需要,把4个窗口显示在一起。程序运行结束后,窗口4实际上是活动窗口。图1-11 例1.6程序运行结果

4. hold命令

在使用plot函数画图时,原有的图形会被新的图形所代替。若想保留原有的图形,并已存在图形窗口中用plot命令继续添加新的图形内容,可使用图形保持命令hold。发出命令hold on后,再执行plot命令,在保持原有图形或曲线的基础上,添加新绘制的图形。

例1.7 hold命令示例如下: 1. x=linspace(0,2*pi,60); 2. y=sin(x); 3. z=cos(x); 4. plot(x,y,'-go'); %绘制正弦曲线 5. hold on; %设置图形保持状态 6. plot(x,z,'−.b'); %保持正弦曲线同时绘制余弦曲线 7. axis ([0 2*pi−1 1]); % 8. legend('sin(x)','cos(x)'); 10. hold off %关闭图形保持

说明:程序的执行结果与程序例1.5的结果基本相似,这里就不再给出。读者可以尝试去掉程序中第5行中的hold on命令,再次执行程序,可以看出前后两者的不同。

5. 对数坐标图形

在通信系统仿真中,很多情况下需要绘制对数坐标图形。例如,各种信道中误码率随信噪比的变化曲线,这时,纵坐标(误码率)一般采用对数坐标。MATLAB也提供了绘制对数坐标的函数,介绍如下。(1)loglog(x,y)双对数坐标,横坐标和纵坐标都采用x,y的对数。(2)semilogx(x,y):单对数坐标,横坐标采用x的对数。(3)semilogy(x,y):单对数坐标,纵坐标采用y的对数。

例1.8 绘制y=|500×(sin(2x)+cos(x)|+1的双对数坐标图。程序为 1. x=[0:0.1:2*pi]; 2. y=abs(500*(sin(2*x)+cos(x)))+1; 3. loglog(x,y); %双对数坐标绘图命令

程序执行结果如图1-12所示。图1-12 例1.8程序运行结果

从图1-12可以看出,横坐标和纵坐标都采用了x,y的对数值。

例1.9 分别以x轴为对数和以y轴为对数重新绘制上述曲线。 1. x=[0:0.1:2*pi]; 2. y=abs(500*(sin(2*x)+cos(x)))+1; 3. semilogx(x,y); %单对数x轴绘图命令 4. title('x轴对数') 5. figure %创建一个新的绘图窗口 6. semeilogy(x,y); 7. title('y轴对数')

程序执行结果如图1-13所示。图1-13 例1.9程序运行结果

除plot等基本绘图命令外,MATLAB系统还提供了许多其他特殊绘图函数,这里就不再一一举例,更详细的信息用户可随时查阅在线帮助,其对应的M-file文件存放在系统\matlab\toolbox\matlab目录下。1.2.5 M文件编程

通常MATLAB以指令驱动模式工作,即在MATLAB窗口下当用户输入单行指令时,MATLAB立即处理这条指令,并显示结果,这就是MATLAB命令行方式。在命令行操作时,MATLAB窗口只允许一次执行一行上的一个或几个语句。前面所举的例子都是基于这种方式的。

在MATLAB窗口输入数据和命令进行计算时,当处理复杂问题和大量数据时是不方便的。命令行方式程序可读性差,而且不能存储,对于复杂的问题,应编写成能存储的程序文件,即M文件。

首先将MATLAB语句构成的程序存储成以.m为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式。程序文件不能在指令窗口下建立,因为,指令窗口只允许一次执行一行上的一个或几个语句。

M文件有两种形式:脚本文件(Script File)和函数文件(Function File)。这两种文件的扩展名,均为“. m”。

1. M脚本文件

对于复杂计算,采用脚本文件最为合适。脚本文件的构成比较简单,只是一串按用户意图排列而成的(包括控制流向指令在内的)MATLAB指令集合。MATLAB只是按文件所写的指令执行。脚本文件运行后,所产生的所有变量都驻留在MATLAB基本工作空间(Base Workspace)中。只要用户不使用清除指令(Clear),MATLAB指令窗口不关闭,这些变量将一直保存在基本工作空间中。

M文件的类型是普通的文本文件,可以使用系统认可的文本文件编辑器来建立M文件。其具体创建方法如下:(1)在MATLAB命令窗口选择菜单“file→New→M-file”(或者单击工具栏的按钮),如图1-14所示。这时系统会弹出系统自带的M文件编辑器,类似于记事本和写字板,如图1-15所示,这时就可以在编辑器中输入相应的命令。图1-14 新建M-file图1-15 MATLAB自带的M-file编辑器(2)编辑完成之后,单击工具栏上的按钮,这时系统会提示输入文件名,输入后,单击“确定”按钮即可保存编辑好的M文件。(3)保存完成后,单击工具栏上的按钮,即可运行刚才输入的M文件。也可以在MATLAB命令窗口中输入M文件的名字来运行M文件。

2. 函数文件

与脚本文件不同,函数文件犹如一个“黑箱”,把一些数据送进并经加工处理,再把结果送出来。MATLAB提供的函数指令大部分都是由函数文件定义的。M文件的特点如下:(1)从形式上看,与脚本文件不同,函数文件的笫一行总是以“function”引导的“函数申明行”。(2)从运行上看,与脚本文件运行不同,每当函数文件运行,MATLAB就会专门为它开辟一个临时工作空间,称为函数工作空间(Function Workspace)。当执行文件最后一条指令时,就结束该函数文件的运行,同时,该临时函数空间及其所有的中间变量就立即被清除。(3)函数定义时,一般都定义了输入/输出(I/O)变量的个数,称为“默认数目”。MATLAB允许使用比“默认数目”较少的输入/输出变量,实现对函数的调用。

典型M文件的结构如下:(1)函数声明行:位于函数文件的首行,以关键字function开头,函数名及函数的输入输出变量都在这一行被定义,其格式为 function输出形参表=函数名(输入形参表)

其中,函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于1个时,则应该用方括号括起来。(2)笫一注释行:紧随函数声明行之后以%为开头笫一注释行。该行主要供lookfor关键词查询和help在线帮助使用。(3)在线帮助文本区:笫一注释行及其之后的连续以%开头的所有注释行构成整个在线帮助文本。(4)编写和修改记录:与在线帮助文本区相隔一个“空”行,也以%开头,标志编写及修改该M文件的作者和日期等。(5)函数体:为清晰起见,它与前面的注释以“空”行相隔。(6)M文件的文件名必须是“函数名.M”(不包括双引号)。

例1.10 通过M-file编辑器打开安装目录下\toolbox\matlab\matfun\trace.m文件,可以看到如下内容: 1. function t=trace(a) 2. %TRACE Sum of diagonal elements. 3. % TRACE(A) is the sum of the diagonal elements of A, which is 4. % also the sum of the eigenvalues of A. 5. % 6. % Class support for input A: 7. % float:double, single 8. 9. % Copyright 1984-2004 The MathWorks, Inc. 10. % $Revision:5.8.4.1$$Date:2004/04/10 23:30:11$ 11. 12. t=sum(diag(a));

说明:第1行是函数的声明行,函数的输出变量为t,函数名为trace,输入变量是a。第2行是第一注释行,第3~7行是在线文本帮助区,在MATLAB命令行窗口中输入help trace,则第2~7行的内容就会显示出来。第9~10行是该函数的编写和修改记录。这个函数的函数体只有1行,它的功能是计算输入参数矩阵A的迹,并把计算结果赋值给输出变量t。

其他MATLAB函数的形式与之相似,感兴趣的读者可以查看有关函数的实现。

3. 函数调用和参数传递

1)函数调用

函数文件编制好后,就可调用函数进行计算了。函数调用的一般格式为

[输出参数1,输出参数2,…]=函数名(输入参数1,输入参数2,…)

函数调用可以嵌套,一个函数可以调用别的函数,甚至调用它自己(递归调用)。在前面的例子中已经多次演示了函数调用的方法,这里就不再单独举例。

2)局部变量和全局变量(1)局部变量存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于该函数本身。(2)通过global指令,MATLAB允许几个不同的函数空间及基本工作空间共享同一个变量,这种被共享的变量称为全局变量。

在MATLAB中,函数文件的内部变量是局部的,与其他函数文件及MATLAB工作空间相互隔离。但是,如果在若干函数中,都把某一变量定义为全局变量,那么这些函数将共用这一个变量。全局变量的作用域是整个MATLAB工作空间,即全程有效。所有的函数都可以对它进行存取和修改。因此,定义全局变量是函数间传递信息的一种手段。

例1.11 全局变量应用示例。先建立函数文件myfun.m,该函数将计算输入的参数的二次多项式和。 1. function s=myfun(x) 2. %computer the sum of 2-order polynomial 3. 4. global A B 5. s=A*x.^2+B*x+1;

在命令窗口中输入 global A B A=1; B=2; s=myfun(2)

输出为 s= 9

4. MATLAB的程序结构

MATLAB语言的程序结构与其他高级语言是一致的,分为顺序结构、循环结构、分支结构。(1)顺序结构——依次顺序执行程序的各条语句。(2)循环结构——被重复执行的一组语句,循环是计算机解决问题的主要手段。(3)分支结构——根据一定条件来执行的各条语句。

顺序结构前面的例子已经有了很多,这里就不再说明。下面主要说明一下循环结构和分支结构的语法格式。

1)循环结构

循环结构主要有以下几种。(1)for-end语句

语法为 for indx=循环初始值:循环步长:循环结束值 可执行语句组 end

其中,indx代表循环变量,也可以用其他变量代替。后面紧跟的是循环初始值,循环步长,循环结束值。在循环步长为1的情况下,也可以省略而代之以:循环初始值:循环结束值。中间是可执行语句组成的集合,在语句的最后要加end代表for循环的结束。for-end语句是可以嵌套的,也就是说在一个for-end语句中可以嵌套其他的for-end语句。下面来看一个例子。

例1.12 利用for循环求y=sinx+sin2x+…+sin100x, 0≤x≤2π的值。 1. y=0; 2. x=0:0.01:2*pi; 3. for indx=1:100 4. y=y+sin(indx*x); 5. end 6. plot(x,y) 7. titl('y=sinx+sin2x+...+sin100x')e

上述程序比较简单,首先是赋值给y=0,然后生成矢量x,然后通过第3~5行的for循环计算y,最后是输出相应的结果。程序执行结果如图1-16所示。图1-16 例1.12程序运行结果(2)while-end循环

while循环将循环体中的语句循环执行不定次数。语法为 while表达式 循环体语句 end

表达式一般是由逻辑运算和关系运算及一般运算组成的,以判断循环的进行和停止;只要表达式的值非0,继续循环;直到表达式值为0,循环停止。

例1.13 用while循环实现例1.12程序。 1. y=0; 2. x=0:0.01:2*pi; 3. indx=1; 4. while indx<=100 5. y=y+sin(indx*x); 6. indx=indx+1; 7. end 8. plot(x,y)

程序的执行结果与例1.12相同,这里就不再给出。

2)分支结构

分支结构的语句有if语句和switch语句。下面先来看if语句。

if语句的格式有如下几种格式。

格式1 if条件 可执行语句组 end

格式2 if条件 可执行语句组1 else 可执行语句组2 end

格式3 if条件1 可执行语句组1 elseif条件2 可执行语句组2 … elseif条件m 可执行语句组m else 可执行语句组m+1 end

在格式1中,首先判断条件是否满足,如果满足则执行可执行语句组,否则结束。在格式2中,首先判断条件是否满足,如果满足则执行可执行语句组1,若不满足则执行可执行语句组2。格式3是格式2的进一步扩展,分别对判断是否满足条件1,2,…,m,然后执行相应的可执行语句组。若所有的条件都不满足,则执行可执行语句组m+1。可见,格式3实现了一种多路选择,比较复杂。可替代下面要讲到的switch-case-end语句。

例1.14 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。程序代码为 1. for indx=100:999 2. a1=fix(indx/100); %求indx的百位数字 3. a2=rem(fix(indx/10),10); %求indx的十位数字 4. a3=rem(indx,10); %求indx的个位数字 5. if indx==a1.^3+a2.^3+a3.^3 6. indx 7. end 8. end

说明:在程序中,首先是一个for循环(第1行),在循环体内,分别求出三位整数的百位、十位和个位数字(第2~4行),其中,rem(x,y)函数是求y除x的余数。fix(x)是求x的整数部分,它们都是MATLAB内置的函数。第5~7行用一个if语句判所求的三位整数是否是水仙花数,是则输出该数。

程序执行结果为 indx= 153 indx= 370 indx= 371 indx= 407

switch语句根据变量或表达式的取值不同,分别执行不同的语句。其格式为 switch表达式 case值1 可执行语句组1 case值2 可执行语句组2 … case值m 可执行语句组m otherwise 可执行语句组m+1 end

说明:switch语句首先判断表达式的值,如果等于值1,则执行可执行语句组1,等于值2,则执行可执行语句组2…,如果与判断的值都不相等,则执行可执行语句组m+1。

例1.15 switch-case语句说明。在本例中,首先定义了一个函数myfun1,它的功能是根据不同的输入值,输出对应的输出值。代码如下: 1. %the example of switch-case

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载