MATLAB Answers

Issue with getting correct FFT phase plot

조회 수: 6(최근 30일)
S Ban
S Ban 2021년 4월 15일
답변: David Goodmanson 2021년 4월 15일
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 Fs
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
phase=rad2deg(atan2(imag(Y2),real(Y2))); %phase information
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.

채택된 답변

David Goodmanson
David Goodmanson 2021년 4월 15일
Hello SB,
the issue here is that the signal window is not the correct width to give the periodicity that you would like. Right now
t(1) = 0 t(end) = 10 y(1) = 3.1124 y(end) = 3.1124
The first point in y is the same value as the the last point. Periodicity means that time windows can be appended side-by-side to continue the waveform. That means that 3.1124, which is the last point in the first time window, and the first point in the next time window, will be repeated. You no longer have three continuous cosine waves, and instead there is a very small flat part. You can see the effect of that in the fft because the signal, which supposedly only contains three discrete frequencies, shows nonzero amplitude for a lot of other frequencies as well.
If you delete the last point with
t = linspace(0,T,N);
t(end) = [];
and proceed from there, everything works. There are three distinct sharp frequency peaks, no other frequency content, and the phases are correct.

추가 답변(0개)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by