4.0

4.0 | 3 ratings Rate this file 56 Downloads (last 30 days) File Size: 101.9 KB File ID: #25473

Why use fftshift(fft(fftshift(x))) in Matlab instead of fft(x)?

by Kan Wu

 

02 Oct 2009

Explain why we use fftshift(fft(fftshift(x))) in Matlab instead of fft(x)

| Watch this File

File Information
Description

Explain why we use fftshift(fft(fftshift(x))) in Matlab instead of fft(x). An example is given. The example and Matlab codes are partially copied from Daniele Disco ‘s work in "A guide to the Fast Fourier Transform, 2nd Edition".

MATLAB release MATLAB 7.6 (R2008a)
Tags for This File  
Everyone's Tags
Tags I've Applied
Add New Tags Please login to tag files.
Comments and Ratings (6)
21 Oct 2009 Kan Wu  
18 Dec 2009 Matt Fetterman

Very interesting!

14 May 2010 Shalin Mehta

There is a problem with above recipe. It fails when you have sequence of odd length. Correct recipe is:
fftshift(fft(ifftshift(sig))) or fftshift(ifft(ifftshift(spectrum))).

A description of this can be found on my submission on fftshift, ifftshift.

To observe that above is true, run the following code with fftshift and ifftshift on inner call for computing Xfinal.
-------------------------
Bx = 50;
A = sqrt(log(2))/(2*pi*Bx);
fs = 500; %sampling frequency
dt = 1/fs; %time step
T=1; %total time window
t = -T/2:dt:T/2; %time grids
df = 1/T; %freq step
Fmax = 1/2/dt; %freq window
f=-Fmax:df:Fmax; %freq grids, not used in our examples, could be used by plot(f, X)

x = exp(-t.^2/(2*A^2));
Xan = A*sqrt(2*pi)*exp(-2*pi^2*f.^2*A^2); %X(f), analytical Fourier transform of x(t), real
Xfft = dt * fft(x); %directly using fft()
Xfftshift = dt * fft(fftshift(x)); %using fftshift() before fft()
Xfinal = dt * fftshift(fft(ifftshift(x))); %identical with analytical X(f), also note dt
subplot(211); plot(f,Xan,f,real(Xfinal),'--');
subplot(212); plot(f,imag(Xfinal));

16 May 2010 Kan Wu

To Mehta, yes you r right. ifftshift is used for sequence with odd length. Thank you for the correction!

18 May 2010 Shalin Mehta

You're welcome. ifftshift is the same as fftshift for even length sequence, but different for odd length. So if one uses fftshift(fft(ifftshift(...))) things work well. By the way, scaling by dt and df to correct for scaling introduced by FFT algorithm is neat trick.

23 May 2010 zhang lanqing

thanl you very much !

Please login to add a comment or rating.
Tag Activity for this File
Tag Applied By Date/Time
signal processing Kan Wu 05 Oct 2009 11:13:29
fast fourier transform Kan Wu 05 Oct 2009 11:13:29

Contact us at files@mathworks.com