function [pos, mag] = peakfind(tsig, tx);
% This fuction will find the positions and magnitudes of the local
% maxima or peaks in vector SIG.
%
%    [pos, mag] = peakfind(sig, tx)
%
% vector TX is the time index for SIG, and peak locations are NOT
% interpolated so it will return the last sample point before a
% negative decent begins .
%  
% The output values POS are the positions of the local maximum in terms
% of the axis vector TX, and MAG are the values of the peaks.  POS and MAG
% will always include the endpoints of the array. 
%
%   Written by Kevin Donohue 2/2002  donohue@engr.uky.edu

%  Get size of input vector
[r,c] = size(tsig);
%  Compute gradient
dsig = gradient(tsig);
%  Start counter for local maxima
count = 1;
%  Initialize with first endpoint
mag(count) = tsig(1);
pos(count) = tx(1);

%  Loop to find places where gradient changes sign
%  and record them as local maxima
for k=2:length(dsig)
    %  If gradient change sign from positive to negative
    if(dsig(k) < 0 & dsig(k-1) >= 0)
        count = count +1;  %   Increment peak counter
        [dum, idum] = max(tsig((k-1):k)); % Find the larger of the values where this
                                          %  Gradient change occured
        mag(count) = dum(1);              % Assign to magnitude value
        pos(count) = tx(k+idum-2);        % Assigne to position value
    end
end

%  If the last end point was not identified as a peak,
%  include it anyway
if pos(count) ~= tx(length(tx))
    pos(count+1) = tx(length(tx));
    mag(count+1) = tsig(length(tx));
end
