书海网短评:
本书内容分为三部分。第一部分是介绍数字信号处理中的Z变换、离散傅里叶变换DFT和快速傅里叶变换FFT以及数字滤波器,这是数字信号处理的基础,也是初学者问题zui多的部分。在该部分中对于常出现的问题都列举案例说明错误发生的
《MATLAB数字信号处理85个实用案例精讲:入门到进阶》内容分为三部分。第一部分是介绍数字信号处理中的Z变换、离散傅里叶变换DFT和快速傅里叶变换FFT以及数字滤波器,这是数字信号处理的基础,也是初学者问题zui多的部分。在该部分中对于常出现的问题都列举案例说明错误发生的原因和解决的方法。第二部分介绍数字信号处理中常用的一些方法,例如包络、平滑、极值等,又给出对DFT延伸中的一些方法和应用,并给出FFT的内插和谐波参数的估算等。第三部分介绍了功率谱的估算,给出了非参数法和参数法的功率谱估算。各章都结合内容给出相应的案例进行说明。
《MATLAB数字信号处理85个实用案例精讲:入门到进阶》特点是主要通过案例说明在数字信号处理基础部分编程中常出现的错误和解决方法。《MATLAB数字信号处理85个实用案例精讲:入门到进阶》适用于数字信号处理的初学者,亦可供高年级本科生、研究生和科研工程技术人员参考。
宋知用,曾在中国科学院声学研究所工作20多年,长期从事电声信号和数字信号处理工作。具有十余年的MATLAB编程经验,出版的图书有《MATLAB数字信号处理85个实用案例精讲——入门到进阶》和《MATLAB在语音信号分析和合成中的应用》。过去十余年中,宋知用一直活跃在MATLAB中文论坛及其他科技平台中,至今已回答并解决各种数字信号处理问题逾4000个。
第1章Z变换和离散傅里叶变换………………………………………………………………1
1.1Z变换……………………………………………………………………………………1
1.1.1Z变换的表示式…………………………………………………………………………1
1.1.2Z变换的收敛域…………………………………………………………………………3
1.1.3基本Z变换对…………………………………………………………………………4
1.1.4线性系统的Z变换………………………………………………………………………5
1.1.5Z变换特性……………………………………………………………………………5
1.1.6Z逆变换………………………………………………………………………………6
1.2DFT的由来………………………………………………………………………………9
1.3DFT的性质……………………………………………………………………………13
参考文献………………………………………………………………………………………15
第2章快速傅里叶变换和频谱分析…………………………………………………………16
2.1快速傅里叶变换(FFT)…………………………………………………………………16
2.1.1基2时间抽取FFT算法………………………………………………………………17
2.1.2基2频率抽取FFT算法………………………………………………………………19
2.1.3快速傅里叶逆变换(IFFT)算法…………………………………………………………22
2.1.4案例2.1:快速傅里叶变换的MATLAB函数……………………………………………22
2.1.5案例2.2:如何经IFFT后得到实数序列………………………………………………26
2.1.6案例2.3:如何使实数序列在时间域上位移后也为实数序列……………………………31
2.2离散信号的谱分析………………………………………………………………………38
2.2.1案例2.4:频谱图中频率刻度(横坐标)的设置…………………………………………39
2.2.2案例2.5:如何计算正弦信号的幅值和初始相角…………………………………………42
2.2.3案例2.6:怎样认识一个单频的正弦信号的相位谱………………………………………45
2.2.4案例2.7:为什么FFT后得到的频谱大部分都为0……………………………………48
2.2.5案例2.8:如何把频谱图的纵坐标设置为分贝刻度………………………………………50
2.2.6频谱分析过程中的混叠现象、栅栏现象和泄漏现象………………………………………53
2.2.7案例2.9:同样经矩形窗截断,为什么有的发生泄漏而有的没有发生泄漏…………………56
2.2.8窗函数………………………………………………………………………………58
2.2.9案例2.10:加窗函数后频谱幅值变了,如何修正…………………………………………61
2.2.10分辨率………………………………………………………………………………63
2.2.11案例2.11:如何选择采样频率和信号长度……………………………………………65
2.2.12案例2.12:FFT中的补零问题…………………………………………………………67
2.2.13快速卷积和快速相关…………………………………………………………………73
2.2.14案例2.13:能否用循环相关计算延迟量………………………………………………79
参考文献………………………………………………………………………………………84
第3章数字滤波器的设计……………………………………………………………………85
3.1数字滤波器基础…………………………………………………………………………85
3.1.1数字滤波器的传递函数………………………………………………………………85
3.1.2数字滤波器的频率响应分析……………………………………………………………87
3.1.3数字滤波器的分类……………………………………………………………………88
3.1.4数字滤波器的构成……………………………………………………………………90
3.2典型模拟低通滤波器……………………………………………………………………93
3.2.1巴特沃斯模拟低通滤波器………………………………………………………………93
3.2.2切比雪夫Ⅰ型和Ⅱ型模拟低通滤波器…………………………………………………94
3.2.3椭圆型模拟低通滤波器………………………………………………………………96
3.2.4模拟原型低通滤波器的频率变换………………………………………………………97
3.2.5模拟滤波器设计的MATLAB函数……………………………………………………97
3.2.6案例3.1:巴特沃斯、切比雪夫Ⅰ型、切比雪夫Ⅱ型和椭圆型滤波器的相同和不同之处…102
3.2.7案例3.2:设计模拟滤波器的几种编程方法的相同和不同之处…………………………104
3.2.8案例3.3:在频带变换的模拟滤波器设计中,怎样计算Wn和Bs………………………105
3.3利用脉冲响应不变法设计IIR数字滤波器…………………………………………107
3.3.1脉冲响应不变法变换原理……………………………………………………………107
3.3.2模拟滤波器的数字化方法……………………………………………………………108
3.3.3混叠失真……………………………………………………………………………109
3.3.4用脉冲响应不变法设计数字滤波器的优缺点…………………………………………110
3.4利用双线性变换法设计IIR数字滤波器……………………………………………111
3.4.1双线性变换法的变换原理……………………………………………………………111
3.4.2双线性变换法的优缺点………………………………………………………………113
3.4.3利用双线性变换法设计数字滤波器的步骤……………………………………………114
3.5陷波器与全通滤波器…………………………………………………………………115
3.5.1陷波器………………………………………………………………………………115
3.5.2全通滤波器…………………………………………………………………………116
3.6IIR数字滤波器设计的MATLAB函数……………………………………………118
3.7IIR滤波器设计的案例………………………………………………………………123
3.7.1案例3.4:用留数求得脉冲不变法数字滤波器与调用impinvar函数得到的是否一样……123
3.7.2案例3.5:在调用bilinear函数时为何有的Fs处用实际频率值,有的却用Fs=1………125
3.7.3案例3.6:为什么不能用impinvar函数………………………………………………128
3.7.4案例3.7:为什么滤波器的输出会溢出或没有数值……………………………………131
3.7.5案例3.8:用bilinear函数时,如果Wp和Ws都没有先做预畸会有什么结果……………137
3.7.6案例3.9:如何把任意S系统转换为Z系统……………………………………………138
3.7.7案例3.10:把滤波器的滤波过程用差分方程的运算来完成……………………………142
3.7.8案例3.11:滤波函数filter的调用格式为[y,zf]=filter(b,a,x,zf),其中的zi和zf有何作用
………………………………………………………………………………………148
3.7.9案例3.12:如何使用数字陷波器滤除工频信号…………………………………………151
3.7.10案例3.13:如何设计数字全通滤波器对IIR滤波器进行相位补偿……………………153
3.7.11案例3.14:为什么零相位滤波在起始和结束两端都受瞬态效应的影响………………154
3.8线性相位与FIR系统的相位特性……………………………………………………158
3.9FIR型数字滤波器的窗函数设计法…………………………………………………161
3.9.1理想数字滤波器的单位脉冲响应……………………………………………………162
3.9.2FIR型数字滤波器的矩形窗设计法……………………………………………………162
3.9.3窗函数设计法………………………………………………………………………165
3.10FIR型数字滤波器的频率采样设计法………………………………………………167
3.10.1预期频率特性的设置方法……………………………………………………………167
3.10.2频率采样法的设计过程……………………………………………………………167
3.10.3频率采样法的改进…………………………………………………………………168
3.11最优等波纹FIR滤波器的设计……………………………………………………169
3.11.1最小最大化问题的设计……………………………………………………………170
3.11.2对极值数目的限制…………………………………………………………………171
3.11.3Parks-McClellan算法………………………………………………………………172
3.12FIR滤波器设计中的MATLAB函数………………………………………………172
3.13FIR滤波器设计的案例………………………………………………………………176
3.13.1案例3.15:在窗函数法设计FIR中如何选择窗函数和阶数N…………………………176
3.13.2案例3.16:用ideal_lp函数和fir1函数设计的滤波器是否相同………………………178
3.13.3案例3.17:用凯泽窗设计FIR滤波器的优点…………………………………………181
3.13.4案例3.18:为什么FIR滤波器不适用于设计数字陷波器………………………………183
3.13.5案例3.19:通过FIR滤波器的输出,延迟量如何校正…………………………………185
3.13.6案例3.20:通过fir2函数设计任何响应的FIR滤波器………………………………188
3.13.7案例3.21:通过firpm函数设计的FIR滤波器为什么达不到指标要求…………………190
3.13.8案例3.22:如何设计多频带的FIR滤波器……………………………………………194
3.13.9案例3.23:如何用FIR滤波器设计数字微分器………………………………………197
3.13.10案例3.24:如何用FIR滤波器设计数字希尔伯特变换器……………………………198
3.14用FDATool设计数字滤波器………………………………………………………200
3.14.1IIR滤波器设计……………………………………………………………………200
3.14.2FIR滤波器设计……………………………………………………………………209
3.14.3SOS系数的进一步说明……………………………………………………………211
3.14.4案例3.25:如何把SOS或Hd转变为滤波器的系数…………………………………212
3.15用fdesign和design设计数字滤波器………………………………………………215
3.15.1案例3.26:为什么在使用design函数时常会出现“invaliddesignmethod”……………222
3.15.2案例3.27:用fdesign+design的方法与前几节介绍的经典方法设计的滤波器是否相同
……………………………………………………………………………………226
3.15.3案例3.28:用fdesign+design方法有什么优点………………………………………230
3.16三分之一倍频程滤波器………………………………………………………………233
3.16.1案例3.29:以FFTIFFT分析方法求出三分之一倍频程滤波器各频带的声压级………234
3.16.2案例3.30:以降采样方法求出三分之一倍频程滤波器各频带的声压级………………237
3.16.3案例3.31:用fdesign+design方法求出三分之一倍频程滤波器各频带的声压级………240
参考文献………………………………………………………………………………………242
第4章信号处理中简单实用的方法…………………………………………………………243
4.1最小二乘法拟合消除趋势项…………………………………………………………243
4.1.1消除趋势项函数……………………………………………………………………244
4.1.2案例4.1:基线漂移的修正……………………………………………………………244
4.2寻找信号中的峰值和谷值……………………………………………………………247
4.2.1MATLAB中峰谷值检测的函数………………………………………………………247
4.2.2案例4.2:已知一个脉动信号,如何求信号的周期………………………………………248
4.2.3案例4.3:如何利用findpeaks函数求谷值………………………………………………249
4.2.4案例4.4:在findpeakm函数用?q?参数时如何进行内插………………………………251
4.3信号中包络的提取……………………………………………………………………256
4.3.1希尔伯特变换………………………………………………………………………256
4.3.2案例4.5:用希尔伯特变换计算信号的包络……………………………………………259
4.3.3案例4.6:用求极大值和极小值的方法来计算信号的包络线……………………………262
4.3.4案例4.7:用倒谱法来计算语音信号频谱的包络线……………………………………266
4.4提取信号中的特殊区间………………………………………………………………268
4.4.1寻找特殊区间的MATLAB函数………………………………………………………268
4.4.2案例4.8:如何从一组数据中取得波谷的开始位置和结束位置…………………………269
4.5平滑处理………………………………………………………………………………272
4.5.1案例4.9:五点三次平滑法……………………………………………………………272
4.5.2案例4.10:在带噪数据中如何寻找极小值———介绍MATLAB自带的平滑函数smooth
………………………………………………………………………………………274
4.5.3案例4.11:在Savitzky-Golay平滑滤波时如何选择窗长和阶数…………………………278
4.6数据的延拓……………………………………………………………………………282
4.6.1自回归模型的基本理论………………………………………………………………282
4.6.2前向预测与后向预测…………………………………………………………………284
4.6.3前向预测与后向预测的MATLAB函数………………………………………………285
4.6.4案例4.12:如何消除信号经零相位滤波后两端的瞬态效应……………………………287
4.6.5案例4.13:消除希尔伯特变换的端点效应……………………………………………289
参考文献………………………………………………………………………………………291
第5章DFT的拓展…………………………………………………………………………292
5.1短时傅里叶变换………………………………………………………………………292
5.1.1短时傅里叶变换和短时傅里叶逆变换…………………………………………………292
5.1.2短时傅里叶变换的MATLAB函数……………………………………………………293
5.1.3案例5.1:调用tfrstft函数后用什么方法作STFT的谱图………………………………295
5.1.4案例5.2:如何通过spectrogram得到一些特定频率的频谱……………………………303
5.1.5案例5.3:能否对信号的STFT谱图再逆变换转成时间序列……………………………308
5.2细化FFT(Zoom-FFT)………………………………………………………………310
5.2.1经典的复调制频谱细化分析方法……………………………………………………310
5.2.2复解析带通滤波器的复调制频谱细化分析方法………………………………………312
5.2.3细化频谱分析的MATLAB函数………………………………………………………316
5.2.4案例5.4:在函数exzfft_ma中频率刻度是如何计算的…………………………………318
5.2.5案例5.5:如何利用细化频谱提取间谐波的频率………………………………………321
5.3线性调频Z变换(CZT)………………………………………………………………322
5.3.1线性调频Z变换的原理………………………………………………………………322
5.3.2MATLAB的线性调频Z变换函数……………………………………………………324
5.3.3案例5.6:CZT能细化频谱吗…………………………………………………………324
5.4Goertzel算法…………………………………………………………………………329
5.4.1Goertzel算法简介……………………………………………………………………329
5.4.2DTMF信号简介……………………………………………………………………331
5.4.3Goertzel算法对DTMF的应用………………………………………………………332
5.4.4Goertzel算法和DTMF编解码的MATLAB函数……………………………………333
5.4.5案例5.7:如何产生DTMF编码和如何利用Goertzel算法在带噪DTMF中提取出数值
………………………………………………………………………………………334
参考文献………………………………………………………………………………………342
笫6章DFT的内插…………………………………………………………………………344
笫7章谐波分析………………………………………………………………………………387
第8章功率谱的估算…………………………………………………………………………422
附录MATLAB函数速查表………………………………………………………………474
在书店和图书馆里,关于数字信号处理的书籍很多,MATLAB和数字信号处理应用方面的书籍也有很多种了,那为什么我还要写一本有关MATLAB在数字信号处理应用方面的书籍呢?
我自本世纪初退休以后总想着还可以做些什么,希望还能发挥余热。因为对数字信号处理和应用一直有着浓厚的兴趣,正好那时有位朋友介绍我到论坛上帮助网友解答相关的问题,从此就走上了这样一条“不归路”。这十几年来我一直在几个论坛社区中参与解答各类有关数字信号处理的问题,其中在MATLAB中文论坛社区中待的时间最长。我在这十多年间解答了数千个问题。在解答问题的过程中,我发现大多都是基础性的问题或与数字信号处理的内容有关,或与MATLAB的使用有关,或二者兼有。同学们往往是已经学习了数字信号处理这门课,也学习了MATLAB编程的课,但在理解和认识上还不到位,所以遇到实战编程时就会犯这样或那样的错误;而目前已出版的书籍中鲜有对这些问题或错误的处理方法,所以同学们面对出现的错误往往不知所措。MATLAB中文论坛(或其他论坛)正是提供了这样一个平台,同学们可以把问题贴在论坛上,由版主或热心人士来帮忙解决问题。
由于许多具体问题的解决方法在以往出版的书籍中少有涉及,所以我把这十多年来解答的问题总结成一些案例,整理出版。《MATLAB数字信号处理85个实用案例精讲:入门到进阶》不是纯粹地介绍数字信号处理,也不是纯粹地介绍MATLAB,而是针对初学者在使用MATLAB编写信号处理程序时常犯的错误提出解决方法,内容既涉及数字信号处理,也涉及MATLAB编程。
虽然国内外科学编程的语言有许多种,但在国内还是以MATLAB为主,许多大专院校也都开设学习MATLAB语言的课程。它的主要特点除了编程简单外,还可以应用于各个学科中,不仅用于自然科学,还能应用于人文科学;同时它还有功能强大的工具箱(由全世界的精英为工具箱做贡献)。一些基础性的处理程序都已包含在工具箱中,不需要用户去从事这方面的开发工作,这样就省去了大量的重复性工作。对于用户来说,只需考虑怎么利用工具箱来实现自己的想法和算法。MATLAB是一种方便、实用、高效的计算机语言。近几年来又支持代码转换,可自动生成可读、可运行、可移植的C/C++代码,这样方便用户在MATLAB平台上建模仿真,然后移植到硬件中去实现。
《MATLAB数字信号处理85个实用案例精讲:入门到进阶》的内容安排如下。
第1章讲述Z变换和离散傅里叶变换,给出Z变换的定义和基本性质,它是离散时间信号与系统分析和处理的主要理论工具。另外还介绍了离散傅里叶变换的导出及基本性质。
第2章介绍快速傅里叶变换,包括按时间抽选的基2的FFT算法和按频率抽选的基2的FFT算法。另外还介绍了谱分析和窗函数,给出了谱分析的基本方法。
第3章介绍数字滤波器的设计,讲述了无限长单位脉冲响应(IIR)数字滤波器的设计方法(包括脉冲响应不变法、双线性变换法及原型变换)和有限长单位脉冲响应(FIR)数字滤波器的设计方法(包括窗函数法、频率采样设计法和最优等波纹法等),并介绍了利用FDATool及Fdesign+design函数设计数字滤波器的方法。
第4章介绍信号处理中一些实用的方法,包括消除趋势项、极大点和极小点的寻找、包络提取、数据平滑、寻找特殊区间和数据延拓等。
第5章介绍DFT的拓展,包括短时傅里叶变换(STFT)、细化傅里叶变换(ZoomFFT)、线性调频Z变换(CZT)和Goertzel算法。
第6章介绍FFT的内插,以狄里克莱核与窗函数为基础,介绍了比值校正法、能量重心校正法、相位差校正法和全相位校正技术。
第7章为谐波分析,介绍了单峰谱线插入、双峰谱线插入和Prony方法。
第8章为功率谱的估算,介绍了非参数法的功率谱估算(包含相关图法、周期图法和改进周期图法)、参数法的功率谱估算(包含最大熵谱法、自相关法、协方差法、Burg算法估计法和改进协方差法等),讲述了通用的功率谱估算spectrum和psd函数,最后介绍了传递函数和相干函数的估算方法。
《MATLAB数字信号处理85个实用案例精讲:入门到进阶》中经常会调用某些不是MATLAB自带的函数,但它们已被集中在basic_tbx工具箱中。在运行《MATLAB数字信号处理85个实用案例精讲:入门到进阶》的程序前,建议读者把该工具箱设置在工作路径下(用setpath设置)。《MATLAB数字信号处理85个实用案例精讲:入门到进阶》的所有函数和程序都已在MATLABR2009a上调试通过。
在《MATLAB数字信号处理85个实用案例精讲:入门到进阶》的写作过程中,作者得到了北京航空航天大学出版社的陈守平编辑以及MATLAB中文论坛的支持与鼓励,在此向他们表示最真诚的谢意!此外,还要感谢我的家人,她们的默默支持和付出,使我能顺利完成《MATLAB数字信号处理85个实用案例精讲:入门到进阶》的写作,在此向我的家人表示最衷心的感谢!
《MATLAB数字信号处理85个实用案例精讲:入门到进阶》为读者免费提供程序源代码,以二维码的形式印在扉页及序言后,请扫描二维码下载。读者也可以通过网址http://pan.baidu.com/s/1jI9D3ls从“百度云”下载全部资料。同时,北京航空航天大学出版社联合MATLAB中文论坛为《MATLAB数字信号处理85个实用案例精讲:入门到进阶》设立了在线交流平台,网址:http://www.ilovematlab.cn/forum-259-1.html。我们希望借助这个平台实现与广大读者面对面交流,解决大家在阅读《MATLAB数字信号处理85个实用案例精讲:入门到进阶》过程中遇到的问题,分享彼此的学习经验,从而达到共同进步
的目的。
由于编写时间仓促,加之作者学识所限,书中如有错误或疏漏之处,恳请广大读者和各位专家批评指正。《MATLAB数字信号处理85个实用案例精讲:入门到进阶》勘误网址:http://www.ilovematlab.cn/thread-481275-1-1.html。
作者
2016年5月









