tor, 02 07 2009 kl. 22:48 +0200, skrev Autiwa:
> Ok, I think it's good now :)

Thanks. Since nobody has commented, I assume people think your stuff is
good :-)

I've (hopefully) made the documentation somewhat more clear, and changed
the coding-style a bit. Could you check that I haven't broken anything?
I'm attaching the code.

By the way, what is your full name? I think you should be given credit
for the code.

Thanks
Søren
## -*- texinfo -*-
## @deftypefn {Function File} {} fwhm (@var{f})
## @deftypefnx{Function File} {} fwhm (@var{x}, @var{f})
## Return the full width at half maximum if a given signal.
##
## The full width at half maximum is an expression of the extent of a signal,
## defined as the difference between the two extremal points of the signal where
## it equals half of its maximum value.
##
## The signal is given by the vector @var{f} with optional @math{x}-values
## @var{x}. If the latter is not given, it defaults to the indexes of @var{f}.
##
## If the full width at half maximum is not defined, an error is raised.
## @seealso{std}
## @end deftypefn

## This program is public domain.

function retval = fwhm (x, f)
  ## Check input
  if (nargin == 0)
    error ("fwhm: not enough input arguments");
  elseif (nargin == 1)
    f = x;
    x = 1:length (f);
  endif

  if (numel (x) != numel (f))
    error ("fwhm: number of elements does not match");
  endif

  ## Locate maximum
  fmax = max (f);
  f_renorm = f - 0.5 * fmax;

  ind = find (f_renorm(1:end-1) .* f_renorm (2:end) <= 0);

  ## If the product is negative, this means that the "half-maximum" is between
  ## theses two values
  if (length (ind) == 2)
    ## We make a linear regression between the two values to get a more precise
    ## estimation of the fwhm. 
    x1 = (0.5 * fmax - f (ind (1) + 1)) * (x (ind (1) + 1) - x (ind (1))) ...
       / (f (ind (1) + 1) - f (ind (1))) + x (ind (1) + 1);
    x2 = (0.5 * fmax - f (ind (end) + 1)) * (x (ind (end) + 1) - x (ind (end))) ...
       / (f (ind (end) + 1) - f (ind (end))) + x (ind (end) + 1);
    retval = x2 - x1;
  else
    error ("fwhm: full width at half maximum is not defined.");
  endif
endfunction
------------------------------------------------------------------------------
_______________________________________________
Octave-dev mailing list
Octave-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/octave-dev

Reply via email to