A Efficient method of computing DFT: Fast Fourier Transformation (FFT) algorithm (not finished)

The DFT is defined by Eq. (34), i.e.,

     N∑ −1  kj
Hj ≡     W  hk,
     k=0
(82)

where W = exp(2πi∕N). Equations (82) indicates that the DFT is the multiplication of a transformation matrix Mkj Wkj with a column vector hk, where the transformation matrix Mkj is symmetric and called DFT matrix. In the matrix form, the DFT is written as

(       )    (                                              ) (       )
    H1         1    1        1        1     ...      1            h1
||   H2  ||    || 1   W 1      W 2      W 3    ...    W N− 1   || ||   h2  ||
||   H3  ||    || 1   W 2      W 4      W 6    ...   W 2(N −1)  || ||   h3  ||
||   H4  ||  = || 1   W 3      W 6      W 9    ...   W 3(N −1)  || ||   h4  ||
|(    ...  |)    |( ..    ..        ..        ..     ...      ..      |) |(    ...  |)
  H            .    .N− 1   2(.N−1)    3.(N− 1)        (N−.1)(N −1)     h
    N− 1       1  W      W         W        ... W                 N−1
(83)

If directly using the definition in Eq. (83) to compute DFT, then a matrix multiplication need to be performed, which requires O(N2) operations. Here the powers of W are assumed to be pre-computed, and we define “an operation” as a multiplication followed by an addition.

 

The Fast Fourier Transformation (FFT) algorithm manage to reduce the complexity of computing the DFT from O(N2) to O(N log 2N) by factoring the DFT matrix Mkj into a product of sparse matrices.

The original paper on FFT is Cooley and Tukey’s paper: An algorithm for the machine calculation of complex Fourier series, which turns out to be a very concise paper.

Suppose N is a composite, i.e., N = r1 r2. Then the indices in Eq. (82) can be expressed as

j = j r + j,    j = 0,1,...,r  − 1,   j  = 0,1,...,r − 1
    1 1   0      0          1         1          2
(84)

k = k1r2 +k0,    k0 = 0,1,...,r2 − 1,  k1 = 0,1,...,r1 − 1
(85)

Then, one can write

         ∑   ∑
H(j0,j1) =       h(k0,k1)W (jk1r2+jk0),
          k0 k1
(86)

Noting that

W jk1r2 = W j1r1k1r2+j0k1r2 = W j0k1r2
(87)

Eq. () is written as

             (                   )
H (j0,j1) = ∑   ∑  h(k0,k1)W (j0k1r2)  W (jk0),
           k0   k1
(88)

where the inner sum over k1 is independent of j1 and can be defined as a new array

           ∑
h1(j0,k0) =    h(k0,k1)W (j0k1r2).
           k1
(89)

Then

          ∑
H (j0,j1) =    h1(j0,k0)W (j1r1+j0)k0,
          k0
(90)

There are N elements in the array h1, each requiring r1 operations, giving a total of Nr1 operation to obtain h1. Similarly, it takes Nr2 operations to calculate H from h1. Therefore, this two-step algorithm requires a total of N(r1 + r2) operations.