# Can I calculate the form of the aperture from the diffraction pattern?

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:

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

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.

• 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. Feb 3 '15 at 11:08
• 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. Feb 3 '15 at 15:19
• @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. 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
rng(0);

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')]);
end

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