MATLAB 2020信号处理从入门到精通
上QQ阅读APP看书,第一时间看更新

4.1 傅里叶变换

大部分仪器及软件都使用快速傅里叶变换来产生频谱的信号。快速傅里叶变换是一种针对采样信号计算离散傅里叶变换的数学工具,可以近似傅里叶变换的结果。

4.1.1 傅里叶变换的定义

法国数学家傅里叶指出任何周期函数都可以表示为不同频率的正弦和/或余弦之和的形式,每个正弦项和/或余弦项乘以不同的系数(现在称该和为傅里叶级数)。无论函数多么复杂,只要它是周期的,并且满足某些适度的数学条件,都可以用这样的和来表示。即一个复杂的函数可以表示为简单的正弦和余弦之和。甚至非周期函数(但该曲线下的面积是有限的)也可以用正弦和/或余弦乘以加权函数的积分来表示。在这种情况下的公式就是傅里叶变换。

傅里叶变换的实质是将一个信号分离为无穷多个正弦/复指数信号的加成,也就是说,把信号变成正弦信号相加的形式——既然是无穷多个信号相加,那对于非周期信号来说,每个信号的加权应该都是零——但有密度上的差别,可以对比概率论中的概率密度来思考,落到每一个点的概率都是无限小,但这些无限小是有差别的,所以,傅里叶变换之后,横坐标即为分离出的正弦信号的频率,纵坐标对应的是加权密度。傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。最初傅里叶分析是作为热过程解析分析的工具被提出的。傅里叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。许多波形可作为信号的成分,比如正弦波、方波、锯齿波等,傅里叶变换用正弦波作为信号的成分。

(1)一维连续傅里叶变换及逆变换

单变量连续函数fx)的傅里叶变换Fμ)定义为

978-7-111-67965-3-Chapter04-1.jpg

式中,x为时域变量,μ为频域变量,978-7-111-67965-3-Chapter04-2.jpg。给定Fμ),通过傅里叶逆变换可以得到fx):

978-7-111-67965-3-Chapter04-3.jpg

(2)二维连续傅里叶变换及逆变换

二维连续函数fxy)的傅里叶变换Fμu)定义为

978-7-111-67965-3-Chapter04-4.jpg

式中,xy为时域变量,μv为频域变量,978-7-111-67965-3-Chapter04-5.jpg

给定Fμv),通过傅里叶逆变换可以得到fxy):

978-7-111-67965-3-Chapter04-6.jpg

傅里叶分析包含傅里叶级数与傅里叶变换。傅里叶级数用于转换周期信号,傅里叶变换用于转换非周期信号。

傅里叶变换要求满足狄利克雷条件和在(-∞,+∞)上绝对可积,但绝对可积是一个相当强的条件,很多常见的函数(如正弦函数、单位阶跃函数和线性函数)都不满足此条件,使这种变换方法少了工程意义,所以就出现了拉普拉斯变换。拉普拉斯变换和Z变换都是傅里叶变换的延伸。

4.1.2 快速傅里叶变换

1965年,J.W.库利和T.W.图基提出的快速傅里叶变换,是计算离散傅里叶变换的一种快速算法,简称FFT。函数或信号可以通过一对数学的运算子在时域及频域之间转换。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法的优势就越显著。

离散傅里叶变换转换定义为

978-7-111-67965-3-Chapter04-7.jpg

式中,n是信号XY的长度,Wn=e(-2πi)/n

FFT是离散傅里叶变换的快速算法,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。

在MATLAB中,fft命令对信号进行一维快速傅里叶变换,该命令的使用格式见表4-1。

表4-1 fft命令的使用格式

978-7-111-67965-3-Chapter04-8.jpg

在MATLAB中,ifft命令对信号进行一维快速傅里叶逆变换,该命令的使用格式见表4-2。

表4-2 ifft命令的使用格式

978-7-111-67965-3-Chapter04-9.jpg

例4-1:计算狄利克雷函数信号的傅里叶变换。

978-7-111-67965-3-Chapter04-10.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-11.jpg

运行结果如图4-1所示。

1.二维傅里叶变换

以下公式定义m×n矩阵X的离散傅里叶变换Y

978-7-111-67965-3-Chapter04-12.jpg

ωmωn是复单位根:

978-7-111-67965-3-Chapter04-13.jpg

i是虚数单位。pj是值范围0~m-1的索引,qk是值范围0~n-1的索引。此公式将XY的索引平移1位,以反映MATLAB中的矩阵索引。

在MATLAB中,fft2命令对信号进行二维快速傅里叶变换,该命令的使用格式见表4-3。

978-7-111-67965-3-Chapter04-14.jpg

图4-1 狄利克雷信号的傅里叶变换

表4-3 fft2命令的使用格式

978-7-111-67965-3-Chapter04-15.jpg

在MATLAB中,ifft2命令对信号进行二维快速傅里叶逆变换,该命令的使用格式见表4-4。

表4-4 ifft2命令的使用格式

978-7-111-67965-3-Chapter04-16.jpg

例4-2:计算周期方波信号与非周期方波信号的频域变换。

978-7-111-67965-3-Chapter04-17.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-18.jpg

978-7-111-67965-3-Chapter04-19.jpg

运行结果如图4-2所示。

978-7-111-67965-3-Chapter04-20.jpg

图4-2 方波信号的频域变换结果

在MATLAB中,fftshift命令将信号中的零频分量移到频谱中心,将快速傅里叶变换(fft、fft2)的DC分量移到谱中央,该命令的使用格式见表4-5。

表4-5 fftshift命令的使用格式

978-7-111-67965-3-Chapter04-21.jpg

在MATLAB中,ifftshift命令将信号中的逆零频分量移到频谱中心,实质上,ifftshift就是撤销ifftshift的结果,该命令的使用格式见表4-6。

表4-6 fft2命令的使用格式

978-7-111-67965-3-Chapter04-22.jpg

例4-3:计算余弦噪声信号的傅里叶变换。

978-7-111-67965-3-Chapter04-23.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-24.jpg

运行结果如图4-3所示。

978-7-111-67965-3-Chapter04-25.jpg

图4-3 余弦噪声信号的傅里叶变换的运行结果

2.N维傅里叶变换

N维数组X的离散傅里叶变换Y定义为

978-7-111-67965-3-Chapter04-26.jpg

每个维度的长度为mk,其中k=1,2,…,N,而978-7-111-67965-3-Chapter04-27.jpg是复单位根,其中i是虚数单位。

MATLAB提供了多维快速傅里叶变换的命令,见表4-7。

表4-7 快速傅里叶变换

978-7-111-67965-3-Chapter04-28.jpg

例4-4:信号X=sin(2∗pi∗100∗t)+cos(2∗pi∗200∗t)的FFT变换。

978-7-111-67965-3-Chapter04-29.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-30.jpg

运行结果如图4-4所示。

4.1.3 DFT变换矩阵

定义一个有限长序列xn),它在0≤nN上有N个样本,是一个N点序列,该序列的DFT为978-7-111-67965-3-Chapter04-31.jpg,0≤kN-1。其中,n为采样点,978-7-111-67965-3-Chapter04-32.jpg

DFT正变换:

978-7-111-67965-3-Chapter04-33.jpg

图4-4 FFT变换运行结果

978-7-111-67965-3-Chapter04-34.jpg

DFT反变换

978-7-111-67965-3-Chapter04-35.jpg

式中,conj是求复数的共轭。

在MATLAB中,dftmtx命令计算信号的DFT变换矩阵,该命令的使用格式见表4-8。

表4-8 dftmtx命令的使用格式

978-7-111-67965-3-Chapter04-36.jpg

离散傅里叶变换矩阵D是一个复矩阵,dftmtx利用单位矩阵的DFT生成变换矩阵。X为列向量信号,其矩阵积与向量一起计算向量的离散傅里叶变换,即

y=fft(xn

y=dftmtx(n)∗x

这两行代码结果是相同的。

离散傅里叶逆变换矩阵是

ainv=conj(dftmtx(n))/n

y=ifft(xn

这两行代码结果是相同的。

例4-5:信号的DFT变换。

978-7-111-67965-3-Chapter04-37.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-38.jpg

运行结果如图4-5所示。

978-7-111-67965-3-Chapter04-39.jpg

图4-5 DFT变换运行结果

4.1.4 复倒谱分析

复倒谱是指一个信号的傅里叶变换对数的傅里叶反变换。在实际信号处理中很有用处,如可应用于通信、建筑声学、地震分析、地质勘探和语音处理等领域。尤其在语音处理方面,应用复倒谱算法可制成同态预测声码器系统,此系统可用于高度保密的通信。

在MATLAB中,cceps命令对信号进行复倒谱分析,该命令的使用格式见表4-9。

表4-9 cceps命令的使用格式

978-7-111-67965-3-Chapter04-40.jpg

在MATLAB中,icceps命令对信号进行逆复倒谱分析,该命令的使用格式见表4-10。

表4-10 icceps命令的使用格式

978-7-111-67965-3-Chapter04-41.jpg

例4-6:计算信号的傅里叶复倒谱分析。

978-7-111-67965-3-Chapter04-42.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-43.jpg

运行结果如图4-6所示。

978-7-111-67965-3-Chapter04-44.jpg

图4-6 傅里叶复倒谱分析运行结果

4.1.5 傅里叶同步压缩变换

许多真实世界的信号,如语音波形、机器振动和生理信号,可以表示为调幅和调频模式的叠加。在时频分析中,可以方便地将分析信号的和表示为

978-7-111-67965-3-Chapter04-45.jpg

各阶段ϕkt)有时间倒数kt/DT与瞬时频率相对应。当精度相位未知时,可以使用傅里叶同步压缩变换来估算。

在MATLAB中,fsst命令对信号进行傅里叶同步压缩变换,该命令的使用格式见表4-11。

表4-11 fsst命令的使用格式

978-7-111-67965-3-Chapter04-46.jpg

例4-7:计算信号的傅里叶同步压缩变换。

978-7-111-67965-3-Chapter04-47.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-48.jpg

运行结果如图4-7所示。

在MATLAB中,ifsst命令对信号进行傅里叶同步压缩逆变换,该命令的使用格式见表4-12。

表4-12 ifsst命令的使用格式

978-7-111-67965-3-Chapter04-49.jpg

978-7-111-67965-3-Chapter04-50.jpg

图4-7 傅里叶同步压缩变换运行结果

例4-8:计算信号的傅里叶同步压缩逆变换。

978-7-111-67965-3-Chapter04-51.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-52.jpg

运行结果如图4-8所示。

978-7-111-67965-3-Chapter04-53.jpg

图4-8 傅里叶同步压缩逆变换运行结果

4.1.6 二阶Goertzel算法的离散傅里叶变换

Goertzel算法由Gerald Goertzel在1958年提出,用于数字信号处理,属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评价。

该算法有几个关键的参数。

◆采样率R,指的是需要分析的数据每秒钟有多少个采样。

◆目标频率f,指的是需要检测并评价的频率的值。

◆检测区段采样值数量N,也就是每N个采样该算法就会对频率f给出评价。

◆检测区段包含目标频率的完整周期个数K

上述参数应该显示关系如下。

978-7-111-67965-3-Chapter04-54.jpg

K如果太大,不利于检测的时效性,如果太小,则检测可能不准确。

Goertzel算法用于DTMF识别,还需要做一些工作。DTMF识别需要根据给定的一段时间的采样,能够最大限度地排除噪声的干扰,将有效的DTMF信号识别出来。

Goertzel算法实现了序列xn)离散傅里叶变换,等价于序列xn)与系统传递函数hn)的第N个卷积值。对于长度为N的采样序列xn),n=0,1,…,N-1,具有脉冲响应

978-7-111-67965-3-Chapter04-55.jpg

式中,un)表示单位步长序列1。k不一定是整数。在一个频率上f=kfs/Nfs表示采样率,则滤波器Hkz)在时间n=N-1时输出。

978-7-111-67965-3-Chapter04-56.jpg

xn)=0,对系统的传递函数hn)进行Z变换,得到goertzel滤波器的传递函数Hkz

978-7-111-67965-3-Chapter04-57.jpg

在MATLAB中,goertzel命令使用二阶Goertzel算法对信号进行傅里叶变换,该命令的使用格式见表4-13。

表4-13 goertzel命令的使用格式

978-7-111-67965-3-Chapter04-58.jpg

例4-9:计算信号的DFT变换。

978-7-111-67965-3-Chapter04-59.jpg

解:MATLAB程序如下。

978-7-111-67965-3-Chapter04-60.jpg

运行结果如图4-9所示。

978-7-111-67965-3-Chapter04-61.jpg

图4-9 使用Goertzel算法后DFT变换的运行结果