基2时间抽取FFT(DIT-FFT),FN\boldsymbol{F}_NFN 矩阵拆分完整推导
前提:N=2mN = 2^mN=2m,mmm为正整数,旋转因子定义:ωN=e−j2πN\omega_N = e^{-j\frac{2\pi}{N}}ωN=e−jN2π
性质先列出(旋转因子恒等式,后面反复用):
- 周期性:ωNn+N=ωNn\omega_N^{n+N} = \omega_N^nωNn+N=ωNn
- 对称性:ωNn+N/2=−ωNn\omega_N^{n+N/2} = -\omega_N^nωNn+N/2=−ωNn
- 尺度关系:ωN2k=ωN/2k\omega_N^{2k} = \omega_{N/2}^kωN2k=ωN/2k
原始DFT公式:
Xk=∑n=0N−1xnωNkn,k=0,1,...,N−1 Xk=\sum_{n=0}^{N-1} xn\omega_N^{kn},\quad k=0,1,\dots,N-1 Xk=n=0∑N−1xnωNkn,k=0,1,...,N−1
时间抽取:把原序列 xnxnxn 按下标奇偶,拆成两个长度 N/2N/2N/2 的子序列
偶数点:x0r=x2r,r=0,1,...,N2−1x_0r = x2r,\quad r=0,1,\dots,\frac{N}{2}-1x0r=x2r,r=0,1,...,2N−1
奇数点:x1r=x2r+1,r=0,1,...,N2−1x_1r = x2r+1,\quad r=0,1,\dots,\frac{N}{2}-1x1r=x2r+1,r=0,1,...,2N−1
把求和拆成偶数项求和 + 奇数项求和:
Xk=∑r=0N2−1x2rωNk⋅(2r)+∑r=0N2−1x2r+1ωNk⋅(2r+1)=∑r=0N2−1x0r(ωN2)kr+ωNk∑r=0N2−1x1r(ωN2)kr \begin{aligned} Xk &= \sum_{r=0}^{\frac{N}{2}-1}x2r\omega_N^{k\cdot(2r)}+\sum_{r=0}^{\frac{N}{2}-1}x2r+1\omega_N^{k\cdot(2r+1)} \\ &=\sum_{r=0}^{\frac{N}{2}-1}x_0r(\omega_N^2)^{kr}+\omega_N^k\sum_{r=0}^{\frac{N}{2}-1}x_1r(\omega_N^2)^{kr} \end{aligned} Xk=r=0∑2N−1x2rωNk⋅(2r)+r=0∑2N−1x2r+1ωNk⋅(2r+1)=r=0∑2N−1x0r(ωN2)kr+ωNkr=0∑2N−1x1r(ωN2)kr
利用性质 ωN2=ωN/2\omega_N^2=\omega_{N/2}ωN2=ωN/2,代入:
Xk=∑r=0N2−1x0rωN/2kr+ωNk∑r=0N2−1x1rωN/2kr Xk=\sum_{r=0}^{\frac{N}{2}-1}x_0r\omega_{N/2}^{kr}+\omega_N^k\sum_{r=0}^{\frac{N}{2}-1}x_1r\omega_{N/2}^{kr} Xk=r=0∑2N−1x0rωN/2kr+ωNkr=0∑2N−1x1rωN/2kr
观察两个求和式,正好分别是 x0rx_0rx0r 和 x1rx_1rx1r 的N/2点DFT,记:
X0k=DFT(x0r),X1k=DFT(x1r)X_0k=\text{DFT}(x_0r),\quad X_1k=\text{DFT}(x_1r)X0k=DFT(x0r),X1k=DFT(x1r)
X0k=∑r=0N2−1x0rωN/2kr,X1k=∑r=0N2−1x1rωN/2krX_0k=\sum_{r=0}^{\frac{N}{2}-1}x_0r\omega_{N/2}^{kr},\quad X_1k=\sum_{r=0}^{\frac{N}{2}-1}x_1r\omega_{N/2}^{kr}X0k=r=0∑2N−1x0rωN/2kr,X1k=r=0∑2N−1x1rωN/2kr
于是得到:
Xk=X0k+ωNkX1k,k=0,1,...,N2−1(1)Xk=X_0k+\omega_N^k X_1k,\quad k=0,1,\dots,\frac{N}{2}-1 \tag{1}Xk=X0k+ωNkX1k,k=0,1,...,2N−1(1)
上面式子只覆盖前一半频点 k∈0,N/2−1k\in0,N/2-1k∈0,N/2−1。
对于后一半频点:令 k′=k−N/2k'=k-N/2k′=k−N/2,也就是 k=k′+N/2k = k'+N/2k=k′+N/2,k′=0,1,...,N/2−1k'=0,1,\dots,N/2-1k′=0,1,...,N/2−1
Xk′+N2=X0k′+N2+ωNk′+N2X1k′+N2 \begin{aligned} X\leftk'+\\frac{N}{2}\\right &= X_0\leftk'+\\frac{N}{2}\\right+\omega_N^{k'+\frac{N}{2}}X_1\leftk'+\\frac{N}{2}\\right \end{aligned} Xk′+2N=X0k′+2N+ωNk′+2NX1k′+2N
X0,X1X_0,X_1X0,X1 是N/2点DFT,具有周期N/2:X0k′+N/2=X0k′, X1k′+N/2=X1k′X_0k'+N/2=X_0k',\ X_1k'+N/2=X_1k'X0k′+N/2=X0k′, X1k′+N/2=X1k′
ωNk′+N/2=ωNk′⋅ωNN/2=−ωNk′\omega_N^{k'+N/2}= \omega_N^{k'}\cdot\omega_N^{N/2}= -\omega_N^{k'}ωNk′+N/2=ωNk′⋅ωNN/2=−ωNk′
代入化简:
Xk′+N2=X0k′−ωNk′X1k′ X\leftk'+\\frac{N}{2}\\right=X_0k'-\omega_N^{k'}X_1k' Xk′+2N=X0k′−ωNk′X1k′
把k'换回k:
Xk+N2=X0k−ωNkX1k,k=0,1,...,N2−1(2) X\leftk+\\frac{N}{2}\\right=X_0k-\omega_N^{k}X_1k,\quad k=0,1,\dots,\frac{N}{2}-1 \tag{2} Xk+2N=X0k−ωNkX1k,k=0,1,...,2N−1(2)
式(1)(2)就是蝶形运算核心公式。
转为矩阵形式推导FN\boldsymbol{F}_NFN分解
原始向量:
x=x\[0,x1,x2,x3,...,xN−1]T\boldsymbol x = x\[0,x1,x2,x3,\dots,xN-1]^Tx=x\[0,x1,x2,x3,...,xN−1]T
时间抽取,奇偶重排后的向量:
xp=x0\[0,x01,...,x0N/2−1, x10,x11,...,x1N/2−1]T\boldsymbol x_p = x_0\[0,x_01,\dots,x_0N/2-1,\ x_10,x_11,\dots,x_1N/2-1]^Txp=x0\[0,x01,...,x0N/2−1, x10,x11,...,x1N/2−1]T
xp\boldsymbol x_pxp 是 x\boldsymbol xx 经过置换矩阵 PN\boldsymbol P_NPN 做下标重排得到:
xp=PNx\boldsymbol x_p = \boldsymbol P_N \boldsymbol xxp=PNx
置换矩阵 PN\boldsymbol P_NPN 的作用:对输入向量做位反转重排(DIT-FFT输入重排)。
xp\boldsymbol x_pxp 前半段是偶数序列x0x_0x0,后半段奇数序列x1x_1x1。
分别对两段做N/2点DFT:
\\begin{bmatrix} \\boldsymbol X_0 \\ \\boldsymbol X_1 \\end{bmatrix} \\begin{bmatrix} \\boldsymbol F_{N/2} \& \\boldsymbol 0 \\ \\boldsymbol 0 \& \\boldsymbol F_{N/2} \\end{bmatrix} \\boldsymbol x_p
FN/2\boldsymbol F_{N/2}FN/2 是N/2阶DFT矩阵。
接下来蝶形合并,写成矩阵:
\\boldsymbol X \\begin{bmatrix} \\boldsymbol I_{N/2} \& \\boldsymbol D_{N/2} \\ \\boldsymbol I_{N/2} \& -\\boldsymbol D_{N/2} \\end{bmatrix} \\begin{bmatrix} \\boldsymbol X_0 \\ \\boldsymbol X_1 \\end{bmatrix}
其中 IN/2\boldsymbol I_{N/2}IN/2 是N/2阶单位矩阵;
DN/2\boldsymbol D_{N/2}DN/2 是对角矩阵,对角元素:DN/2k,k=ωNk, k=0,1,...,N/2−1\boldsymbol D_{N/2}k,k=\omega_N^k,\ k=0,1,\dots,N/2-1DN/2k,k=ωNk, k=0,1,...,N/2−1
把上面式子连起来:
\\boldsymbol X \\begin{bmatrix} \\boldsymbol I_{N/2} \& \\boldsymbol D_{N/2} \\ \\boldsymbol I_{N/2} \& -\\boldsymbol D_{N/2} \\end{bmatrix} \\cdot \\begin{bmatrix} \\boldsymbol F_{N/2} \& \\boldsymbol 0 \\ \\boldsymbol 0 \& \\boldsymbol F_{N/2} \\end{bmatrix} \\cdot \\boldsymbol P_N \\boldsymbol x
又因为DFT定义:X=FNx\boldsymbol X = \boldsymbol F_N \boldsymbol xX=FNx,两边消去x\boldsymbol xx,得到FN\boldsymbol{F}_NFN的矩阵分解:
\\boldsymbol F_N \\begin{bmatrix} \\boldsymbol I_{N/2} \& \\boldsymbol D_{N/2} \\ \\boldsymbol I_{N/2} \& -\\boldsymbol D_{N/2} \\end{bmatrix} \\begin{bmatrix} \\boldsymbol F_{N/2} \& \\boldsymbol 0 \\ \\boldsymbol 0 \& \\boldsymbol F_{N/2} \\end{bmatrix} \\boldsymbol P_N
递归含义
FN\boldsymbol F_NFN 的计算,分解为:
- PN\boldsymbol P_NPN:置换矩阵,对原输入向量奇偶重排
- 分块对角矩阵:分别计算两个N/2点DFT(递归调用FFT)
- 蝶形矩阵:利用旋转因子对角阵,合并两组N/2点DFT结果,得到N点DFT输出
这个分解可以一直递归下去,直到N=2(二阶DFT矩阵)。
N=2最简例子验证
N=2,ω2=e−jπ=−1\omega_2 = e^{-j\pi}=-1ω2=e−jπ=−1
F2=111−1 \boldsymbol F_2=\begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} F2=111−1
套用上面拆分:N=2,N/2=1;F1=1\boldsymbol F_1=1F1=1;D1=ω20=1\boldsymbol D_1=\\omega_2\^0=1D1=ω20=1;P2\boldsymbol P_2P2 置换矩阵,N=2奇偶重排不变 P2=I2\boldsymbol P_2=\boldsymbol I_2P2=I2
\\begin{bmatrix} \\boldsymbol I_1 \& \\boldsymbol D_1 \\ \\boldsymbol I_1 \& -\\boldsymbol D_1 \\end{bmatrix} \\begin{bmatrix} \\boldsymbol F_1 \& 0 \\ 0 \& \\boldsymbol F_1 \\end{bmatrix} \\boldsymbol P_2 \\begin{bmatrix} 1 \& 1 \\ 1 \& -1 \\end{bmatrix} \\begin{bmatrix} 1 \& 0 \\ 0 \& 1 \\end{bmatrix} \\begin{bmatrix} 1 \& 0 \\ 0 \& 1 \\end{bmatrix} =\\boldsymbol F_2
等式成立。
补充说明
- FFT本质就是不断递归执行这个矩阵分解;不需要显式构造任何一个大FN\boldsymbol{F}_NFN矩阵,只需要在代码中计算蝶形乘加。
- DIT(时间抽取):输入重排,输出自然顺序 ;对应的置换矩阵PN\boldsymbol{P}_NPN作用在输入侧。
- 如果是DIF(频率抽取FFT),矩阵拆分形式会变,置换矩阵移动到输出侧。