Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab inverse FFT from phase/magnitude only

Tags:

matlab

fft

phase

So I have this image 'I'. I take F = fft2(I) to get the 2D fourier transform. To reconstruct it, I could go ifft2(F).

The problem is, I need to reconstruct this image from only the a) magnitude, and b) phase components of F. How can I separate these two components of the fourier transform, and then reconstruct the image from each?

I tried the abs() and angle() functions to get magnitude and phase, but the phase one won't reconstruct properly.

Help?

like image 265
Jordan Avatar asked Oct 14 '11 04:10

Jordan


People also ask

How do you do inverse FFT in Matlab?

X = ifft( Y ) computes the inverse discrete Fourier transform of Y using a fast Fourier transform algorithm. X is the same size as Y . If Y is a vector, then ifft(Y) returns the inverse transform of the vector. If Y is a matrix, then ifft(Y) returns the inverse transform of each column of the matrix.

How do you combine magnitude and phase in Matlab?

For images in Matlab, it consist of a 2D complex array. You can create a 2D complex array merging the magnitude and phase like this: FreqDomain = abs(Y). *exp(i*angle(X));

Is FFT the same as IFFT?

FFT (Fast Fourier Transform) is able to convert a signal from the time domain to the frequency domain. IFFT (Inverse FFT) converts a signal from the frequency domain to the time domain.

How do I scale FFT in Matlab?

the matlab fft outputs 2 pics of amplitude A*Npoints/2 and so the correct way of scaling the spectrum is multiplying the fft by dt = 1/Fs.


2 Answers

it's too late to put another answer to this post, but...anyway

@ zhilevan, you can use the codes I have written using mtrw's answer:

image = rgb2gray(imread('pillsetc.png')); 
subplot(131),imshow(image),title('original image');
set(gcf, 'Position', get(0, 'ScreenSize')); % maximize the figure window
%:::::::::::::::::::::
F = fft2(double(image));
F_Mag = abs(F); % has the same magnitude as image, 0 phase 
F_Phase = exp(1i*angle(F)); % has magnitude 1, same phase as image
% OR: F_Phase = cos(angle(F)) + 1i*(sin(angle(F)));
%:::::::::::::::::::::
% reconstruction
I_Mag = log(abs(ifft2(F_Mag*exp(i*0)))+1);
I_Phase = ifft2(F_Phase);
%:::::::::::::::::::::
% Calculate limits for plotting
% To display the images properly using imshow, the color range
% of the plot must the minimum and maximum values in the data.
I_Mag_min = min(min(abs(I_Mag)));
I_Mag_max = max(max(abs(I_Mag)));

I_Phase_min = min(min(abs(I_Phase)));
I_Phase_max = max(max(abs(I_Phase)));
%:::::::::::::::::::::
% Display reconstructed images
% because the magnitude and phase were switched, the image will be complex.
% This means that the magnitude of the image must be taken in order to
% produce a viewable 2-D image.
subplot(132),imshow(abs(I_Mag),[I_Mag_min I_Mag_max]), colormap gray 
title('reconstructed image only by Magnitude');
subplot(133),imshow(abs(I_Phase),[I_Phase_min I_Phase_max]), colormap gray 
title('reconstructed image only by Phase');
like image 113
Leo Avatar answered Sep 28 '22 22:09

Leo


You need one matrix with the same magnitude as F and 0 phase, and another with the same phase as F and uniform magnitude. As you noted abs gives you the magnitude. To get the uniform magnitude same phase matrix, you need to use angle to get the phase, and then separate the phase back into real and imaginary parts.

> F_Mag = abs(F); %# has same magnitude as F, 0 phase
> F_Phase = cos(angle(F)) + j*(sin(angle(F)); %# has magnitude 1, same phase as F
> I_Mag = ifft2(F_Mag);
> I_Phase = ifft2(F_Phase);
like image 42
mtrw Avatar answered Sep 28 '22 20:09

mtrw