www.gusucode.com > signal 工具箱matlab源码程序 > signal/private/pulsecycles.m
function [midRef,initCross,finalCross,nextCross] ... = pulsecycles(x, plotFlag, pulseTag, varargin) %PULSECYCLES extract initial, final, and next pulse transitions % % This function is for internal use only. It may be removed in the future. % Copyright 2011-2012 The MathWorks, Inc. try % check if needs transposition needsTranspose = isrow(x); % extract leading numeric arguments [x, t, n] = chktransargs(0, x, varargin{:}); % extract trailing optional arguments [tol, mprl, stateLevs, pol] = chktransopts(x, {'midpct','polarity'}, ... varargin{n:end}); catch ex throwAsCaller(ex); end % extract (absolute) reference levels from percent reference levels [lwrBnd, uprBnd, midRef] = pctreflev(stateLevs,tol,100-tol, mprl); % extract the mid-crossings and polarities with the specified state % boundaries and reference levels [midCross, polarity] = signal.internal.getMidCross(x, t, uprBnd, lwrBnd, midRef); % find the first transition that matches the specified input polarity, pol. iStart = find(polarity==pol, 1, 'first'); idx = iStart:numel(polarity); if nargout>3 % extract cycles (pulses inclusive of next transition) initCross = midCross(idx(1:2:end-2)); finalCross = midCross(idx(2:2:end-1)); nextCross = midCross(idx(3:2:end)); allCross = [midCross(idx(1:2:end)); finalCross]; else % extract pulses (exclusive of next transition) initCross = midCross(idx(1:2:end-1)); finalCross = midCross(idx(2:2:end)); allCross = [initCross; finalCross]; end if plotFlag % plot all pulses of interest if strcmp(pulseTag,'PulseWidth') xdata = [initCross initCross finalCross finalCross]'; elseif strcmp(pulseTag,'PulseSeparation') xdata = [finalCross finalCross nextCross nextCross]'; elseif strcmp(pulseTag,'PulsePeriod') xdata = [initCross(1:2:end) initCross(1:2:end) nextCross(1:2:end) nextCross(1:2:end)]'; else xdata = []; end ydata = repmat(stateLevs([1 2 2 1])',1,size(xdata,2)); if ~isempty(xdata) [~, l] = signal.internal.plotInitialize(['signal:internal:plotInitialize:PlotName' pulseTag], x, t, ... xdata, ydata, ['signal:internal:plotInitialize:PlotPatch' pulseTag]); else [~, l] = signal.internal.plotInitialize(['signal:internal:plotInitialize:PlotName' pulseTag], x, t); end l = signal.internal.plotItem(l,'signal:internal:plotItem:LegendMidCross', ... allCross, midRef * ones(size(allCross)),'kx ', ... 'MarkerSize',10,'LineWidth',0.8); signal.internal.plotFinalize(l, [t(1) t(end)], stateLevs, tol, [NaN mprl NaN]); end if needsTranspose midRef = midRef'; initCross = initCross'; finalCross = finalCross'; if nargout > 3 nextCross = nextCross'; end end