1D Real-to-Complex Periodic Fourier Transforms: The periodic Fourier Transform of a real sequence x[i], i=0,...,N-1 is Hermitian (exhibits conjugate symmetry around its middle point).
If X[i],i=0,...,N-1 are the complex values of the Fourier Transform, then
X[i] = conj(X[N-i]), i=1,...,N-1 (eq. 1) |
Consider for example the real sequence:
X = 0 1 2 3 4 5 6 7 |
Its Fourier Transform is:
X = 28.0000 -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 -4.0000 - 1.6569i -4.0000 - 4.0000i -4.0000 - 9.6569i |
As you can see:
X[1] = conj(X[7]) X[2] = conj(X[6]) X[3] = conj(X[5]) X[4] = conj(X[4]) (i.e., X[4] is real) X[5] = conj(X[3]) X[6] = conj(X[2]) X[7] = conj(X[1]) |
Because of the Hermitian symmetry, only N/2+1 = 5 values of the complex sequence X need to be calculated and stored. The rest can be computed from (1).
Note that X[0] and X[N/2] are real valued so they can be grouped together as one complex number. In fact S3L stores the sequence X as:
X[0] X[N/2] X[1] X[2] or X = 28.0000 - 4.0000i -4.0000 + 9.6569i -4.0000 - 4.0000i -4.0000 + 1.6569i |
The first line in this example represent the real and imaginary parts of a complex number.
To summarize, in S3L, the Fourier Transform of a real-valued sequence of length N (where N is even), is stored as a real sequence of length N. This is equivalent to a complex sequence of length N/2.
2D Fourier Transform: The method used for 2D FFTs is similar to that used for 1D FFTs. When transforming each of the array columns, only half of the data is stored.
3D Real to Hermitian FFT: As with the 1D and 2D FFTs, no extra storage is required for the 3D FFT of real data, since advantage is taken of all possible symmetries. For an array a(M,N,K), the result is packed in complex b(M/2,N,K) array. Hermitian symmetries exist along the planes a(0,:,:) and a(M/2,:,:) and along dimension 1.
See the rc_fft.c and rc_fft.f program examples for illustrations of these concepts. The paths for these online examples are provided at the end of this section.