# How to compute correct phase in FFT even after applying phase unwrap and zeroing round off error?

I am converting a time-domain synthetic 1D signal to frequency domain using MATLAB fft. In the frequency domain, the amplitude vs frequency plot is coming reasonable which means it is showing the correct amplitudes at the desired frequencies. But in the phase vs frequency plot, things are not coming any close to being reasonable. It is showing incorrect phase values at the frequency values present in the fabricated signal. I have pasted my code here:

Ws=100;  % sample @ 100 Hz

T=10;    % collect data long enough for at least a couple cycles

N=T*Ws;  % compute number samples needed for above

t = linspace(0,T,N);  % and generate time vector

y = (2.2*cos((2*pi*4*t)+(pi/3)))+(1.4*cos((2*pi*10*t)+(pi/6)))+(0.8*cos((2*pi*16*t)));  % and a sample signal

subplot(1,3,1)

plot(t,y)

xlabel('Time(s)')

ylabel('Amplitude')

Y = fft(y)/N;                % FFT

PSD = 2*abs(Y(1:N/2+1));     % and the PSD one-sided

f = linspace(0,Ws/2,N/2+1);  % compute freq vector for Ws

subplot(1,3,2)

stem(f,PSD)                   % plot the result

xlabel('Frequency(Hz)')

ylabel('Amplitude')

Y2=Y;   %store the FFT results in another array

%detect noise (very small numbers (eps)) and ignore them

threshold = max(abs(Y))/10; %tolerance threshold

Y2(abs(Y)<threshold) = 0; %mask out values that are below the threshold

subplot(1,3,3)

stem(f,phase(1:length(f)))                   % plot the result

xlabel('Frequency(Hz))')

ylabel('Phase')


I am also attaching the plot which I got. Any help would be greatly appreciated.

• quicknote, you simply use to need the phase function on a complex number. You don't need to call atan2 – Ben Apr 15 at 17:10
• Tried that too. same output is coming – Shataneek Banerjee Apr 15 at 17:11
• I never claimed this would fix your problem ;) – Ben Apr 15 at 17:23

Use this n = 1 : 1000; t = (n-1)/100;