## 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: