DFT的矩阵表示
[X(0)X(1)X(2)⋮X(k)⋮X(N−1)]=[WNij][x(0)x(1)x(2)⋮x(k)⋮x(N−1)]
\begin{bmatrix}X(0) \\ X(1) \\ X(2) \\ \vdots \\ X(k) \\ \vdots \\ X(N-1)\end{bmatrix}= [W_N^{ij}]\begin{bmatrix}x(0) \\ x(1) \\ x(2) \\ \vdots \\ x(k) \\ \vdots \\ x(N-1)\end{bmatrix}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡X(0)X(1)X(2)⋮X(k)⋮X(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=[WNij]⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x(0)x(1)x(2)⋮x(k)⋮x(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
忽略复数加法,DFT方法需要N2次复数乘法。
基-2DIT-FFT算法(该算法只适用于N=2lN=2^lN=2l的情况)
将N点序列(N=2lN=2^lN=2l)分解为奇序列和偶序列两个N/2N/2N/2序列,分别计算其DFT。
XN(k)=∑n=0N−1x(n)WNnk k=0,1,…,N−1=∑n=偶整数x(n)WNnk+∑n=奇整数x(n)WNnk=∑r=0(N/2)−1x(2r)WN2rk+∑r=0(N/2)−1x(2r+1)WN(2r+1)k=∑r=0(N/2)−1x(2r)(WN2)rk+WNk∑r=0(N/2)−1x(2r+1)(WN2)rk=∑r=0(N/2)−1x(2r)WN/2rk+WNk∑r=0(N/2)−1x(2r+1)WN/2rk=GN/2(k)+WNkHN/2(k)
\begin{aligned}X_N(k) &= \sum_{n=0}^{N-1} x(n)W_N^{nk} \ \ \ \ k=0,1,\dots,N-1 \\&= \sum_{\text{n=偶整数}}x(n)W_N^{nk} + \sum_{\text{n=奇整数}}x(n)W_N^{nk} \\&= \sum_{r=0}^{(N/2)-1}x(2r)W_N^{2rk} + \sum_{r=0}^{(N/2)-1}x(2r+1)W_N^{(2r+1)k} \\&= \sum_{r=0}^{(N/2)-1}x(2r)(W_N^2)^{rk} + W_N^k\sum_{r=0}^{(N/2)-1}x(2r+1)(W_N^2)^{rk} \\&= \sum_{r=0}^{(N/2)-1}x(2r)W_{N/2}^{rk} + W_N^k\sum_{r=0}^{(N/2)-1}x(2r+1)W_{N/2}^{rk} \\&= G_{N/2}(k) + W_N^k H_{N/2}(k)
\end{aligned}
XN(k)=n=0∑N−1x(n)WNnk k=0,1,…,N−1=n=偶整数∑x(n)WNnk+n=奇整数∑x(n)WNnk=r=0∑(N/2)−1x(2r)WN2rk+r=0∑(N/2)−1x(2r+1)WN(2r+1)k=r=0∑(N/2)−1x(2r)(WN2)rk+WNkr=0∑(N/2)−1x(2r+1)(WN2)rk=r=0∑(N/2)−1x(2r)WN/2rk+WNkr=0∑(N/2)−1x(2r+1)WN/2rk=GN/2(k)+WNkHN/2(k)
XN(k+N2)=GN/2(k)+WNk+N2HN/2(k)=GN/2(k)−WNkHN/2(k) \begin{aligned}X_N(k+\frac{N}{2})&= G_{N/2}(k) + W_N^{k+\frac{N}{2}} H_{N/2}(k) \\&= G_{N/2}(k) - W_N^k H_{N/2}(k)\end{aligned} XN(k+2N)=GN/2(k)+WNk+2NHN/2(k)=GN/2(k)−WNkHN/2(k)
方便讨论,记N点DFT计算中的DFT矩阵[WNij][W_N^{ij}][WNij]为FNF_NFN。
将FNF_NFN分解,则得到
FN=[IN/2DN/2IN/2−DN/2][FN/2OOFN/2]PN
F_N = \begin{bmatrix}I_{N/2} & D_{N/2} \\I_{N/2} & -D_{N/2}\end{bmatrix}\begin{bmatrix}F_{N/2} & \Omicron \\\Omicron & F_{N/2}\end{bmatrix}P_N
FN=[IN/2IN/2DN/2−DN/2][FN/2OOFN/2]PN
其中,
DN/2=diag[WNk] k=0,1,…,N2−1
D_{N/2} = diag[W_N^k] \ \ \ \ \ k=0,1,\dots,\frac{N}{2}-1
DN/2=diag[WNk] k=0,1,…,2N−1
PNP_NPN为置换矩阵,用于将x(n)x(n)x(n)的奇偶序列分开,举例说明,当N=4N=4N=4和N=8N=8N=8时,P4P_4P4和P8P_8P8为
P4=[1000001001000001]
P_4 =
\begin{bmatrix}
1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
\end{bmatrix}
P4=⎣⎢⎢⎡1000001001000001⎦⎥⎥⎤
P8=[1000000000100000000010000000001001000000000100000000010000000001] P_8 = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ \end{bmatrix} P8=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1000000000001000010000000000010000100000000000100001000000000001⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
方便理解,我写出第一次迭代完整过程。
[X(0)X(1)X(2)⋮X(k)⋮X(N−1)]=[WNij][x(0)x(1)x(2)⋮x(k)⋮x(N−1)]=FNx=[IN/2DN/2IN/2−DN/2][FN/2OOFN/2]PNx=[IN/2DN/2IN/2−DN/2][FN/2OOFN/2][x(0)x(2)⋮x(N−2)- - - - - - -x(1)x(3)⋮x(N−1)]=[IN/2DN/2IN/2−DN/2][GN/2(k)HN/2(k)]=[GN/2(k)+WNkHN/2(k)GN/2(k)−WNkHN/2(k)]=[XN(k)XN(k+N2)] k=0,1,…,N2−1
\begin{aligned}\begin{bmatrix}X(0) \\ X(1) \\ X(2) \\ \vdots \\ X(k) \\ \vdots \\ X(N-1)\end{bmatrix}= [W_N^{ij}]\begin{bmatrix}x(0) \\ x(1) \\ x(2) \\ \vdots \\ x(k) \\ \vdots \\ x(N-1)\end{bmatrix}&= F_Nx \\&= \begin{bmatrix}I_{N/2} & D_{N/2} \\I_{N/2} & -D_{N/2}\end{bmatrix}\begin{bmatrix}F_{N/2} & \Omicron \\\Omicron & F_{N/2}\end{bmatrix}P_N x \\&= \begin{bmatrix}I_{N/2} & D_{N/2} \\I_{N/2} & -D_{N/2}\end{bmatrix}\begin{bmatrix}F_{N/2} & \Omicron \\\Omicron & F_{N/2}\end{bmatrix}\begin{bmatrix}x(0) \\ x(2) \\ \vdots \\ x(N-2) \\ \text{- - - - - - -}\\ x(1) \\ x(3) \\ \vdots \\ x(N-1)\end{bmatrix} \\&=\begin{bmatrix}I_{N/2} & D_{N/2} \\I_{N/2} & -D_{N/2}\end{bmatrix}\begin{bmatrix}G_{N/2}(k) \\ H_{N/2}(k)\end{bmatrix} \\&=\begin{bmatrix}G_{N/2}(k) + W_N^k H_{N/2}(k) \\G_{N/2}(k) - W_N^k H_{N/2}(k)\end{bmatrix} \\&=\begin{bmatrix}X_N(k) \\X_N(k+\frac{N}{2})\end{bmatrix}\ \ \ \ \ \ \ \ k=0,1,\dots,\frac{N}{2}-1\end{aligned}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡X(0)X(1)X(2)⋮X(k)⋮X(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=[WNij]⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x(0)x(1)x(2)⋮x(k)⋮x(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=FNx=[IN/2IN/2DN/2−DN/2][FN/2OOFN/2]PNx=[IN/2IN/2DN/2−DN/2][FN/2OOFN/2]⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x(0)x(2)⋮x(N−2)- - - - - - -x(1)x(3)⋮x(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=[IN/2IN/2DN/2−DN/2][GN/2(k)HN/2(k)]=[GN/2(k)+WNkHN/2(k)GN/2(k)−WNkHN/2(k)]=[XN(k)XN(k+2N)] k=0,1,…,2N−1
FN/2F_{N/2}FN/2还能继续分解,直到分解到F2F_2F2
F2=[111−1]
F_2 =
\begin{bmatrix}
1 & 1 \\
1 & -1 \\
\end{bmatrix}
F2=[111−1]
最终只需N2logN\dfrac{N}{2}logN2NlogN次复数乘法。
function [Xk] = myfft(xn,N)
if(N == 2)
Xk = [xn(1)+xn(2);xn(1)-xn(2)];
else
xk_e = myfft(xn(1:2:N-1),N/2);
xk_o = myfft(xn(2:2:N),N/2);
WN = exp(-1i*2*pi/N);
n = 0:1:N/2-1;
D = (WN*(ones(1,N/2))).^n;
tmp = (D.') .* xk_o;
Xk = [xk_e+tmp;xk_e-tmp];
end
IFFT同理,将DND_NDN中的元素改为WN−kW_N^{-k}WN−k,并将最后结果乘以1N\dfrac{1}{N}N1。
function [xn] = myifft(Xk,N)
if(N == 2)
xn = [Xk(1)+Xk(2);Xk(1)-Xk(2)];
else
xn_e = myifft(Xk(1:2:N-1),N/2);
xn_o = myifft(Xk(2:2:N),N/2);
WN = exp(1i*2*pi/N);
n = 0:1:N/2-1;
D = (WN*(ones(1,N/2))).^n;
tmp = (D.') .* xn_o;
xn = [xn_e+tmp;xn_e-tmp] / N;
end
本文介绍了基-2DIT-FFT算法的原理,该算法适用于N=2^l的情况。通过分解序列并计算奇偶序列的DFT,减少复数乘法次数。文章详细展示了矩阵表示、迭代过程,并给出了MATLAB实现的思路。

1万+

被折叠的 条评论
为什么被折叠?



