傅里叶变换是将信号从时域变换为频域的工具。直观来说,傅里叶变换可以提取一段音频的频率信息。
傅里叶变换一般定义如下,设有模拟信号 f(t),则其傅里叶变换为:
F{f}(ω)=F(ω)=∫−∞+∞f(t)e−iωtdt
这一过程看作 L2 空间上将 f(t) 投影到正交基底 e−iωt 上的过程。而因为 e−iωt=cosωt−isinωt,从而我们可以认为傅里叶变换提取了频率为 f=2πω 的频率分量. ∣F{f}(ω)∣ 表示频率为 f 的分量的“音量”大小,argF{f}(ω) 则表示频率为 f 的分量的相位。
这一过程因为基函数正交且完备,故可逆。其逆变换为:
F−1{F}(t)=2π1∫−∞+∞F(ω)e−iωtdω
这一过程可以理解为从正交基底重建原函数的过程。
在实践过程中,因为数字音频流是离散的,一般使用傅里叶变换的离散版替代 (Discrete Fourier Transform, 简称 DFT),即离散傅里叶变换。假设原始信号是 x[n],则定义其离散傅里叶变换为
DFT(x)[k]=X[k]=n=0∑N−1x[n]e−iN2πkn
其中 N 为原始信号的采样点个数,其具体意义与连续傅里叶变换一致。但因为信号离散的缘故,频率计算与采样率 fs 与指标 k 有关,具体计算方式为 kNfs。
同理,这一过程同样可逆,其逆变换即为离散傅里叶变换逆变换 (Inverse Discrete Fourier Transform, 简称 IDFT)
IDFT(X)[n]=x[n]=N1k=0∑N−1X[k]e−iN2πkn
在实践中,不难发现按照原定义计算 DFT 的时间复杂度为 o(N2),这在实时计算中显然效率偏低,因此实践中一般使用分治方式进行优化,即为快速傅里叶变换 (Fast Fourier Transform, 简称 FFT)。以正向傅里叶变换为例(反向同理),其过程如下
首先写出离散傅里叶变换定义式
X[k]=n=0∑N−1x[n]e−iN2πkn
将其按照奇偶项分离有
X[k]=n=0∑2N−1x2ne−N2k(2n)πi+n=0∑2N−1x2n+1e−N2k(2n+1)πi
即
X[k]=n=0∑2N−1x2ne−N/22knπi+eN−2kπin=0∑2N−1x2n+1e−N/22knπi
而 n=0∑2N−1x2ne−N/22knπi 和 n=0∑2N−1x2n+1e−N/22knπi 是采样点为 2N 的傅里叶变换。从而当 N 为 2 的幂次时,可以对原问题进行分治,其时间复杂度为 o(NlogN).