function [m, x, p] = interpcurves(c)
%
%  This function reads in a cell array C, which are point extracted from a 
%  Curve Tracer output using function GETCURVES.  GETCURVES creates a cell
%  array  from CSV files obtained from the TI B370 Curve tracer output.
%  Column 1 is the x-axis of the curve tracer (trimmed voltage sweep values),
%  column 2 is the corresponding current values, and for cases where there was
%  a stepping parameters (i.e. base current or gate-source voltage) column 3
%  would be the step sequence values.
%
%       [m, x, p] = interpcurves(c)
%
%  M is the TC curve matrix where all rows are the same lengght and sampled
%  as the same rate corresponding the x-axis X.  The rows are the curves
%  corresponding to each step value.  In the case of just a single
%  sweep, as in a diode, M will just have one row.
%  The output is P will exist if there were step values originally provided 
%  with the curve trace data.  Otherwise for a single sweep, no P vector
%  will be created.
%  
%   Written by Kevin D. Donohue 5/2005  donohue@engr.uky.edu
%



%  Check out the size of the cell array and set interpolation 
%   range to the smallest end point in all the cell array rows.
[r,g] = size(c);
for k=1:r
    lim1(k) = max(c{k,1});
end

% Take the shortest sweep as the lenght of x-axis
toplim = min(lim1);

%  Create x-axis with 100 points
pts = 100;   %  Change this value if you want output sampling density to change
x = toplim*[0:(pts-1)]/(pts-1);


%  If a 3 terminal device save the stepped values to output vector
if g == 3
p = cell2mat(c(:,3));
end


%  Loop to extract vectors from cell array and make them equally
%  spaced and sized to store as a matrix
for k=1:r
    da = cell2mat(c(k,1));  %  Convert cell to row matrix
    ya = cell2mat(c(k,2));
    gg = gradient(da);      %  Get gradient of row x-axis
    %  Ensure there are no place where the x-axis was not changing
    ksame = find(abs(gg) > eps);
    %  If a range of non-changing values were found, trim them
    if ~isempty(ksame)
        yt = ya(ksame);
        dt = da(ksame);
    else
        yt = ya;
        dt = da;
    end
    %  Double check for monotonicity.  X-axis must be strictly increase or decreasing. 
    %  If not monotonic drop deviant point
    gg = diff(dt);  %  Get consecutive differences
    y(1) = yt(1);   %  Initialze first point
    d(1) = dt(1);
    cnt=1;          %  Set up counter for final output array
    for kd=2:length(dt)-1
        if (dt(kd)-d(cnt))*gg(kd) > 0   %  If differences has same sign store the value
            cnt = cnt+1;
            d(cnt) = dt(kd);
            y(cnt) = yt(kd);
        else                     %  If not, skip the values and reset the sign.
            gg(kd) = -gg(kd);
        end
    end

    %  last point cannot be checked so skip it (ie. to end-1)
    %  Interpolate Curve trace values to regular sample grid
    m(k,:) = interp1(d(1:end-1),y(1:end-1),x,'linear', 'extrap');  
end    