MATLAB Answers

how to make inverse fourrier transform in the correct way?

2 views (last 30 days)
Kobi
Kobi on 7 Jul 2016
Commented: Adam on 7 Jul 2016
as you can see in my code, i made a fft of a simple signal but when i try to reconstruct it using ifft i can only see it in the ABS way, meaning that the ifft that i made is incorrect, please let me know what i did wrong
clear all
close all
clc
Ts=0.001;
t=0:Ts:10;
omega1=2*pi*15;
omega2=2*pi*40;
x=sin(omega1*t)+sin(omega2*t);
figure(1)
subplot(4,1,1)
plot(t,x)
grid on
xlim([0 0.1*pi])
title('\bf x=sin(\omega_1t)+sin(\omega_2t)')
xlabel('t[sec]')
ylabel('x(t)')
X_dft=fftshift(fft(x))/length(x);
Fs=1/Ts;
f=linspace(-Fs/2,Fs/2,length(t));
subplot(4,1,2)
plot(f,abs(X_dft))
grid on
xlim([-60 60])
title('\bf |Fourrier(x)|')
xlabel('f[Hz]')
ylabel('|X(f)|')
subplot(4,1,3)
X_phase=angle(X_dft);
plot(f,X_phase)
grid on
xlim([-60 60])
title('\bf Phase(x)')
xlabel('f[Hz]')
ylabel('Angle (\theta) [Radians]')
subplot(4,1,4)
x_ifft=abs(ifft(X_dft))*length(x);
plot(t,x_ifft)
grid on
xlim([0 0.1*pi])
title('\bf |x=sin(\omega_1t)+sin(\omega_2t)|')
xlabel('t[sec]')
ylabel('|x(t)|')

  5 Comments

Show 2 older comments
Adam
Adam on 7 Jul 2016
The original signal is the real part of the ifft if you literally just do an fft and then do an ifft on that without any intermediate editing. Even if you do editing it is always the real part of the returned signal that is in the same domain as the real signal you started with.
Kobi
Kobi on 7 Jul 2016
the real part shows me some weird signal with a lot of fluctuations....
Adam
Adam on 7 Jul 2016
That probably comes from doing an fftshift - this is un-necessary and indeed gives incorrect results when applying an ifft to its result.

Sign in to comment.

Accepted Answer

Thorsten
Thorsten on 7 Jul 2016
Simple as this:
u = fft(x);
x2 = ifft(u);
The difference is within the tolerance of machine precision:
max(abs(x - x2))
ans =
3.10862446895044e-15

  0 Comments

Sign in to comment.

More Answers (0)