Language Reference |
computes the inverse finite Fourier transform
Note: For 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).
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 where 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.
Copyright © 2009 by SAS Institute Inc., Cary, NC, USA. All rights reserved.