No BSD License  

Highlights from
SineFit

image thumbnail
from SineFit by YangQuan Chen
Extract sine frequency/amplitude/phase of a noisy sinusoidal signal.

[Ahat,Theta,Omega,RMS]=sinefit(s0,Testim,t0,Ts)
% sine wave fitting from noisy sinusoidal signal 
% phase fitting has to be considered as well as frequency 
% Written by Dr Chen YangQuan <yqchen@ieee.org> 
% Last modified 05-11-2000
% s0: sampled series. 1xNp 
% Testim: estimated period (sec.) (may not be accurate) 
% Ts: sampling period (in Sec.) 
% t0: initial time (in Sec.) 
% Ahat: estimated amplitude 
% Theta: fitted theta_0 (in rad.) 
% Omega: 2pi*freq 
% RMS: root mean squares.
%
% See also: sinefit2
function [Ahat,Theta,Omega,RMS]=sinefit(s0,Testim,t0,Ts) 
% 
Omega=fmin('jomega',(2*pi/Testim)*.5,... 
(2*pi/Testim)*2.0, [0,1.0e-30 ], s0,t0,Ts) 
[Ahat,Theta,RMS]=sinefit2(s0,Omega,t0,Ts); 

disp(['f=',num2str(Omega/2/pi),... 
' | RMS=',num2str(RMS),' A ^ =', num2str(Ahat),... 
' | Theta ^ =',num2str(Theta*180/pi)]) 
Np=size(s0); 
t=t0+[0:Np(2)-1]*Ts; 
figure;
plot(t,s0,'k:',t, Ahat*sin(Omega*t+Theta),'-r'); 
legend(['measured (RMS=',num2str(RMS),')'],... 
['fitted: f=',num2str(Omega/2/pi),... 
' A.hat =',num2str(Ahat),... 
' |  theta.hat =',num2str(Theta*180/pi)]) 
return 

Contact us at files@mathworks.com