FFT (Inverse) Fast Fourier Transform Function

Section: Transforms/Decompositions

Usage

Computes the Discrete Fourier Transform (DFT) of a vector using the Fast Fourier Transform technique. The general syntax for its use is
  y = fft(x,n,d)

where x is an n-dimensional array of numerical type. Integer types are promoted to the double type prior to calculation of the DFT. The argument n is the length of the FFT, and d is the dimension along which to take the DFT. If |n| is larger than the length of x along dimension d, then x is zero-padded (by appending zeros) prior to calculation of the DFT. If n is smaller than the length of x along the given dimension, then x is truncated (by removing elements at the end) to length n.

If d is omitted, then the DFT is taken along the first non-singleton dimension of x. If n is omitted, then the DFT length is chosen to match of the length of x along dimension d.

Function Internals

The output is computed via

For the inverse DFT, the calculation is similar, and the arguments have the same meanings as the DFT:

The FFT is computed using the FFTPack library, available from netlib at http://www.netlib.org. Generally speaking, the computational cost for a FFT is (in worst case) O(n^2). However, if n is composite, and can be factored as

then the DFT can be computed in

operations. If n is a power of 2, then the FFT can be calculated in O(n log_2 n). The calculations for the inverse FFT are identical.

Example

The following piece of code plots the FFT for a sinusoidal signal:
--> t = linspace(0,2*pi,128);
--> x = cos(15*t);
--> y = fft(x);
--> plot(t,abs(y));

The resulting plot is:

The FFT can also be taken along different dimensions, and with padding and/or truncation. The following example demonstrates the Fourier Transform being computed along each column, and then along each row.

--> A = [2,5;3,6]
A = 
  <int32>  - size: [2 2]
 
Columns 1 to 2
 2  5  
 3  6  
--> real(fft(A,[],1))
ans = 
  <float>  - size: [2 2]
 
Columns 1 to 2
  5  11  
 -1  -1  
--> real(fft(A,[],2))
ans = 
  <float>  - size: [2 2]
 
Columns 1 to 2
  7  -3  
  9  -3  

Fourier transforms can also be padded using the n argument. This pads the signal with zeros prior to taking the Fourier transform. Zero padding in the time domain results in frequency interpolation. The following example demonstrates the FFT of a pulse (consisting of 10 ones) with (red line) and without (green circles) padding.

--> delta(1:10) = 1;
--> plot((0:255)/256*pi*2,real(fft(delta,256)),'r-');
--> hold on
--> plot((0:9)/10*pi*2,real(fft(delta)),'go');

The resulting plot is: