As I understand, the Fraunhofer diffraction pattern of light is the Fourier transform of the aperture. More precisely, the amplitude of light would be the Fourier transform and the intensity its modulus squared.

For example, I've computed the FFT of this image:

enter image description here

Which gives as expected, the diffraction pattern of a circular aperture:

enter image description here

Now, would the reverse problem be possible? To know the diffraction pattern and calculate the form of the aperture.

Since we lose the phase information this shouldn't be possible in general, but maybe there is some symmetry we can exploit for simple apertures.

  • 1
    $\begingroup$ With a centrosymmetric aperture isn't the FT always real? In that case you just need to work out if the FT is positive or negative, which you can probably do by analysing the nodal structure of its square. $\endgroup$ Feb 3 '15 at 11:08
  • 1
    $\begingroup$ So long as you've got enough signal in the higher-order maxima, applying an inverse 2D FFT should get you close to the aperture shape. $\endgroup$ Feb 3 '15 at 15:19
  • $\begingroup$ @CarlWitthoft How could I know that? I obtained this: i.stack.imgur.com/y85Ly.jpg, which doesn't seem to make sense. But it may be a computational issue, since I don't really know what I'm doing. $\endgroup$
    – jinawee
    Feb 3 '15 at 22:09

What you are trying to do is called phase retrieval, i.e. retrieve the complex scalar field from its spectrum (aka the Fourier transform amplitudes). There have been many algorithms around for more than 40 years. To my knowledge, this is still an open question. The algorithm convergence is, very few, promised.

Starting from your question. The prior you have, are:

  • The support area is a circle. Outside area is all-zero.
  • The aperture is binary, i.e. your desired signal is either 1 or 0. However this will somehow constraint your solver and worsen the performance.

You can try the error-reduction algorithm, or Fienup's hybrid-input-output method.

I am using the error-reduction algorithm, here is a MATLAB demo for your data:

clc;clear;close all;

% for reproducible

% load data and normalize
p_true = imread('aperture.jpg');
p_true = double(rgb2gray(p_true))/255;

% generate the diffraction pattern
h = abs(fft2(p_true));

% get prior
area_ind = p_true ~= 0;

% set algorithm parameter
iter = 1e3;

% set initialization
p = rand(size(h));
p(~area_ind) = 0;

% the algorithm
for k = 1:iter
    % error reduction
    temp = fft2(p);
    p = ifft2( h .* temp ./ abs(temp) );

    % impose prior
    p(~area_ind) = 0;

    % record
    disp(['k = ' num2str(k) ', err = ' num2str(norm(p-p_true,'fro'),'%e')]);

% show the result
figure;     imshow([p_true p], []);
title('Left: true. Right: our reconstruction');



Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.