傅里叶变换与离散傅里叶变换DFT
一个时域上的函数 x(t) 其傅里叶变换定义为
X~(ω)=∫−∞+∞x(t)e−iωtdt
如果用频率表示, 将ω=2πf代入可得
X~(f)=∫−∞+∞x(t)e−i2πftdt
对于计算机而言, 记录的下来的函数是对真实函数的采样. 如果记采样的时间周期为T, 那么采样得到的离散函数自变量应当是采样轮次
x[n]=x(nT)
为了得到离散傅里叶变换, 需要具体地描述采样的过程. 利用δ函数
δs(t)=−∞∑+∞δ(t−nT)
将它与x(t)相乘得到采样后的信号
xs(t)=−∞∑+∞x(t)δ(t−nT)
它在除了采样点nT之外的点都为零, 虽然在采样点取值正无穷, 但是鉴于
∫−∞+∞x(t)δ(nT)=x(nT)
如果认为采样的过程是对一段段的时间积分,即
x[n]=∫nT−T/2nT+T/2x(t)dt
那么确实有
x[n]=∫nT−T/2nT+T/2xs(t)dt
当nT包含在积分区间内时,积分就为x(nT),否则为零. 因而认为xs(t)是x[n]在连续下的形式, 对x[n]做傅里叶变换就是在对xs(t)做傅里叶变换. 鉴于δ函数性质优良, 那么
Xs(ω)=∫−∞+∞(−∞∑+∞x(t)δ(t−nT))e−iωtdt=−∞∑+∞x(nT)e−iωnT
不过显然不可能进行无穷多次采样. 假定在0∼t0的时间内进行N次采样,采样间隔为T, 其余未采样的地方视为周期的, 即将x(t)视为周期函数
x(t)={x(t)x(t+kt0)t∈[0,t0)其他,k∈N
那么它可以进行傅里叶级数展开
x(t)=−∞∑+∞ei2πnt/t0t01∫0t0x(t)e−i2πnt/t0dt
这说明它的傅里叶变换是离散的
X(ω)=−∞∑+∞2πδ(ω−nω0)t01∫0t0x(t)e−inω0tdt,ω0=t02π
利用ω=2πf将其写为频率
X(f)=−∞∑+∞δ(f−nf)f0∫0t0x(t)e−i2πnf0tdt,f0=t01
将周期的xs(t)代入后式得到
f0∫0t0x(t)e−i2πnf0tdt=f0k=0∑N−1x(kT)e−i2πnkTf0
鉴于f0=1/t0=1/NT,那么
f0∫0t0x(t)e−i2πnf0tdt=f0k=0∑N−1x(kT)e−i2πnk/N
记
离散傅里叶变换DFT
X[n]=k=0∑N−1x[k]e−i2πnk/N
鉴于e−2πnk/N的周期性, 只需要计算0<n<N−1即可
FFT的数学基础
根据DFT的表达式不难发现, 如果进行朴素的乘法, 求解一个X[n]复杂度为O(n), 求解全部N个的复杂度为O(n2)
不过稍加分析,不难发现求解的主要复杂度在于后面的相位项
W[n,k]=exp{−iN2πnk}
由于k与x[k]相联系, 从n处想办法. 注意到
W[n+N/2,k]=exp{−iN2πnk}exp{−iπk}
这意味着当k为偶数时有
W[n+N/2,k]=W[n,k]
因而计算X[n]时考虑将n分奇偶
X[n]=k=0∑N−1x[k]W[n,k]=k=0∑N/2−1x[2k]W[n,2k]+k=0∑N/2−1x[2k+1]W[n,2k+1]
后面的2k+1不是偶数, 就把它变成偶数, 利用
W[n,2k+1]=W[n,1]W[n,2k]
那么
X[n]=k=0∑N/2−1x[2k]W[n,2k]+W[n,1]k=0∑N/2−1x[2k+1]W[n,2k]
鉴于W[n+N/2,k]=W[n,k], 那么
X[n+N/2]=k=0∑N/2−1x[2k]W[n,2k]+W[n+N/2,1]k=0∑N/2−1x[2k+1]W[n,2k]
不好处理的是W[n+N/2,1], 不过不难发现
W[n+N/2,1]=exp{−iN2πn−πi}=−exp{−N2πn}=−W[n,1]
这就意味着
递推式1
X[n+N/2]=X[n]的偶数部分−W[n,1]⋅X[n]的奇数部分
这告诉我们, 知道了X[n]的偶数部分就等于知道了X[n+N/2]的偶数部分, 奇数也一样;
下一步是求解奇数和偶数部分. 先考察偶数部分
k=0∑N/2−1x[2k]W[n,2k]
记N′=N/2, 将偶数位置单独挑出来合成一份N′长度的序列, 得到x′[k],k=0∼N′, 那么
W[n,2k]=exp{−iN2πn2k}=exp{−iN′2πnk}=W′[n,k]
那么就可以将偶数部分改写为
X[n]的偶数部分=k=0∑N′−1x′[k]W′[n,k]
这不正好是偶数序列x′[k]的傅里叶变换. 再考察奇数部分
k=0∑N/2−1x[2k+1]W[n,2k+1]
如法炮制,令N′=N/2, 将奇数位置挑出来合成x′[k], 那么
W[n,2k+1]=W[n,1]W[n,2k]=W[n,1]W′[n,k]
那么就可以将奇数部分改写为
X[n]的奇数部分=W[n,1]k=0∑N′−1x′[k]W′[n,k]
进而得到奇数部分和偶数部分的递推式
递推式2
X[n]的偶数部分=DFT{x的偶数序列}[n] X[n]的奇数部分=W[n,1]DFT{x的奇数序列}[n]
快速傅里叶变换FFT算法
- 初始化长度为N的序列x(0)
- 对于当前序列x(m), 求解它的FFT只需要求解前半部分的奇数和偶数部分, 后半部分即可由递推式自然得到
X[n+N/2]=X[n]的偶数部分−W[n,1]⋅X[n]的奇数部分
- 求解前半部分n=0∼N/2−1, 利用递推式
X[n]的偶数部分=DFT{x的偶数序列}[n]
X[n]的奇数部分=W[n,1]DFT{x的奇数序列}[n]
问题转化为分别求解奇偶序列的FFT
如此, FFT是一种二分法, 其时间复杂度为O(nlogn)
快速逆傅里叶变换IFFT
注意到
x[n]=N1k′,k=0∑N−1x[k]e−i2πn(k−k′)/N=N1k′=0∑N−1X[k′]ei2πnk′/N
因而定义离散傅里叶逆变换IDFT
离散傅里叶逆变换IDFT
x[n]=N1k=0∑N−1X[k]ei2πnk/N
它长得跟DFT一样,只不过将i改为了−i,并除了个N, 那么计算IFFT实际上只需要
IFFT{X}=N1FFT{X;i→−i}