数字信号处理 第一部分: 绪论 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)