Filter löschen
Filter löschen

Not getting the correct phase using fft, code posted

1 Ansicht (letzte 30 Tage)
Nina
Nina am 17 Jan. 2013
Hi everyone,
I am trying to extract the correct phase angle from a forced damped harmonic oscillator using matlab ode45() function to solve it and then using matlab fft to do fft analysis and try to extract the phase angle from the fft. Code:
tspan=[0,50];
init=[-2;0];
step=1;
% call the solver
[t1,y1]=ode45(@f1,tspan,init);
%Find FFT
m = length(y1) % Window length
Y1=fft(y1(:,1),m);
n = fix(m);
plot(t1(1:n,1),y1(1:n,1),t1(1:n,1),ifft(Y1),'*')
%Find the phase angle
FT_power2 = abs(Y1).^2;
FT_phase2= (((angle(Y1))) * 180/pi);
[c2,i2] = max(FT_power2);
phase = FT_phase2(i2)
Problem is I do not think I am getting the correct angle (or I am completely not understanding what I am suppose to get). The function in question being solved by ode45 is:
yprime = -c*y(2)-k*y(1)+4*sin(2*t); where c,k,y(1) and y(2) are known.
Shouldn't I get angle of 45 (since it would 0 + the pi/2 lag from the sin function)? I am getting:
178.7608 in degrees.
Please help me out if possible I am at complete loss.
PS:I am completely new to fft and such.

Akzeptierte Antwort

Matt J
Matt J am 18 Jan. 2013
Bearbeitet: Matt J am 18 Jan. 2013
You could get rid of the transient response by subtracting off the output of
yprime = -c*y(2)-k*y(1) %no sinusoid
This should leave you with just the sinusoidal part of the response only. You should then be able to get its phase by looking at the output sinusoid's values at t=0, pi/2,pi,3*pi/2, etc...
  4 Kommentare
Matt J
Matt J am 18 Jan. 2013
Bearbeitet: Matt J am 18 Jan. 2013
I think it's the wrong direction to try to do this with FFTs when the information is available in the non-Fourier domain. However, if you insist on this direction, there are a number of details to worry about
  • You're looking for a peak occuring at frequency 1/pi Hz, the frequency of your input sinusoid. You therefore need to be sure that spectrum is sampled at that frequency. Note that your frequency sampling interval is 1/m/(t1(2)-t1(1)), so you need to make sure this divides evenly into 1/pi, to a precision that is useful to you.
  • Your signal is causal, i.e., it starts at 0 and is windowed by a delayed rect function. This will add phase shift to your spectrum.
  • You need to use FFTSHIFT appropriately. The FFT expects the time origin to be at y1(1).
Nina
Nina am 22 Jan. 2013
Thank you, I will look into these changes.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by