数字信号处理 第一部分: 绪论 MATLAB是一个功能十分强大的系统,是集数值计算、图形管理、程序开发为一体的 环境。作为强大的科学计算平台,它几乎能满足所有的计算需求。在美国及其他发达国家的 理工科院校里, MATLAB已成为了一门必修的课程,在科研院所、大型公司或企业的工程 计算部门, MATLAB也是最为普遍的计算工具之 MATLAB具有如下的优势和特点 1、好的工作平台和编程环境 随着 MATLAB的商业化以及软件本身的不断升级,MA∏LAB的用户界面也越来越精 致,更加接近 Windows的标准界面,人机交互性更强,操作更简单。而且新版本的 MATLAB 提供了完整的联机査询、帮助系统,极大地方便了用户的使用。简单的编程环境提供了比较 完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进 行出错原因分析。 2、简单易用的程序语言 新版本的 MATLAB语言是基于最为流行的C语言基础上的,因此语法特征与C语言极 为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。使之更利于非计算机 专业的科技人员使用。而且这种可移植性好、可扩展性极强,这也是 MATLAB之所以能够 深入到科学研究及工程计算各个领域的重要原因 强大的科学计算及数据处理能力 MATLAB拥有600多个工程中要用的数学运算函数,可以方便地实现用户所需的各种计 算功能函数中所使用的算法都是科研和工程计算中的最新研究成果,而且经过了各种优化及 容错处理,因此使用起来鲁棒性和可靠性非常髙。在通常情况下,可以用它来代替底层编程 语言,如C和C++。在计算要求相同的情况下,使用 MATLAB的编程工作量会大大减少 MA∏LAB函数所能解决的问题包括矩阵运算和线性方程组的求解、微分及偏微分方程组的 求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数 的各种运算、三角函数和其他初等数学运算、多维数组操作以及建模动态仿真等 4、出色的图形处理功能 MATLAB自产生之日起就具有方便的数据可视化功能,新版本的 MATLAB对整个图形 处理的功能做了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二 维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例 如图形的光照处理、色度处理以及四维数据的表现等), MATLAB同样表现了出色的处理能 力。同时对一些特殊的可视化要求,例如图形动画等,MA∏LAB也有相应的功能函数,保 证了用户不同层次的要求。另外,新版本的 MATLAB还着重在图形用户界面(GUI)的制 作上做了很大的改善,对这方面有特殊要求的用户也可以得到满 5、应用广泛的模块集或工具箱 MATLAB对许多专门的领域都开发了功能强大的模块集或工具箱。一般来说,它们都是 由特定的专家开发的,用户可以直接使用工具箱学习、应用和评估不同的方法而不需要自由
数字信号处理 1 第一部分: 绪 论 MATLAB 是一个功能十分强大的系统,是集数值计算、图形管理、程序开发为一体的 环境。作为强大的科学计算平台,它几乎能满足所有的计算需求。在美国及其他发达国家的 理工科院校里,MATLAB 已成为了一门必修的课程,在科研院所、大型公司或企业的工程 计算部门,MATLAB 也是最为普遍的计算工具之一。 MATLAB 具有如下的优势和特点: 1、好的工作平台和编程环境 随着 MATLAB 的商业化以及软件本身的不断升级,MATLAB 的用户界面也越来越精 致,更加接近 Windows 的标准界面,人机交互性更强,操作更简单。而且新版本的 MATLAB 提供了完整的联机查询、帮助系统,极大地方便了用户的使用。简单的编程环境提供了比较 完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进 行出错原因分析。 2、简单易用的程序语言 新版本的 MATLAB 语言是基于最为流行的 C 语言基础上的,因此语法特征与 C 语言极 为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。使之更利于非计算机 专业的科技人员使用。而且这种可移植性好、可扩展性极强,这也是 MATLAB 之所以能够 深入到科学研究及工程计算各个领域的重要原因。 3、强大的科学计算及数据处理能力 MATLAB 拥有 600 多个工程中要用的数学运算函数,可以方便地实现用户所需的各种计 算功能函数中所使用的算法都是科研和工程计算中的最新研究成果,而且经过了各种优化及 容错处理,因此使用起来鲁棒性和可靠性非常高。在通常情况下,可以用它来代替底层编程 语言,如 C 和 C++。在计算要求相同的情况下,使用 MATLAB 的编程工作量会大大减少。 MATLAB 函数所能解决的问题包括矩阵运算和线性方程组的求解、微分及偏微分方程组的 求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数 的各种运算、三角函数和其他初等数学运算、多维数组操作以及建模动态仿真等。 4、出色的图形处理功能 MATLAB 自产生之日起就具有方便的数据可视化功能,新版本的 MATLAB 对整个图形 处理的功能做了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二 维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例 如图形的光照处理、色度处理以及四维数据的表现等),MATLAB 同样表现了出色的处理能 力。同时对一些特殊的可视化要求,例如图形动画等,MATLAB 也有相应的功能函数,保 证了用户不同层次的要求。另外,新版本的 MATLAB 还着重在图形用户界面(GUI)的制 作上做了很大的改善,对这方面有特殊要求的用户也可以得到满足。 5、应用广泛的模块集或工具箱 MATLAB 对许多专门的领域都开发了功能强大的模块集或工具箱。一般来说,它们都是 由特定的专家开发的,用户可以直接使用工具箱学习、应用和评估不同的方法而不需要自由
数字信号处理 编写代码。目前,MA∏LAB已经把工具延伸到科学研究和工程应用的诸多领域,诸如数据 采集、数据库接口、概率统计、样条拟合优化算法、偏微分方程求解、神经网络、小波分析、 信号处理、图象处理、系统辯识、控制系统设计、LM控制、鲁棒控制、模型预测、模糊 逻辑、金融分析、地图工具、非线性控制设计、实时快速原型及半物理仿真、嵌入式系统开 发、定点仿真、DSP与通讯、电力系统仿真等,都在工具箱( Toolbox)家族中有了自己的 一席之地 6、使用的程序接口和开发平台 新版本的 MATLAB可以利用 MATLAB编译器和CC++数学库和图形库,将自己的 MATLAB程序自动转换为独立于 MATLAB运行的C和C++代码。另外, MATLAB网页服 务程序还容许在Wb应用中使用自己的 MATLAB数学和图形程序 7、模块化的设计和系统级的仿真 Simulink是 MATLAB的一个分支产品,主要用来实现对工程问题的模型化和动态仿真 在世界范围内的模型化浪潮的背景下 Simulink恰恰体现了模块化设计和系统级仿真的具体 思想,使得建模仿真如同搭积木一样简单。 Simulink对仿真的实现可以应用于动力系统、信 号控制、通信设计、金融财会及生物医学等各个领域的研究中。 一、基本概念 、变量 和其他高级语言一样, MATLAB也是使用变量来保存信息。变量由变量名表示,变量 的命名应遵循如下规则 1)变量名必须以字母开头。 2)变量名可以由字母、数字和下划线混合组成 3)变量名区分字母大小写 4)变量名的字符长度不应超过31个。 在 MATLAB中还存在着一些系统默认的固定变量,如表2-1所示,即在 MATLAB中 语句中若出现固定变量名,则系统就将赋予默认值 变量名 默认值 虚数单位√-1 虚数单位√-1 圆周率丌 inf 无穷大 MATLAB的变量分为字符变量和数值变量两种,字符变量必须用但引号括起来。例如, 用户可输入 2
数字信号处理 2 编写代码。目前,MATLAB 已经把工具延伸到科学研究和工程应用的诸多领域,诸如数据 采集、数据库接口、概率统计、样条拟合优化算法、偏微分方程求解、神经网络、小波分析、 信号处理、图象处理、系统辩识、控制系统设计、LMI 控制、鲁棒控制、模型预测、模糊 逻辑、金融分析、地图工具、非线性控制设计、实时快速原型及半物理仿真、嵌入式系统开 发、定点仿真、DSP 与通讯、电力系统仿真等,都在工具箱(Toolbox)家族中有了自己的 一席之地。 6、使用的程序接口和开发平台 新版本的 MATLAB 可以利用 MATLAB 编译器和 C/C++数学库和图形库,将自己的 MATLAB 程序自动转换为独立于 MATLAB 运行的 C 和 C++代码。另外,MATLAB 网页服 务程序还容许在 Web 应用中使用自己的 MATLAB 数学和图形程序。 7、模块化的设计和系统级的仿真 Simulink 是 MATLAB 的一个分支产品,主要用来实现对工程问题的模型化和动态仿真。 在世界范围内的模型化浪潮的背景下 Simulink 恰恰体现了模块化设计和系统级仿真的具体 思想,使得建模仿真如同搭积木一样简单。Simulink 对仿真的实现可以应用于动力系统、信 号控制、通信设计、金融财会及生物医学等各个领域的研究中。 一、基本概念 1、变量 和其他高级语言一样,MATLAB 也是使用变量来保存信息。变量由变量名表示,变量 的命名应遵循如下规则: 1)变量名必须以字母开头。 2)变量名可以由字母、数字和下划线混合组成。 3)变量名区分字母大小写。 4)变量名的字符长度不应超过 31 个。 在 MATLAB 中还存在着一些系统默认的固定变量,如表 2-1 所示,即在 MATLAB 中 语句中若出现固定变量名,则系统就将赋予默认值。 变量名 默认值 i 虚数单位 −1 j 虚数单位 −1 pi 圆周率 inf 无穷大 MATLAB 的变量分为字符变量和数值变量两种,字符变量必须用但引号括起来。例如, 用户可输入: a=‘happly new year’
数字信号处理 则表示将字符串 happly new year’赋值给字符变量a。 若用户输入:b=365 则表示将数值365赋值给数值变量b 和其他高级语不同的是, MATLAB使用变量时不需要预先对变量类型进行说明, MATLAB 会自动根据所输入的数据来决定变量的饿数据类型和分配存储空间。 2、数值 在 MATLAB内部,每个数据元素都是用双精度来表示和存储的,大约有16位有效数 字。其数值有效范围约为10-308~10+30 但在进行数据输入输出时, MATLAB却可以用不同的格式。如果参加运算的每个元素 均为整数,则 MATLAB将用不加小数点的纯整数格式显示运算结果,否则,按默认的输出 格式显示结果。 MATLAB的默认格式为 short格式,该格式显示运算结果为保留小数点后4 位有效数字。用户可以通过 format命令改变输出格式为long,以得到更多的有效数字(小 数点后14位)。需要注意的是,数据输出格式的改变,并不影响该数据在 MATLAB内部的 存储精度。设置为 short很long输出格式的命令分别为 format short format long MATLAB通常用十进制数来表示一个数,亦可用科学计数法来表示一个数。另外, MATLAB还可以进行复数运算,复数可以由如下语句来产生 C=a+ib(或c=a+j*b) 将实部a虚部为b的复数赋值给复变量c C=a↑exp(j*b)(或C=a’exp(j*b)将模为a辐角为b的复数赋值给复数c 其中I、j是虚数单位 以下是 MATLAB各种合法的输入数据示例: 0.000076 8.2467-10 2.67i 1.02E3i -7.6 3.4502e+20 3、矩阵 矩阵是 MALTAB进行数据处理和运算的基本元素。 MATLAB的大部分运算或命令都是 在矩阵运算的意义下执行的。我们通常意义上的数量(标量)在 MATLAB系统中是作为 的矩阵来处理的,而仅有一行或一列的矩阵在 MATLAB中称为向量 4、数组 在 MATLAB中,数组也是一个重要的概念,矩阵在某些情况下可视为二阶的数值型数 组。但是在 MATLAB中,数组和矩阵运算规则却有较大的区别。例如,两矩阵相乘和两数 组相乘遵循的运算规则就是完全不相同的 5、函数 MATLAB为用户提供了丰富且功能各异的函数,用户可以直接用这些函数来进行数据处 理。函数由函数名和参数组成,函数调用的格式为: 函数名(参数) 例如,若在 MATLAB的命令窗口输入命令 a=sin(b)
数字信号处理 3 则表示将字符串 ‘happly new year’ 赋值给字符变量 a.。 若用户输入:b=365 则表示将数值 365 赋值给数值变量 b。 和其他高级语不同的是,MATLAB 使用变量时不需要预先对变量类型进行说明,MATLAB 会自动根据所输入的数据来决定变量的饿数据类型和分配存储空间。 2、数值 在 MATLAB 内部,每个数据元素都是用双精度来表示和存储的,大约有 16 位有效数 字。其数值有效范围约为 308 308 10 ~ 10 − + 。 但在进行数据输入输出时,MATLAB 却可以用不同的格式。如果参加运算的每个元素 均为整数,则 MATLAB 将用不加小数点的纯整数格式显示运算结果,否则,按默认的输出 格式显示结果。MATLAB 的默认格式为 short 格式,该格式显示运算结果为保留小数点后 4 位有效数字。用户可以通过 format 命令改变输出格式为 long,以得到更多的有效数字(小 数点后 14 位)。需要注意的是,数据输出格式的改变,并不影响该数据在 MATLAB 内部的 存储精度。设置为 short 很 long 输出格式的命令分别为: format short format long MATLAB 通常用十进制数来表示一个数,亦可用科学计数法来表示一个数。另外, MATLAB 还可以进行复数运算,复数可以由如下语句来产生: C=a+i*b (或 c=a+j*b) 将实部 a 虚部为 b 的复数赋值给复变量 c C=a*exp(j*b) (或 C=a*exp(j*b)) 将模为 a 辐角为 b 的复数赋值给复数 c 其中 I、j 是虚数单位 −1 。 以下是 MATLAB 各种合法的输入数据示例: 365 -18 0.000076 8.2467-10 2.67i 1.02E3i -7.6 -3.4502e+20 3、矩阵 矩阵是 MALTAB 进行数据处理和运算的基本元素。MATLAB 的大部分运算或命令都是 在矩阵运算的意义下执行的。我们通常意义上的数量(标量)在 MATLAB 系统中是作为 的矩阵来处理的,而仅有一行或一列的矩阵在 MATLAB 中称为向量。 4、数组 在 MATLAB 中,数组也是一个重要的概念,矩阵在某些情况下可视为二阶的数值型数 组。但是在 MATLAB 中,数组和矩阵运算规则却有较大的区别。例如,两矩阵相乘和两数 组相乘遵循的运算规则就是完全不相同的。 5、函数 MATLAB 为用户提供了丰富且功能各异的函数,用户可以直接用这些函数来进行数据处 理。函数由函数名和参数组成,函数调用的格式为: 函数名(参数) 例如,若在 MATLAB 的命令窗口输入命令: a=sin(b)
数字信号处理 则表示计算b的正弦值并将赋值给变量a 多项式处理 1、多项式表示 多项式在 MATLAB中使用降幂系数的行向量表示。例如:多项式x4-12x3+0x2+25x+116 表示为:p=[1-12025116 需要注意的是,表示中需要包含零系数的项。按照这种形式,使用函数 roots可以找出多项 式等于零的根:r= roots(p) r=11.74728287082272、2.70282074384101、-1.22505180733187+146720800872890i -1.22505180733187、-1.46720800872890I 按照 MATLAB的规定,多项式使用行向量,根使用列向量。给出多项式的根,使用poly函 数也可以构造出相应的多项式 pp=1.0000-12.00000250000116.0000 2、多项式运算 在 MATLAB中,多项式可以很方便的进行运算。函数conv进行乘法运算, decoy进 行除法运算。 MATLAB没有提供特别的多项式加减法运算,因为这和向量的加减法很相似。 运算举例如下: p=conv(a, b) %乘法 c=1476 qr]= decon(c, b)%除法 %商多项式 r=0000 %余数多项式 需要注意的是,多项式除法并不一定能够除尽,很多时候需要有余数多项式 MATLAB还提供了多项式微分、估计值函数。多项式微分使用 polder(p)函数,估计值使用 polyol(pat)函数 三、数据分析 1、极小化 数值分析中,很多应用需要确定函数的极值,即最大值或者最小值。在数学上,可通过 确定函数导数为零的点解析的求出极值。但是在很多时候,很难找到导数为零的点,这样就 难以解析的求极值。必须通过树枝上寻找函数的极值。 MATLAB提供了fmin和 fmins两个 函数来求极值,它们分别寻找一维和n维函数的极值。它们的应用比较相似,以fmin为例 看如何求极值。 为了求取一维函数的极值,需要给出函数的定义和极值范围。比如求函数 f(x)=10*exp(-x)*cos(x)的极小值,可以使用下面的方法: x=10°exp(-x)°cos(x), plot(fx, [2, 5)) min=fmin(fx, 2, 5)
数字信号处理 4 则表示计算 b 的正弦值并将赋值给变量 a.。 二、多项式处理 1、多项式表示 多项式在 MATLAB 中使用降幂系数的行向量表示。例如:多项式 x 4 -12x3+0x2+25x+116 表示为:p=[1 -12 0 25 116] 需要注意的是,表示中需要包含零系数的项。按照这种形式,使用函数 roots 可以找出多项 式等于零的根:r=roots(p) r =11.74728287082272 、2.70282074384101 、-1.22505180733187 + 1.46720800872890i、 -1.22505180733187、 - 1.46720800872890I 按照 MATLAB 的规定,多项式使用行向量,根使用列向量。给出多项式的根,使用 poly 函 数也可以构造出相应的多项式: u=poly(r) pp =1.0000 -12.0000 0 25.0000 116.0000 2、多项式运算 在 MATLAB 中,多项式可以很方便的进行运算。函数 conv 进行乘法运算,deconv 进 行除法运算。MATLAB 没有提供特别的多项式加减法运算,因为这和向量的加减法很相似。 运算举例如下: a=[1 2 3];b=[1 2]; p=conv(a,b) %乘法 c =1 4 7 6 [q,r]=deconv(c,b) %除法 q = 1 2 3 %商多项式 r = 0 0 0 0 %余数多项式 需要注意的是,多项式除法并不一定能够除尽,很多时候需要有余数多项式。 MATLAB 还提供了多项式微分、估计值函数。多项式微分使用 polyder(p)函数,估计值使用 polyval(p,at)函数。 三、数据分析 1、极小化 数值分析中,很多应用需要确定函数的极值,即最大值或者最小值。在数学上,可通过 确定函数导数为零的点解析的求出极值。但是在很多时候,很难找到导数为零的点,这样就 难以解析的求极值。必须通过树枝上寻找函数的极值。MATLAB 提供了 fmin 和 fmins 两个 函数来求极值,它们分别寻找一维和 n 维函数的极值。它们的应用比较相似,以 fmin 为例 看如何求极值。 为 了 求 取 一 维 函 数 的 极 值 , 需 要 给 出 函 数 的 定 义 和 极 值 范 围 。 比 如 求 函 数 f(x)=10*exp(-x)*cos(x)的极小值,可以使用下面的方法: x='10*exp(-x)*cos(x)'; plot(fx,[2,5]) min=fmin(fx,2,5)
数字信号处理 xmin=2.35619746669214 0.2 T-- 0.2 -04} -06 0.8 152253354455 图3 上面的 fplot命令画给定函数的曲线,例子中的函数曲线为图3-3。 fplot命名在搜索极值的 过程中,不断的计算函数值,如果函数的计算量比较大,或者搜索区域内有多个极值,那么 搜索的过程可能比较长,在一些情况下,也可能找不到极值。如果flot找不到极值,即停 止运行并且提供解释。 Fmins也可以寻找极大值点,只要重新定义函数为f(x)即可。 fmins函数也是搜索极值,但它搜索向量的标量函数最小值,使用的单纯性法搜索最小值 在 MATLAB的优化工具( Optimization Toolbox)箱中,有更多的扩展的优化算法 2、求零点 寻找函数值过零或者等于某一个常数值也是十分重要的问题,比如在使用bode图判断 控制系统稳定性时,需要看幅频特性过零点和相频特性过l80°点。一般使用解析算法求解 这一问题十分困难,很多时候还是不可能的。 MATLAB提供了该问题的数值算法。函数 fzero 可以寻找一维函数的过零点。例如: zero=fzero(fx,5 zero 4.71238898038469 zero=fzero(fx, 2) 1.57079632679490 这表示f(x)函数具有两个过零点,从图中也可以看出。 Fzero函数不但可以寻找过零点,也可以寻找函数值等于常值点,只要重新定于函数为f(x)c 即可 3、积分 MATLAB提供了三个函数计算函数在有限区域内的积分: trapz、quad和quad8。函数 apz通过计算梯形面积的和近似函数的积分,函数的分割是人为地。例如 p=1.5:0.01:5; r=10*exp(-x). cos(x) rea=trapz(x,y)
数字信号处理 5 xmin =2.35619746669214 图 3 上面的 fplot 命令画给定函数的曲线,例子中的函数曲线为图 3-3。fplot 命名在搜索极值的 过程中,不断的计算函数值,如果函数的计算量比较大,或者搜索区域内有多个极值,那么 搜索的过程可能比较长,在一些情况下,也可能找不到极值。如果 fplot 找不到极值,即停 止运行并且提供解释。 Fmins 也可以寻找极大值点,只要重新定义函数为-f(x)即可。 fmins 函数也是搜索极值,但它搜索向量的标量函数最小值,使用的单纯性法搜索最小值。 在 MATLAB 的优化工具(Optimization Toolbox)箱中,有更多的扩展的优化算法。 2、求零点 寻找函数值过零或者等于某一个常数值也是十分重要的问题,比如在使用 bode 图判断 控制系统稳定性时,需要看幅频特性过零点和相频特性过 1800 点。一般使用解析算法求解 这一问题十分困难,很多时候还是不可能的。MATLAB 提供了该问题的数值算法。函数 fzero 可以寻找一维函数的过零点。例如: zero=fzero(fx,5) xzero = 4.71238898038469 zero=fzero(fx,2) xzero = 1.57079632679490 这表示 f(x)函数具有两个过零点,从图中也可以看出。 Fzero 函数不但可以寻找过零点,也可以寻找函数值等于常值点,只要重新定于函数为 f(x)-c 即可。 3、积分 MATLAB 提供了三个函数计算函数在有限区域内的积分:trapz、quad 和 quad8。函数 trapz 通过计算梯形面积的和近似函数的积分,函数的分割是人为地。例如: p=1.5:0.01:5; r=10*exp(-x).*cos(x); rea=trapz(x,y)
数字信号处理 area=-1.07578023141031 quad使用 Simpson递归方法,quad8使用 Newton- costes递归方法进行数值积分。为了获得 更精确的结果,它们在所需的区间都计算被积函数。quad8比quad更精确。这两个函数的 使用和 fzero相同。 微分 与积分相反,数值微分十分困难。积分描述了一个函数的整体或宏观的性质,所以积分 对函数的形状在小范围的变化不敏感:而微分则描述了函数在一点处的斜率,是函数的微观 性质,它对函数的微小变化十分敏感,函数的很小的变化,容易产生相邻点斜率的巨大变化。 由于数值微分的固有困难,应当尽量避免使用数值微分,尤其是树言数据获得的数据微分 如果迫切需要,最好先将试验数据进行最小二乘拟合伙这三次样条拟合,然后对拟合函数进 行微分 MATLAB提供了一个有限插分函数dif,可以做数值微分。在应用中需要注意的是,插分后 输出数组比原数组少了一个元素。实际表明,使用有限插分近似将放大噪声,导致极差的结 5、FFT变换 FFT即快速傅立叶变换,是数据分析的基本方法,它是向量X的离散傅立叶变换由基2 的快速变换算法来计算的。如果ⅹ的长度不是精确的2次幂则后面使用0填充,mx)是向 量ⅹ的离散傅立叶变换的逆变换。 在频率轴商会值FFT曲线,要明确FFT结果与实际频率点的关系。设N个数据点,采样频 率为fs,则 Nyquist频率或n=N2+1点与实际频率的关系为 f(num-1)"fs/n 例如:绘制向量x的频谱 =ff n= ength(y)2,%FFT变换是对称的,取前半部分 f=fs*(O: n-1)/n plot(f, abs(y)); plot(f, (180/pi)*unwrap(atan2(imag(y), real(y))); 需要注意的是ft结果为复数矩阵,为了得到幅频特性,可使用abs函数,使用atan2得到相 角,由于有的系统的相角可能大于180°,而相角函数值域在-180180之间,需要使用 unwrap 函数展开折叠的相角,从而得到相频特性。 6、数据分析函数 MA∏LAB提供了很多有用的数据分析函数,这些函数数量极大,需要慢慢发掘。下面 给出一些常用的函数: 函数名 含义
数字信号处理 6 area =-1.07578023141031 quad 使用 Simpson 递归方法,quad8 使用 Newton-costes 递归方法进行数值积分。为了获得 更精确的结果,它们在所需的区间都计算被积函数。quad8 比 quad 更精确。这两个函数的 使用和 fzero 相同。 4、微分 与积分相反,数值微分十分困难。积分描述了一个函数的整体或宏观的性质,所以积分 对函数的形状在小范围的变化不敏感;而微分则描述了函数在一点处的斜率,是函数的微观 性质,它对函数的微小变化十分敏感,函数的很小的变化,容易产生相邻点斜率的巨大变化。 由于数值微分的固有困难,应当尽量避免使用数值微分,尤其是树言数据获得的数据微分。 如果迫切需要,最好先将试验数据进行最小二乘拟合伙这三次样条拟合,然后对拟合函数进 行微分。 MATLAB 提供了一个有限插分函数 diff,可以做数值微分。在应用中需要注意的是,插分后 输出数组比原数组少了一个元素。实际表明,使用有限插分近似将放大噪声,导致极差的结 果。 5、FFT 变换 FFT 即快速傅立叶变换,是数据分析的基本方法,它是向量 X 的离散傅立叶变换由基 2 的快速变换算法来计算的。如果 X 的长度不是精确的 2 次幂则后面使用 0 填充,lfft(x)是向 量 x 的离散傅立叶变换的逆变换。 在频率轴商会值 FFT 曲线,要明确 FFT 结果与实际频率点的关系。设 N 个数据点,采样频 率为 fs,则 Nyquist 频率或 n=N/2+1 点与实际频率的关系为: f=(num-1)*fs/n 例如:绘制向量 x 的频谱: y=fft(x); n=length(y)/2; %FFT 变换是对称的,取前半部分 y=y(1:n); f=fs*(0:n-1)/n; plot(f,abs(y)); figure; plot(f,(180/pi)*unwrap(atan2(imag(y),real(y)))); 需要注意的是 fft 结果为复数矩阵,为了得到幅频特性,可使用 abs 函数,使用 atan2 得到相 角,由于有的系统的相角可能大于 1800,而相角函数值域在-1800~1800 之间,需要使用 unwrap 函数展开折叠的相角,从而得到相频特性。 6、数据分析函数 MATLAB 提供了很多有用的数据分析函数,这些函数数量极大,需要慢慢发掘。下面 给出一些常用的函数: 函数名 含义
数字信号处理 max 最大值 min 最小值 mean 均值 标准方差 sedan 排序分类 元素的总和 元素的乘积 cumrod 元素的累积 cumsum 元素的累加和 Dift 差分函数 Hist 直方图 Tabel 列表 Corr 互相关矩阵 协方差矩阵 Find 查找逻辑 这些函数可以灵活应用,比如在生成Bode图的频率序列时,使用 logspace直接得到了对数 等间距的序列,如果想插入几点自己需要的频率点,可以使用下面的命令 p=logspace(0, 2, 100) [1.5345678] t =sort(x fD) 这样生成的频率点集合xf中不但含有1到100的对数等间隔频率点,还包含了频率f中的 四个频率点,这个频率在绘制有尖锐幅频特性的bode图时十分有用
数字信号处理 7 max 最大值 min 最小值 mean 均值 std 标准方差 sedian 中值 sort 排序分类 sum 元素的总和 prod 元素的乘积 cumrod 元素的累积 cumsum 元素的累加和 Diff 差分函数 Hist 直方图 Tabel 列表 Corr 互相关矩阵 Cov 协方差矩阵 Find 查找逻辑 这些函数可以灵活应用,比如在生成 Bode 图的频率序列时,使用 logspace 直接得到了对数 等间距的序列,如果想插入几点自己需要的频率点,可以使用下面的命令: p=logspace(0,2,100); r=[1.5 3.4 56 78]; t=sort([x f]); 这样生成的频率点集合 xf 中不但含有 1 到 100 的对数等间隔频率点,还包含了频率 f 中的 四个频率点,这个频率在绘制有尖锐幅频特性的 bode 图时十分有用
数字信号处理 四、常微分方程数值解 控制系统的模型很大一部分是常微分方程形式的,求取它们的解析解比较困难,一般使 用数值解。常微分方程数值解一般使用逐步积分的方法实现, Runge-Kutta法是应用最多的 种微分方程数值解的方法。 MATLAB提供了两种 Runge-Kutta法函数 It, x]=ode23(fun? tO, tf, xO, tol, trace) It, x]F=ioe45(fun?, to, tf, xo, tol, trace) 这两种方法格式相同。其中xfun为定义的常微分方程函数名,该函数必须以为输出,以 t、x为输入。输入变量t0、t为积分的启始和中止时间,单位是秒。x0为初始的状态向量。 tol控制结果的精度,可以缺省。一般来说,ode45比ode3运算速度快一些 考虑描述经典的 Var der pol微分方程 a24(1-x x dt 求解中将这高阶方程等价变换为一阶方程组,重新定义变量,变换为 令x1=xx2=d/dt 则dldt=x2 dx2/dt=u(1-x12)x2-x1 把它写成函数: function yp=vdp(t, x) yp(2)=2+(1-x(1)^2)*x(2}x(1)%令 在命令行求解这个方程 [tx]=ode45(dp?0,20,[1;1); plot(t, x(, 1 ), t, x(, 2) %画出x和dx/dt的时域波形+图x和d/dt的时域波形
数字信号处理 8 四、常微分方程数值解 控制系统的模型很大一部分是常微分方程形式的,求取它们的解析解比较困难,一般使 用数值解。常微分方程数值解一般使用逐步积分的方法实现,Runge-Kutta 法是应用最多的 一种微分方程数值解的方法。MATLAB 提供了两种 Runge-Kutta 法函数: [t,x]=ode23(fun?t0,tf,x0,tol,trace) [t,x]=ioe45(fun? ,t0,tf,x0,tol,trace) 这两种方法格式相同。其中 xfun 为定义的常微分方程函数名,该函数必须以 为输出,以 t、x 为输入。输入变量 t0、tf 为积分的启始和中止时间,单位是秒。x0 为初始的状态向量。 tol 控制结果的精度,可以缺省。一般来说,ode45 比 ode23 运算速度快一些。 考虑描述经典的 Var der Pol 微分方程 求解中将这高阶方程等价变换为一阶方程组,重新定义变量,变换为: 令 x1=x x2=dx/dt 则 dx1/dt=x2 dx2/dt=u(1-x12 )x2-x1 把它写成函数: function yp=vdp(t,x) yp(1)=x(2); yp(2)=2*(1-x(1)^2)*x(2)-x(1); %令 u=2 在命令行求解这个方程: [t,x]=ode45(dp?0,20,[1 ;1]_); plot(t,x(:,1),t,x(:,2)); %画出 x 和 dx/dt 的时域波形+图 x 和 dx/dt 的时域波形
数字信号处理 第二部分: 一数字信号处理与 MATLAB语言基础 11简介 MATLA B是一套用于科学工程计算的可视化高性能语言与软件环境它集数值分析,矩阵 运算,信号处理和图形显示于一体构成一个界面友好的用户环境在这个环境中问题与求解 都能方便地以数学的语言(主要是矩阵形式)或图形方式表示出来 MATLA B的含义是矩阵实验室( Matrix Laboratory),该软件是一个交互式系统,其基本元素 是无需定义维数的矩阵萦研制的初衷主要是方便矩阵的存取但以过几十年的扩充和完善,已己 成为和各类科学研究与工程应用中的标准工具,其典型应用有数值分析,算法分析,自动控制 数字信号处理,图像处理以及模型仿真等等. MATLAB包括了被称为 Toolbox(工具箱)的各类应用问题的求解工具,本书着重介绍其中 的信号处理工具箱 MATLAB信号处理工具箱包含了各类经典的和现代的数字信号处理技术 是一个非常优秀的算法研究与辅助设计工具,它在语音信号处理,生物医学工程,实时控制和 雷达信号处理等多个研究领域得到成功的应用 本章将简要地介绍 MATLAB的基本知识为后面章节中信号处理的理解和学习打好基础, 本书的所有介绍都以 MATLAB6.1版本为基础如使用其他版本,可能有所不同 12 MATLAB快速入门 1.2.1启动 MATLAB有两种方法 (1)在 WINDOW9598/200NT40下,单击任务条上的"开始"按钮,选择"程序"”子菜单,再 选择" MATLAB"程序组,最后单击 MATLAB6.1"菜单项,就可以启动 MATLAB,由于在安装了 MATLAB软件后会自动在桌面上添加一个图标" MATLAB6.",故也可以直接双击该图标以 MATLAB ()在 WINDOWS95/982000NT40下,单击任务条上”开始"按钮,选择"运行"菜单项,然后 在"运行"对话框内输入" MATLAB"命令,然后点击"确定"按钮,就可以 MATLAB 以上两种操作的结果都会出现一个 MATLAB的命令窗口,其命令提示符为"? 122 MATLAB命令窗口与基本的矩阵操作 MA∏LAB命令窗口中,在 MATLAB提示符下要输入一个4*4矩阵可以按如下方式输入 命令 X=[1234;543234567654] 或 X=[1234 5432 456 7654] 以上两种输入方式的效果是一样的,命令未尾的分号用于禁止显示该命令的执行结 果如果去掉分号 MATLAB就会显示如下的命令的执行结果 X=[123454323456;7654 234
数字信号处理 9 第二部分: 一 数字信号处理与 MATLAB 语言基础 1.1 简介 MATLAB 是一套用于科学工程计算的可视化高性能语言与软件环境.它集数值分析,矩阵 运算,信号处理和图形显示于一体,构成一个界面友好的用户环境,在这个环境中,问题与求解 都能方便地以数学的语言(主要是矩阵形式)或图形方式表示出来. MATLAB 的含义是矩阵实验室(Matrix Laboratory),该软件是一个交互式系统,其基本元素 是无需定义维数的矩阵萦研制的初衷主要是方便矩阵的存取,但以过几十年的扩充和完善,已 成为和各类科学研究与工程应用中的标准工具,其典型应用有:数值分析,算法分析,自动控制, 数字信号处理,图像处理以及模型仿真等等. MATLAB 包括了被称为 Toolbox(工具箱)的各类应用问题的求解工具,本书着重介绍其中 的信号处理工具箱.MATLAB 信号处理工具箱包含了各类经典的和现代的数字信号处理技术, 是一个非常优秀的算法研究与辅助设计工具,它在语音信号处理,生物医学工程,实时控制和 雷达信号处理等多个研究领域得到成功的应用. 本章将简要地介绍 MATLAB 的基本知识,为后面章节中信号处理的理解和学习打好基础, 本书的所有介绍都以 MATLAB6.1 版本为基础,如使用其他版本,可能有所不同. 1.2.1 MATLAB 快速入门 1.2.1 启动 MATLAB 有两种方法 (1)在 WINDOW95/98/2000/NT4.0 下,单击任务条上的"开始"按钮,选择"程序"子菜单,再 选择"MATLAB"程序组,最后单击"MATLAB6.1"菜单项,就可以启动 MATLAB,由于在安装了 MATLAB 软件后,会自动在桌面上添加一个图标"MATLAB6.1",故也可以直接双击该图标以 MATLAB. (2)在 WINDOWS95/98/2000/NT4.0 下,单击任务条上"开始"按钮,选择"运行"菜单项,然后 在"运行"对话框内输入"MATLAB"命令,然后点击"确定"按钮,就可以 MATLAB. 以上两种操作的结果都会出现一个 MATLAB 的命令窗口,其命令提示符为"?". 1.2.2 MATLAB 命令窗口与基本的矩阵操作 MATLAB 命令窗口中, 在 MATLAB 提示符下要输入一个 4*4 矩阵可以按如下 方式输入 命令: X=[1 2 3 4; 5 4 3 2 ;3 4 5 6;7 6 5 4]; 或 X=[1 2 3 4 5 4 3 2 3 4 5 6 7 6 5 4 ]; 以上两种输入方式的效果是一样的,命令未尾的分号用于禁止显示该命令的执行结 果,如果去掉分号,MATLAB 就会显示如下的命令的执行结果: X=[1 2 3 4;5 4 3 2;3 4 5 6;7 6 5 4] X= 1 2 3 4
数字信号处理 5432 3456 要察看X变量的内容,也可以直接输入法X,按回车 MATLAB的显示与上面的结果似如果要 引用X的某几行(以第二,三行为例,则 X([2,3],) ans- 5432 3456 如果要引用X的某几列(以第二,三,四列为例),则 234 456 654 要表示一个递增右递减的序列可以用冒号,其格式为 此式表示产生从n到m且步长为s的一系列值当s省略时,默认步长为1,在前面的取x 的列的例子中我们己经用到了该方法现在如果要倒过来取列为43,2,且行为3,2,1的值,那么 命令如下 x(3:-1:1,4:-1:2) ans=6 5 4 234 432 求一个矩阵的转置,命令如下 ans- 1537 2446 3355 4264 要求矩阵X的逆命令如下(本例中的X的矩阵已为奇异阵求逆的结果已无意义) MATLAB除了基本的标量运算外,还有各种矩阵运算与数组运算 矩阵与矩阵,矩阵与标量的加法减法,和乘法在形式上与标量运算类似只是当矩阵与矩阵 作相应的运算时,要求维数相互匹配有时需要对矩阵进行必要的转置操作,这属于线性代数 的基础知 MATLAAB为矩阵的除法提供了两种运算,左除()和右除(,如果a为一非奇异矩阵则ab 和bla分别等价于 a/b=inv(a)b b/a=b*inv(a)
数字信号处理 10 5 4 3 2 3 4 5 6 7 6 5 4 要察看 X 变量的内容,也可以直接输入法 X,按回车,MATLAB 的显示与上面的结果似,如果要 引用 X 的某几行(以第二,三行为例),则 X([2,3],:) ans= 5 4 3 2 3 4 5 6 如果要引用 X 的某几列(以第二,三,四列为例),则 x(:,2:4) ans= 2 3 4 4 3 2 4 5 6 6 5 4 要表示一个递增右递减的序列,可以用冒号,其格式为 n:s:m 此式表示产生从 n 到 m 且步长为 s 的一系列值,当 s 省略时,默认步长为 1,在前面的取 x 的列的例子中我们已经用到了该方法,现在,如果要倒过来取列为 4,3,2,且行为 3,2,1 的值,那么 命令如下: x(3:-1:1,4:-1:2) ans= 6 5 4 2 3 4 4 3 2 求一个矩阵的转置,命令如下: x' ans= 1 5 3 7 2 4 4 6 3 3 5 5 4 2 6 4 要求矩阵 X 的逆,命令如下(本例中的 X 的矩阵已为奇异阵,求逆的结果已无意义): y=inv(x) MATLAB 除了基本的标量运算外,还有各种矩阵运算与数组运算. 矩阵与矩阵,矩阵与标量的加法,减法,和乘法在形式上与标量运算类似,只是当矩阵与矩阵 作相应的运算时,要求维数相互匹配,有时需要对矩阵进行必要的转置操作,这属于线性代数 的基础知识. MATLAAB 为矩阵的除法提供了两种运算,左除(\)和右除(/),如果 a 为一非奇异矩阵,则 a\b 和 b\a 分别等价于: a/b=inv(a)*b b/a=b*inv(a)