Least squares sinusoid fit algorithm described in IEEE Standard for Digitizing Waveform Recorders (IEEE Std 1057): Algorithm for three-parameter and four-parameter least squares fit to sinewave data using matrix operations.
The algorithm is (in most cases) really quick. If the signal frequency is a guess, it has to be close to true frequency value.
For further information, consult IEEE Std 1057 and/or IEEE Std 1241 documentation.
Now also fits complex sinusoids i.e. phasors with noise and offset.
Using the three-parameter fit disables the iterative frequency search. To enable this, use searchflag = 0.
For instance, if you want function messages (verbose), graphics (plotflag) and no iterative search, use
verbose = 1;
plotflag = 1;
searchflag = 0;
This is actually a cosine fit, I think.
Here is an example with a regular sinusoid, which may be helpful:
t = 0:0.1:1000 ; % Time must be in seconds, not Matlab time
T = 10 ; % Period (s)
f = 1/T ; % Signal frequency (not sampling frequency!)
y = 2*sin(2*pi*t./T) ; % Sinusoid
[params, yest, yres, rmserr] = sinefit(y, t, f, 1, 1, 1) ;
The program worked fine for me it was exactly what I was looking for. I use it for the estimation of the SINAD and subsequent ENOB value. The method tends to shift more signal to the residual when the signal that is used gets longer.
A feature update: fitting extended to complex sinusoids.
Fixed a bug in input parameter handling (varargin behavior).
Improved iteration convergence: the accuracy for the initial frequency guess is more relaxed.
A feature update: added a possibility to fit non-iteratively.
A minor bugfix in the plotting operation: now ALL samples are included in modulo-time plots.