前言
在语音识别和话者识别中,需要将声音编码为数字信息,提取其中的特征进行处理,而最常用的语音特征便是梅尔倒谱系数MFCC。为了将频谱的包络与细节分离开来,以便分析声道共振特征和基音周期,需要把这种非线性问题转化为线性问题。MFCC预处理之后的第一步便是通过快速傅里叶变换(Fast Fourier Transform)将时域信号转变为信号频谱。而快速傅里叶变换是离散傅里叶变换(Discrete Fourier Transform)的改进算法,将其时间复杂度从 O ( n 2 ) O(n^{2}) O(n2)改进为 O ( n log n ) O(n\log{n}) O(nlogn)。
离散傅里叶变换 DFT
傅里叶变换能将满足一定条件的函数表示成正弦和/或余弦函数或它们的积分的线性组合。根据函数在时域的特性分别有如下几种变换:
变换 | 时域 | 频域 |
---|---|---|
连续傅里叶变换 | 连续,非周期性 | 连续,非周期性 |
傅里叶级数 | 连续,周期性 | 离散,非周期性 |
离散时间傅里叶变换 | 离散,非周期性 | 连续,周期性 |
离散傅里叶变换 | 离散,周期性 | 离散,周期性 |
这四种傅立叶变换都是针对长度为无穷大的信号,但这对于计算机处理来说是不可能的。那么有没有针对长度有限的傅立叶变换呢?很遗憾没有,因为正余弦波被定义成从负无穷大到正无穷大,我们无法把一个长度无限的信号组合成长度有限的信号。
面对这种困难,解决方法是把长度有限的信号表示成长度无限的信号。例如,可以把信号无限地从左右进行延伸,延伸的部分用零来表示,这样这个信号就可以被看成是非周期性离散信号,我们可以用到离散时域傅立叶变换(DTFT)的方法。也可以把信号用复制的方法进行延伸,这样信号就变成了周期性离散信号,这时我们就可以用离散傅立叶变换方法(DFT)进行变换。
但是对于非周期性的信号,我们需要用无穷多不同频率的正弦曲线来表示,这对于计算机来说是不可能实现的。所以对于离散信号的变换只有离散傅立叶变换(DFT)才能被适用,对于计算机来说只有离散的和有限长度的数据才能被处理,其它的变换类型只有在数学演算中才能用到。
对于N点序列 { x [ n ] } 0 ≤ n ≤ N \left \{ x[n] \right \}_{0≤n≤N} {
x[n]}0≤n≤N,它的离散傅里叶变换为:
其中N表示傅里叶变换的点数,k表示傅里叶变换的第k个频谱,W称为旋转因子。通过欧拉公式进一步变换我们可以得到:
由于余弦信号也是一种相位移动的正弦信号,因此变换后的第k点的实部和虚部对应的是一个相同频率的正弦信号,只是相位不同。随着k的变换正弦信号的频率也在发生变换,因此DFT将时序信号转化成不同频率的正弦信号的叠加。
DFT也可以用矩阵表示为 X = W N x X=W_Nx X=WNx,其中:
快速傅里叶变换 FFT
快速傅里叶变换(Fast Fourier Transform),是利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法,于1965年由J.W.库利和T.W.图基提出。
对于多项式 f ( x ) = ∑ i = 0 n a i x i f(x)=\sum_{i=0}^{n}{a_i x^i} f(x)=∑i=0naixi, f ( x ) = ∑ i = 0 n b i x i f(x)=\sum_{i=0}^{n}{b_i x^i} f(x)=∑i=0nbixi,定义其乘积 f g fg fg如下:
显然,上式可以 O ( n 2 ) O(n^{2}) O(n2)的复杂度来计算乘积每一项的系数,但FFT可以 O ( n log n ) O(n\log{n}) O(nlogn)的时间复杂度来计算这个乘积。
对于任意n次多项式 f ( x ) = ∑ i = 0 n a i x i f(x)=\sum_{i=0}^{n}{a_i x^i} f(x)=∑i=0na