% GAUSFIT GAUSFIT Gaussian Curve Fit
% 
% Usage
% 
% The gausfit routine has the following syntax
% 
%   [mu,sigma,dc,gain,yhat] = gausfit(t,y,w,mug,sigmag,dcg,gaing).
% 
% where the required inputs are
%   -  t - the values of the independant variable (e.g., time samples)
% 
%   -  y - the values of the dependant variable (e.g., f(t))
% 
% The following inputs are all optional, and default values are
% available for each of them.
%   -  w - the weights to use in the fitting (set to ones if omitted)
% 
%   -  mug - initial estimate of the mean
% 
%   -  sigmag - initial estimate of the sigma (standard deviation)
% 
%   -  dcg - initial estimate of the DC value
% 
%   -  gaing - initial estimate of the gain
% 
% The fit is of the form yhat=gain*exp((t-mu).^2/(2*sigma^2))+dc.
% The outputs are 
%   -  mu - the mean of the fit
% 
%   -  sigma - the sigma of the fit
% 
%   -  dc - the dc term of the fit
% 
%   -  gain - the gain of the gaussian fit
% 
%   -  yhat - the output samples (the Gaussian fits)
% 
% Because the fit is nonlinear, a good initial guess is critical to
% convergence of the solution.  Thus, you can supply initial guesses
% for each of the parameters using the mug, sigmag, dcg, 
% gaing arguments.  Any arguments not supplied are estimated using 
% a simple algorithm. In particular, the DC value is estimated by 
% taking the minimum value  from the vector y.  The gain is 
% estimated from the range of y.  The mean and standard deviation 
% are estimated using the first and second order moments of y.
% This function uses fitfun.

% Copyright (c) 2002-2006 Samit Basu

function [mu,sigma,dc,gain,yhat] = gausfit(t,y,w,mug,sigmag,dcg,gaing)
if (~isset('w')) 
  w = y*0+1; 
end
if (~isset('dcg')) 
  dcg = min(y(:)); 
end
ycor = y - dcg;
if (~isset('gaing')) 
  gaing = max(ycor); 
end
ycor = ycor/gaing;
if (~isset('mug')) 
  mug = sum(ycor.*t)/sum(ycor); 
end
if (~isset('sigmag')) 
  sigmag = sqrt(abs(sum((ycor).*(t-mug).^2)/sum(ycor))); 
end
[xopt,err] = fitfun('gfitfun',[mug,sigmag,dcg,gaing],y,w,eps,t);
mu = xopt(1);
sigma = xopt(2);
dc = xopt(3);
gain = xopt(4);
yhat = gfitfun(xopt,t);


