1
votes

In Matlab/Octave/Scipy, what is the correct way of shifting the frequency components after performing 2D Fourier transforms back and forth between two planes (with the output plane being the far-field diffraction plane of the input plane) ?

Let's say that I would like to run an iterative Fourier-transform algorithm between these two planes in order to compute a hologram (the phase-delay pattern to be applied to the input plane), in order to obtain a given intensity pattern in the output plane.

Let the field in the input plane be called A and the field in the output plane called B.

So B will be the Fourier transform of A, and A the inverse Fourier transform of B (this follows from the Franhauffer diffraction theory).

The question is: in what order shall I shift the frequency components with the command fftshift in between the Fourier transforms connecting the two planes ?

It seems that writing the following does not do the job: B=fftshift(fft2(A)); A2=fftshift(ifft2(B));

This is probably a common issue but I couldn't find the answer anywhere..

1
Why do you want to use fftshift at all?Oliver Charlesworth
Good question.. Actually, I have the desired moduli of the field in both planes, which replace the moduli of the input and output field at each iteration - so even if I don't fftshift the computed field after each fft2, I will need to shift the desired moduli.. Do you follow the argument ?calvin tiger

1 Answers

3
votes

I'm not sure I understand your use-case, but the general purpose for fftshift is to rotate the output of fft so that the DC (zero frequency) bin is centred. So the usual pattern is:

X       = fft2(x);         % DC at X(1,1)
X_shift = fftshift(X);     % DC at X_shift(M/2+1,N/2+1)

% ... processing occurs here (Y_shift = foo(X_shift)) ...

Y       = ifftshift(Y_shift);
y       = ifft2(Y);