IFFT Function

IFFT( f ) ;

The IFFT function computes the inverse finite Fourier transform of a matrix f, where f is an numeric matrix.

The IFFT function expands a set of sine and cosine coefficients into a sequence equal to the sum of the coefficients times the sine and cosine functions. The argument f is an matrix; the value returned is an vector.

If the element in the last row and second column of f is exactly 0, then is ; otherwise, is .

The inverse finite Fourier transform of a two column matrix , denoted by the vector , is

     

for , where if is even, or if is odd.

For the most efficient use of the IFFT function, should be a power of 2. If is a power of 2, a fast Fourier transform is used (Singleton; 1969); otherwise, a Chirp-Z algorithm is used (Monro and Branch; 1976).

The expression IFFT(FFT(X)) returns times , where is the dimension of . If is not the Fourier transform of a real sequence, then the vector generated by the IFFT function is not a true inverse Fourier transform. However, applications exist in which the FFT and IFFT functions can be used for operations on multidimensional or complex data (Gentleman and Sande; 1966; Nussbaumer; 1982).

As an example, the convolution of two vectors () and () can be accomplished by using the following module:

start conv(u,v);
/* w = conv(u,v) convolves vectors u and v.
 * Algebraically, convolution is the same operation as
 * multiplying the polynomials whose coefficients are the
 * elements of u and v. Straight convolution is too slow,
 * so use the FFT.
 *
 * Both of u and v are column vectors.
 */
   m = nrow(u);
   n = nrow(v);

   wn = m + n - 1;
   /* find p so that 2##(p-1) < wn <= 2##p */
   p = ceil( log(wn)/ log(2) );
   nice = 2##p;

   a = fft( u // j(nice-m,1,0) );
   b = fft( v // j(nice-n,1,0) );
   /* complex multiplication of a and b */
   wReal = a[,1]#b[,1] - a[,2]#b[,2];
   wImag = a[,1]#b[,2] + a[,2]#b[,1];
   w = wReal || wImag;
   z=ifft(w);
   z = z[1:wn,1] / nice;  /* take real part and first wn elements */
   return (z);
finish;

/* example of convolution of two waveforms */
TimeStep = 0.01;
t = T( do(0,8,TimeStep) );

Signal = j(nrow(t),1,5);
Signal[ loc(t>4) ] = -5;

ImpulseResponse = j(nrow(t),1,0);
ImpulseResponse[ loc(t<=2) ] = 3;

/* The time domain for this convolution is [0,16]
   with the same time step.
   For waveforms, rescale amplitude by the time step. */
y = conv(Signal,ImpulseResponse) * TimeStep;

Other applications of the FFT and IFFT functions include windowed spectral estimates and the inverse autocorrelation function.