第一章绪论 第一节数字信号处理概述 数字信号处理,或者说对信号的数字处理,是60年代前后发展起来的一门新兴学科。进入 70年代以来,随着电子计算机、大规模集成电路(LS)和超大规模集成电路(VISI),以及微处 理器技术的迅猛发展,数字信号处理无论在理论上还是在工程应用中,都是目前发展最快的学 科之一,并且日趋完善和成熟。 由于数字计算机和大规模集成电路的发展和普及,有人似乎认为现在是“数字万能”的时 代了,这是一种偏见。作为一次信息源,或称为原始信号源,例如语音、图像等模拟信号,它的重 要性今后也不会改变。然而,数字技术的发展却为模拟信号的数字处理开辩了广阔的前景。对 数字信号处理没有一个严格的定义,我们不妨把用包括软件在内的数字技术来处理摸拟信号 叫做数字信号处理。或者简单地说,数字信号处理就是用数字的方法对信号进行变换和处理。 从学科的内容看,数字滤波器和快速傅里叶变换是数字信号处理的两个最重要的学科分 支,也是数字信号处理的核心内容。如果仅仅用数字滤波器代替某个系统中的模拟滤波器,则 还不能充分发挥数字技术的特长。事实上,对信号进行调制、滤波、变换,增强、压缩、检测、估 计、识别等,都是数字信号处理的研究范围.用数字的方法实现具有各种功能的信号处理系统, 可以使系统做到更加经济和小型化,进而有可能实现过去用模拟技术难以实现的各种功能。 图1-1给出了模拟信号数宁化处理系统的简化框图。此系统先将模拟信号变换为数字信 号,经数字信号处理后,再变换成模拟信号输出。其中抗混叠滤波器的作用,是将输入信号x() 中高于折叠频率(其值等于采样频率的一半)的分量滤除,以防信号频谱的混叠。随后,信号经 采样和AD变换后,变成数字信号x()。数字信号处理器对x()进行处理,得到输出数字信 号y(),经D/A变换器变成模拟信号。此信号经低通滤波器,滤除不需要的高频分量,最后输 出平滑的模拟信号y(t)。 抗混漫 数字信号 低通 () D/A 滤液器 A/D 处理器 遊波器 图1-1数字信号处理系统的简化框图 实际的数字信号处理系统并不定要包括图1-1所示的所有方框。有些系统只需数字信 号输出,就不需要D/A变换器;有些系统的输入已经是数学信号,那么就不需要A/D变换器: 对于纯数字系统,则只需要数字信号处理器这核心部分就行了。 目前,数字信号处理技术已广泛应用于数字通信、雷达、遥感,声纳、语音合成、图像处理、 测量与控制、高清晰度电视、数字音响、多媒体技术,地球物理学、生物医学工程、振动工程,以 及机器人等各个领域,而且随着科学技术的发展,其研究范围和应用领域还在不断地发展和扩 大
信号是如何被处理的? 我们任实际中所遇到的信号大部分是模拟信号:它的幅度随时间连续地变化。通常州 巾无源或行源器件组成的电网络对它们作处理。人所共知,这种方法称为模拟信号处理 (ASP):例如尤线电和电视接收机 模拟们号:x(t)=之模拟信号处理器→模拟信号y(t) 它]也可以用包括加法器、乘法器、和逻辑元件或用微处理器组成的数字硬件来处理。何 是必须先把模拟信号变成适合于数字使件米处弹的形式。这样的信号形式称为数宁信号。它 在一定的时间问隔内只取有限数目的数值之一,内而它能用进制数或位来表示。数字信号 的处理称为DSP,它用框图表示: 一等效模拟信号处理器 模拟三 PF+[ADC→(数字)-→DsP→(数字)DAC→Po 模拟 离散系统 图中各个方框的意义介绍如下: PF:这是-·个前置滤波器或反泄漏滤波器,它限制了模拟信号以防止泄漏。 ADC:模-数转换器,它由模拟信号生出一个_进制流 数字信号处理器:这是SP的心脏,它可以代表一个通用计算机或专州处器,或数字 硬件等等。 DAC:这是AD(的逆运算,称为数-模转换器,它I-个进制流产生一个阶梯波形,作 为形成模拟信号的第一步。 PoF:这是个置滤波器,它把阶梯波形平滑成为预州的模拟信号。 从.上面两种信号处理的方法中可以看到,DSP方法比看米简单的ASP力法更加复杂,包 括更多的元件。因此人要问:为什么些用数学方法处理信号?答案在于DSP带来的很多优 点c DSP胜于ASP的优点 ASP的主要缺点是在作复杂信号处理时只有有限的能力。这造成了处理的不灵活性和 系统时间的复杂性。这也造成了品的昂贵。另方面,采用DSP方法,它可以把一个便宜 的个人十算机变成·个强大的信号处理器。DSP的-些甫要的优点如下: 1.用DSP方法的系统的开发可以用通用计算机上的软件来进行。因此DSP比较容易开 发和测式,而软件是可移枯的。 2.DSP运算是单纯地基于加法和乘法,这导致特别稳定的处单性能—例如不受温度影 响e 3,DSP运算可方使地作实时的修改,通常!要改变程序,或对嵛行器重新加载。 4.H于超人规模集成电路(V1S1)降低了存储器、门、微处理器等等的价格,DSP比较便 2
TLe DSP的主要缺点是运算速度低,特别是对很高频的信号。主要由于它的上述优点,DSP 现在已是许多技术和应州中的首选方法,诸如消费电子、通信、无绳电话和医学图象等。 DSP的两个重要类别 大部分DSP运算可分为信号分析任务和信号滤波任务两类,图示如下: 数学信号 分析 数字滤波 测量 数字信号 信号分析木任务涉及信号特性的测量。它通常是个频域的运算。它的些应用为: 谱(频率和/或相位)分析 ¥语音分析 说话人识别 *目标检测 信号滤波本任务的特征是“信号入-信号出”的情况。实现这个任务的系统通常被称为 滤波器。它通常(但不总是)作时域运算。它的-一些用途为: *滤除不需要的背景噪声 去除于扰 频带分割 ¥信号谱的成形 在某些应用中,例如语音合成,肖先要对信号进行分析,研究它的特征。然后再用数宁 滤被器中米产生合成的声音。 本书的前半部讨论DSP的信号分析部分。在第二章中,我们从离散信号和系统的描述开 始。第三章对这些信号和系统在频域进行了分析。第四章介绍了频域描述的普遍方法一称 为变换。第章讨论了计算时利叶变换的实际算法,包括离散付利叶变换和快速付利叶变 换: 本书的后半部讨论DSP的信号滤波方面。在第六章中我们描述了数字滤波器的不问状 态和结构。在第七章中给出了一种滤波器一有限长度脉冲响应(FIR)滤波器的设计技术和 算法。而在第八章中给出了另一种称为无限长度脉冲响应(川R)滤波器的设计方法。在这两 章中,我们只讨论滤波器设计中简单而实用的技术,没有讨论更先进的技术。最后,在最末两 章以设计任务的形式给出了一些实际应用题,它可以用前八章所学的内容来完成。第九章 介绍了A适应滤波,讨论了系统辨识、十扰抑制、自适应线路信号增强等等的简单设计任务。 第十章给出了数字通信的~个简单的介绍,并给出行关PCM、DPCM和LPC等方血论题的设
计任务: 在所各章中,中心主题是聪明地成用和适当地演小MATLAB工.具。对巴有的DSP中 人多数的MATLAB断数都作了详细的说明,并在许多例子中演示了如何正确地使州它们。 此外还开发了诈多新的MAT1AB函数,以便深人领会·些算法工作的内湖。我们州,这种 亲自动下的方法将能使学牛去除对SP的害怕心理并提供卡宜的学习经验。 关于MATI.AB的一此说明 MAT1,AB是一种交万式的以矩阵为基础的系统,它用于科学和工程的计算与可视化。它 的力量在于它只需用其他编程语言(如!ORTRAN或C)的儿分之·的时问即可方便地解决 复杂的数伯计算问题:它的强行力也在于它那州对简单的编程功能。MATI.AB很容易扩展 和创造新的命令和数。 MATl.AB能在很多计算环境下运行:Sun/HP/VAXstation工作站、80x86PC、Apple Mac- intosh,YAX和-些并行计算机。MATLAB的基本程序心经由于近年来出现的大量的T具箱 (即对某一专题开发的函数集)而得到进·步的加强。本移巾的息一般均适用所行上述环 境本的开发开始于在DOS下运行的MATLAB3.5专业版。比较便宜包含较少的了具箱 和数的学生版也由Prentice-Hall出版社提供了。内此我们决定使木书中开发的MATLAB 程序和其他内容能与学生版兼容:然而当前的主流版本已经是其有图形印界而的MAT- 【,AB4.2版,山包含了增强了的新门具箱的具行图形用界面(CUI)的新的学生版也已于 995年2月推出,本书也完全与这个版本兼容。我!尽了城大努力来弄清那些存在而叮用的 新数。在学版中新加了-个符号运算(Symbolic)工具箱,它是基于MAP,E的。因为数 字信号处理主要用到数值计算,在本书中既未讨论也未用到符步运算工具箱。 MATLAB的范围和能力远远超过了在本节中说的这些。再给山MATLAR的详细的信 息和教材是没有意义的,因为在这个论题上已经有很多的优秀籍和手册可用了。学生应该 参阅MAT1,AB用户于册[2]和参考于册[1]。同样,学生应该尝试「3|中的教科B。上面所给 的参考书中的信息,以及在线帮助的文件,通常对使用本书的学已是足够了。 4
第二章 离散时间信号和系统 我们从离散时间的信号和系统开始研究。木章将介绍许多重要类型的信号和它」的运 算。线性和时不变系统讨论得最多因为它们最容易分析和实现。对卷积和差分方程表示式给 予了特别的注意,因为它们在数字信号处理和MATLAB中的重要性。本章的重点是用 MATi,AB表示和实现信号和系统。 离散时间信号 信号可以粗略地分为模拟信号和数字信号。模拟信号将用x()表示,其中变量:可以表 示任何物理量,但我们假定它代表以秒为单位的时间。离散信号用x(n)表示。其中变量n 为整数并代表时间的离傲时刻。因此它也称为离散时间信号。他是一个数字的序列并可用以 下符号之一来表述: x(n)={x(n)}={.,x(-1),x(0),x(1),.} 其中,向上的箭头表示在n=0处的取样。 在MATLAB中,我们可以用一个列向量来表示一个有限长度的序列。然这样·个向 量并没有包含采样位置的信息。因此,x(n)的止确表示方式应该包括分别表示x和n两个 向量。例如序列x(n)=2,1,-1,0,1,4,3,7}在MATLAB中表示为: >>n=[-3,-2,-1,0,1,2,3,41;x=[2,1,-1,0,1,4,3,7]; 当不需要采样位置信息或这个信息是多余的时候(例如该序列从=0开始),我们可以 只用x向量来表示。出于有限的内存,MATLAB无法表示·个任意无限序列。 序列的类型 为了分析的需要,在数字信号处理中用了一些基本的序列。它们的定义和MATLAB表 达式如下: 1.单位采样序列 s-628-{0.0o.0 在MATLAB中,函数eos(1,V)产生一个由N个零组成的列向量。它可用来实现有限
区间的6(n)。然而,更高明的方法是利用逻辑关系式n==0米实现6(n)。例如,要实现 [1,n=no 8(n-na)= l0,n≠no 在n1≤no≤n2区间内的值,我们可州如下的MATLAR听数: function x,n]impseg(no,nl,n2) %Generates x(n)=della(n-no);nl n =0。在n1≤no≤n2区间内实现。 [1,n≥no u(n-no)= 1O,n=0]; 3.实数指数序列: x(n)=a”,Vn;a∈ 在:4:”:,屮,要用数组运算符“.”来实现一个实指数序列。例如要实现序列x()= 6
(0.9)n,0≤n≤10。应该用下列MATLAB程序: >>n=[0:10];x=(0.9).n; 4.复数指数序列: x(n)=elativon,yn 其中o称为阻尼系数而w0是以弧度为单位的角频率。MATI.AB函数exp可用来产生指 数序列。例如要产生x(n)=exp[(2+3)n],0≤n≤10,可以用下列MATLAB程序: >>n={0:10]:x=exp(2+3j)*n): 5.正余弦序列: x(n)=cos(won +0),n 其中B为以弧度为单位的相角。MATLAB函数cs(或sin)可用米产生正余弦序列。例 如,要产生x(n)=3cos(0.1πn+π/3)+2sin(0.5πn),0≤n≤10,应该用下列MATI,AB程 序。 >>n=[0:10];×=3*cos(0.】*pi*n+pi/3)+2米8in(0.5¥pi*n): 6.随机序列:许多实际的序列是不能像上面那样用数学式来描述的。这些序列称为随机 或S1 achastic序列并用相应的概率密度函数或统计矩来表征。在MATLAB中,有两种(伪)随 机序列可用。rand(1,N)产生其元茶在[0,1]之间均匀分布而长度为N的随机序列。randn (1,N)则产生均值为0,方差为1,长度为N的高斯随机序列。其他的随机序列都可用这两种 函数的变换得到。 7.周期序列:如果序列x(n)=x(n+W),Vn则x(n)称为周期的。满足上述关系的最 小数N称为基本周期。我们用元(n)来表示周期序列。要从-个周期1x(n),0≤n≤N-1} 产生有P个周期的序列x(n),可以把它复制P次: >xtilde =[x,x,....x]; 何是高明的方法是利用MATLAB的强有力的下标能力。先产生一个包含P行x()值 的矩阵,然后用结构(:)来把它的P行串接起来战为一个长行,不过这种结构只能用于列向。 所以我们往往还要用矩阵转置来把它扩展到行向。 >>xtilde=x'*ones(1,P);%P列x;x是一个行向量 7
>xtilde xtilde(:) %长的列向量 >xtilde=xtilde'; %长的行向量 注意后两行可合成一条命令以缩短代码,这可从例2.1中看到。 对序列的运算 这里将简要地介绍序列的基本运算和它们的MATLAB等效程序。 1.信号相加:这是一种对应的样本与样本之间的相加。表为: 1x1(n)}+{x2(n)f=1x1(n)+x2(n)1 在MATI,AB中它可用算术运算符“+”实现。然而x1(n》和x2(n)的长度必须相等。如 果序列长度不等,或者长度虽然相等但采样的位置不同,就不能用运算符“+”了。我们必须首 先给x1、n》和x2(n)以适当的参数使它们有同样的位置向量n(因而也有同样的长度)。这 需要非常注意MATLAB的下标运算。特别是逻辑与运算“&”,关系运算如“=min(nl))&(nmin(n2))(n<max(n2))==1))=x2; %具有y(n)的长度的x2 y=y1+y2; %序列相加 它的应用在例2.2中叙述。 2.信号相乘:这是对应采样值之间的相乘(即“点”乘),表为: Ix(n).x2(n)=1x1(n)x2(n) 在MAT1AB中,它由数组运算符“.*”实现。但它受到“+”运算符同样的限制。因此必 8
须建立一个新的与sigadd相仿的sigmult函数: function [y,n]=sigmult(x1,nl,x2,n2) %实现y(n)=x1(n)*x2(n) % %[y,n]sigmult(x1,n1,x2,n2) %y=在包括nl和n2的n上求和序列 %x1=长为nl的第一个序列 %x2=长为n2的第二个序列(n2可与n1不等) % n=min(min(nl),min(n2):max(max(nl),max(n2));%y(n)的长度 yl=zeros(1,length(n));y2=yI; %初始化 yl(find((n>=min(nl))&(n=min(n2))&(n<=max(n2)==1)=x2;%其有y(n)的长度的x2 y=yl.y2; %序列相乘 其他判法也在例2.2中给出。 3.倍率:在此运算中,每个采样值乘以一个常数a alx(n)=ax(n) 在MATLAB中可用算术运算符“”来实现倍率运算。 4.移位:在这个运算中,x(n)的每一个样本都移动k个周期,移位后的序列y(n)。 y(n)=1x(n-k) 若令m=n-k,因而n=m+k,上述运算化成: y(m+k)=x(m) 州为这-一运算并不影响向量x,但是向量却因为每个元素都加了个k而变化了。这 些可在sigshift函数中看到: function [y,n]=sigshift(x,m,n0) %实现y(n)=x(n-n0) % [y.n]=sigshift(x,m,no) % n=m n0;y=x; 9
它的用法在例2.2中给出。 5.折叠:在这个运算中,x(n)的每个样本都对t=0翻转,得到一个折叠后的序列y(n)。 y(n)=ix(-n) 在MATLAB中,这-运算对采样值出iplr(x)函数实现,而i对采样位置则出-fliplr(n) 得到,这可从函数sigfold中看到。 function [y,n]=sigfold(x,n) %实现y(n)=x(-n) %·一 %[y,n」=sigfold(x,n) o y=fliplr(x);n=-fliplr(n); 6.样本和:本运算和信号相加运算不同,它把n1和n2之间所有的样本x(n)加起来: x(n)=x(n)+·+x(n2) 它由surm(x(n1:n2)函数实现。 7.样本积:本运算和信号柑乘运算不同,它把n1和2之间所有的样本x(n)乘起来: iix(a)=x(nm)x…×x(m) 它动prod(x(n1:n2)函数实现。 8.信号能量:序列x(n)的能量由下式给出: Ex= ∑x(n)x(n)=∑1x(n)2 其中上标表示共轭转置运算。有限长度序列的能量可用以下的MATLAB命令求得: >>Kx=sum(x·共conj(x);%一种方法 >>Ex=sum(abs(x).~2);%另一种方法 9,信号功率:基本周期为N的周期序列的平均功率由下式求得: 10