第二讲 MATLAB的 matlaB 5.3. Ink 程序设计 2.1脚本文件和函数文件 2.2函数调用和参数传递 2.3 MATLAB的程序结构和控制流 2.4M文件的调试 2.5程序设计实例 2.5.1音频信号的分析与合成 2.5.2音频频谱分析仪 2.5.3幅度调制
1 第二讲 MATLAB的 2.1 脚本文件和函数文件 2.2 函数调用和参数传递 2.3 MATLAB的程序结构和控制流 2.4 M文件的调试 2.5 程序设计实例 2.5.1 音频信号的分析与合成 2.5.2 音频频谱分析仪 2.5.3 幅度调制 程序设计
2.1脚本文件和函数文件 M文件有两种形式:脚本文件( Script File)和函数文件 ( Function file)。这两种文件的扩展名,均为“.m”。 2.1.1M脚本文件 对于一些比较简单的问题,在指令窗中直接输入指令计算。 对于复杂计算,采用脚本文件( Script file)最为合适 MATLAB只是按文件所写的指令执行。 M脚本文件的特点是: 脚本文件的构成比较简单,只是一串按用户意图排列而成 的(包括控制流向指令在内的) MATLAB指令集合 脚本文件运行后,所产生的所有变量都驻留在 MATLAB 基本工作空间( Base workspace)中。只要用户不使用清除 指令(lear), MATLAB指令窗不关闭,这些变量将一直 保存在基本工作空间中
2 2.1 脚本文件和函数文件 2.1.1 M脚本文件 ▪ 对于一些比较简单的问题 ,在指令窗中直接输入指令计算 。 ▪ 对于复杂计算,采用脚本文件(Script file)最为合适。 ▪ MATLAB只是按文件所写的指令执行。 ▪ M脚本文件的特点是: • 脚本文件的构成比较简单,只是一串按用户意图排列而成 的(包括控制流向指令在内的)MATLAB指令集合。 • 脚本文件运行后,所产生的所有变量都驻留在MATLAB 基本工作空间(Base workspace)中。只要用户不使用清除 指令(clear),MATLAB指令窗不关闭,这些变量将一直 保存在基本工作空间中。 M文件有两种形式:脚本文件(Script File)和函数文件 (Function File )。这两种文件的扩展名,均为“ . m”
2.1脚本文件和函数文件(续1) 2.1.2M函数文件 与脚本文件不同,函数文件犹如一个“黑箱”,把一些数据 送进并经加工处理,再把结果送出来 MATLAB提供的函数指令大部分都是由函数文件定义的。 M函数文件的特点是 从形式上看,与脚本文件不同,函数文件的笫一行总是 以“ function”引导的“函数申明行”。 从运行上看,与脚本文件运行不同,每当函数文件运行, MATLAB就会专门为它开辟一个临时工作空间,称为函数 工作空间( Function workspace)。当执行文件最后一条 指令时,就结束该函数文件的运行,同时该临时函数空间 及其所有的中间变量就立即被清除。 MATLAB允许使用比“标称数目”较少的输入输出宗量, 实现对函数的调用
3 2.1 脚本文件和函数文件(续1) 2.1.2 M函数文件 ▪ 与脚本文件不同,函数文件犹如一个“黑箱”,把一些数据 送进并经加工处理,再把结果送出来。 ▪ MATLAB提供的函数指令大部分都是由函数文件定义的。 ▪ M函数文件的特点是: • 从形式上看,与脚本文件不同,函数文件的笫一行总是 以 “function”引导的“函数申明行”。 •从运行上看 ,与脚本文件运行不同 ,每当函数文件运行, MATLAB就会专门为它开辟一个临时工作空间,称为函数 工作空间(Function workspace) 。当执行文件最后一条 指令时 ,就结束该函数文件的运行,同时该临时函数空间 及其所有的中间变量就立即被清除。 • MATLAB允许使用比 “标称数目 ”较少的输入输出宗量, 实现对函数的调用
2.1脚本文件和函数文件(续2) 2.1.3M文件的一般结构 由于从结构上看,脚本文件只是比函数文件少一个“函数申 明行”,所以只须描述清楚函数文件的结构。 典型M函数文件的结构如下: 函数申明行:位于函数文件的首行,以关键字 functio开头, 函数名以及函数的输入输出宗量都在这一行被定义。 笫一注释行:紧随函数申明行之后以%开头第一注释行。 该行供 lookfor关键词查询和help在线帮助使用。 在线帮助文本区:笫一注释行及其之后的连续以%开头的 所有注释行构成整个在线帮助文本。 编写和修改记录:与在线帮助文本区相隔一个“空”行 也以%开头,标志编写及修改该M文件的作者和日期等 函数体:为清晰起见,它与前面的注释以“空”行相隔。 例221:M函数文件示例
4 2.1 脚本文件和函数文件(续2) 2.1.3 M文件的一般结构 ▪ 由于从结构上看,脚本文件只是比函数文件少一个“函数申 明行”,所以只须描述清楚函数文件的结构。 ▪ 典型 M函数文件的结构如下: • 函数申明行:位于函数文件的首行,以关键字 functio 开头, 函数名以及函数的输入输出宗量都在这一行被定义。 • 笫一注释行:紧随函数申明行之后以%开头笫一注释行。 该行供lookfor关键词查询和help在线帮助使用 。 • 在线帮助文本区:笫一注释行及其之后的连续以%开头的 所有注释行构成整个在线帮助文本。 • 编写和修改记录:与在线帮助文本区相隔一个“空”行, 也以%开头,标志编写及修改该M文件的作者和日期等。 • 函数体:为清晰起见,它与前面的注释以“空”行相隔。 例 2_2_1:M函数文件示例
2.2函数调用和参数传递 2.2.1局部变量和全局变量 局部( Local)变量:它存在于函数空间内部的中间变量, 产生于该函数的运行过程中,其影响范围也仅限于该函数本 身 全局(Goba)变量:通过goba指令, MATLAB也允许几 个不同的函数空间以及基本工作空间共享同一个变量,这种被 共享的变量称为全局变量 2.2.2函数调用 在 MATLAB中,调用函数的常用形式是 输出参数1,输出参数2=函数名输入参数1,输入参数2, 函数调用可以嵌套,一个函数可以调用别的函数,甚至调 用它自己(递归调用)
5 2.2 函数调用和参数传递 2.2.1 局部变量和全局变量 ▪ 局部(Local)变量:它存在于函数空间内部的中间变量, 产生于该函数的运行过程中,其影响范围也仅限于该函数本 身 。 ▪ 全局(Global)变量:通过global 指令,MATLAB也允许几 个不同的函数空间以及基本工作空间共享同一个变量,这种被 共享的变量称为全局变量。 2.2.2 函数调用 ▪ 在MATLAB中,调用函数的常用形式是: [输出参数1,输出参数2,…] = 函数名(输入参数1,输入参数2, …) ▪ 函数调用可以嵌套,一个函数可以调用别的函数,甚至调 用它自己 (递归调用)
2.2函数调用和参数传递(续) 2.2.3参数传递 MATLAB在函数调用上有一个与众不同之处:函数所传递的 参数具有可调性。 传递参数数目的可调性来源于如下两个 MATLAB永久变量: 函数体内的 nargin给出调用该函数时的输入参数数目。 函数体内的 nargout给出调用该函数时的输出参数数目 只要在函数文件中包括这两个变量,就可以知道该函数文件 调用时的输入参数和输出参数数目 (参考:cixc1e,m,am1m) 值得注意: nargIn、 nargout本身都是函数,不是变量,所 以用户不能赋值,也不能显示。 “变长度”输入输出宗量: varargIn、 varrgout。具有接受 “任意多输入”、返回“任意多输出”的能力。 跨空间变量传递: evalin
6 2.2 函数调用和参数传递(续) 2.2.3 参数传递 ▪ MATLAB在函数调用上有一个与众不同之处 :函数所传递的 参数具有可调性。 ▪ 传递参数数目的可调性来源于如下两个MATLAB永久变量: • 函数体内的nargin 给出调用该函数时的输入参数数目。 • 函数体内的nargout 给出调用该函数时的输出参数数目。 ▪ 只要在函数文件中包括这两个变量,就可以知道该函数文件 调用时的输入参数和输出参数数目。 ▪ 值得注意:nargin、 nargout 本身都是函数,不是变量,所 以用户不能赋值,也不能显示。 ▪ “变长度”输入输出宗量:varargin 、 varrgout。具有接受 “任意多输入” 、返回“任意多输出”的能力 。 ▪ 跨空间变量传递:evalin。 (参考 : circle .m,am1.m)
2.3 MATLAB的程序结构和控制流 2.3.1程序结构 顺序结构 循环结构: MATLAB提供两种循环方式。 for--end循环和 while-end循环。 分支结构:if- else- -end。 switch-case结构。 atry- catch结构。 2.3.2程序流控制 常用指令: return,echo, input, pause, keyboard, break 警示指令:eror, warning
7 2.3 MATLAB的程序结构和控制流 2.3.1 程序结构 ▪ 循环结构:MATLAB提供两种循环方式。 ▪ 顺序结构 ▪ 分支结构:if—else—end 。 for—end 循环和while---end循环。 2.3.2 程序流控制 ▪ 常用指令:return,echo,input,pause,keyboard,break。 ▪ switch---case 结构。 ▪ try---catch 结构。 ▪ 警示指令:error, warning
2.3 MATLAB的程序结构和控制流(续) 2.3.3图形用户界面(GUI编程 现代的主流应用程序已经从命令行的交互方式转变为以图 形界面为主的交互方式,这主要是由于它给用户带来了操作 和控制的方便与灵活性。(面向对象编程) MATLAB能够以比较简单的方式实现一系列的图形界面功 能。通过对控件、菜单属性的设置和 callback的编写,就能 够满足大多数用户的需求。 控件的 Callback属性: Callback属性的取值是字符串,可 以是某个M文件名或一小段 MATLAB语句。当用户激活控件 对象(例如:在控件对象图标上单击鼠标左键)时,应用程 序就运行 Callback属性定义的子程序。 菜单的 Callback属性: Callback属性的取值是字符串,可 以是某个M文件名或一小段 MATLAB语句。当用户激活菜单 对象时,若没有子菜单就运行 Callback属性定义的子程序。 若有,先运行 Callback属性定义的子程序,再显示子菜单
8 2.3 MATLAB的程序结构和控制流(续) 2.3.3 图形用户界面(GUI)编程 ▪ 现代的主流应用程序已经从命令行的交互方式转变为以图 形界面为主的交互方式,这主要是由于它给用户带来了操作 和控制的方便与灵活性。(面向对象编程) ▪ MATLAB能够以比较简单的方式实现一系列的图形界面功 能。通过对控件、菜单属性的设置和 Callback 的编写,就能 够满足大多数用户的需求。 ▪ 控件的 Callback 属性: Callback 属性的取值是字符串,可 以是某个M文件名或一小段MATLAB语句。当用户激活控件 对象(例如:在控件对象图标上单击鼠标左键)时,应用程 序就运行 Callback 属性定义的子程序。 ▪ 菜单的 Callback 属性: Callback 属性的取值是字符串,可 以是某个M文件名或一小段MATLAB语句。当用户激活菜单 对象时,若没有子菜单就运行Callback 属性定义的子程序。 若有,先运行Callback 属性定义的子程序,再显示子菜单
2.4M文件的调试 编写M文件时,错误(Bug)在所难免。错误有两种:语法 ( Syntax)错误和运行(Run-time)错误 语法错误是指变量名、函数名的误写,标点符号的缺、漏等。 对于这类错误,通常能在运行时发现,终止执行,并给出相应 的错误原因以及所在行号 运行错误是算法本身引起的,发生在运行过程中。相对语法 错误而言,运行错误较难处理。尤其是M函数文件,它一旦运 行停止,其中间变量被删除一空,错误很难查找。 有两种调试方法:直接调试法和工具调试法
9 2.4 M文件的调试 ▪ 编写 M文件时,错误(Bug)在所难免。错误有两种:语法 (Syntax)错误和运行(Run-time)错误。 ▪ 语法错误是指变量名、函数名的误写,标点符号的缺、漏等。 对于这类错误,通常能在运行时发现,终止执行,并给出相应 的错误原因以及所在行号。 ▪ 运行错误是算法本身引起的,发生在运行过程中。相对语法 错误而言,运行错误较难处理。尤其是M函数文件,它一旦运 行停止,其中间变量被删除一空,错误很难查找。 ▪ 有两种调试方法:直接调试法和工具调试法
2.4M文件的调试(续1) 直接调试法:可以用下面方法发现某些运行错误。 在M文件中,将某些语句后面的分号去掉,迫使M文件输 出一些中间计算结果,以便发现可能的错误。 在适当的位置,添加显示某些关键变量值的语句(包括使 用disp在内)。 利用echo指令,使运行时在屏幕上逐行显示文件内容。 echo on 能显示M脚本文件; echo funNsme on能显示名为 Funnsme的M函数文件。 在原M脚本或函数文件的适当位置,增添指令 keyboard。 keyboard语句可以设置程序的断点。 通过将原M函数文件的函数申明行注释掉,可使一个中 间变量难于观察的M函数文件变为一个所有变量都保留在 基本工作空间中的M脚本文件
10 2.4 M文件的调试(续1) ▪ 直接调试法:可以用下面方法发现某些运行错误。 • 在M文件中,将某些语句后面的分号去掉,迫使M文件输 出一些中间计算结果,以便发现可能的错误。 • 在适当的位置,添加显示某些关键变量值的语句(包括使 用 disp 在内)。 • 利用 echo 指令,使运行时在屏幕上逐行显示文件内容。 echo on 能显示M脚本文件;echo FunNsme on 能显示名为 FunNsme 的M函数文件。 • 在原M脚本或函数文件的适当位置,增添指令 keyboard 。 keyboard 语句可以设置程序的断点 。 • 通过将原M函数文件的函数申明行注释掉,可使一个中 间变量难于观察的M函数文件变为一个所有变量都保留在 基本工作空间中的M脚本文件