diff options
Diffstat (limited to 'macros/pulsesep.sci')
-rw-r--r-- | macros/pulsesep.sci | 339 |
1 files changed, 174 insertions, 165 deletions
diff --git a/macros/pulsesep.sci b/macros/pulsesep.sci index f64494b..df85e80 100644 --- a/macros/pulsesep.sci +++ b/macros/pulsesep.sci @@ -1,6 +1,7 @@ function [s, initialcross, finalcross, nextcross, midreference]= pulsesep(x, varargin) - + // This function estimate pulse separation between bilevel waveform pulses. + // Calling Sequence // s=pulsesep(x) // s=pulsesep(x, Fs) @@ -9,7 +10,7 @@ function [s, initialcross, finalcross, nextcross, midreference]= pulsesep(x, var // s=pulsesep(x, t, 'MidPercentReferenceLevel', N ) // s=pulsesep(x, t, 'Tolerance', M) // s=pulsesep(x, t,'StateLevels', [O 1]) - + // [s initialcross finalcross nextcross midreference]=pulsesep(x) // [s initialcross finalcross nextcross midreference]=pulsesep(x, Fs) // [s initialcross finalcross nextcross midreference]=pulsesep(x, t) @@ -18,7 +19,7 @@ function [s, initialcross, finalcross, nextcross, midreference]= pulsesep(x, var // [s initialcross finalcross nextcross midreference]= pulsesep(x, t, 'Tolerance', M) // [s initialcross finalcross nextcross midreference]= pulsesep(x, t,'StateLevels', O) // [s initialcross finalcross nextcross midreference]= pulsesep(x, t,'StateLevels', O, 'fig', on or off) - // + // // Parameters // x: real vector. // Fs: specifies the sample rate, Fs, as a positive scalar, where the first sample instant corresponds to a time of zero. @@ -26,29 +27,37 @@ function [s, initialcross, finalcross, nextcross, midreference]= pulsesep(x, var // Polarity: specify the polarity of the pulse as either 'positive' or 'negative', where the default value is 'positive' // MidPercentReferenceLevel: specify the mid percent reference leves as a percentage, default value of N is 50. // Tolerance: define the tolerance value as real scaler value, where default value of M is 2.0. - // StateLevels: define the lower and upper state levels as two element real vector. + // StateLevels: define the lower and upper state levels as two element real vector. // fig: specify the logical input value to display figure as one of 'on' or 'off', where the default input in 'off'. // s: returns a vector of differences between the mid-crossings of each final negative-going transition of every positive-polarity pulse and the next positive-going transition. // initialcross: returns a vector of initial cross values of bilevel waveform transitions X // finalcross: returns a vector of final cross values of bilevel waveform transitions X // nextcross: returns a vector of next cross values of bilevel waveform transitions X // midreference: return mid reference value corrosponding to mid percenr reference value. - + // Examples - // x=[1.2, 5, 10, -20, 12] - //t=1:length(x) - //s=pulsesep(x, t) + //x = fscanfMat("macros/pulsedata_x.txt"); + //t = fscanfMat("macros/pulsedata_t.txt"); + //clf + //p = pulsesep(x,t,'fig','ON') + + //Output + // p = + // + // 0.3501425 + //also it generates a plot of pulse with pulse separation + // See also // Authors // Jitendra Singh - - - // run statelevels and midcross function before running risetime function. + + + // run statelevels and midcross function before running risetime function. if or(type(x)==10) then error ('Input arguments must be double.') -end - +end + if length(varargin)==0 then varargin=varargin; end @@ -56,13 +65,13 @@ end sindex=[]; if length(varargin)>=1 then a=1; -for i=1:length(varargin) +for i=1:length(varargin) if type(varargin(i))==10 then sindex(a)=i; a=a+1; - end + end +end end -end pol='POSITIVE'; @@ -72,203 +81,203 @@ index_on=[]; if (~isempty(sindex)) then for j=1:length(sindex) select convstr(varargin(sindex(j)), 'u') // validating input variable names - case {'STATELEVELS'} + case {'STATELEVELS'} if length(varargin) <=sindex(j) then error(strcat(['parameter StateLevels required a value'])); end - + if type(varargin(sindex(j)+1))==1 then - levels=varargin(sindex(j)+1); - + levels=varargin(sindex(j)+1); + elseif type(varargin(sindex(j)+1))==10 & convstr(varargin(sindex(j)+1), 'u')=='MIDPERCENTREFERENCELEVEL' | convstr(varargin(sindex(j)+1),'u')== 'TOLERANCE' | convstr(varargin(sindex(j)+1), 'u')=='FIG' | convstr(varargin(sindex(j)+1), 'u')=='POLARITY' then - - error('parameter StateLevels required a value.') - - + + error('parameter StateLevels required a value.') + + elseif type(varargin(sindex(j)+1))==10 then - + error('Expected STATELEVELS to be one of these types: double, Instead its type was char.') end - - case {'MIDPERCENTREFERENCELEVEL'} + + case {'MIDPERCENTREFERENCELEVEL'} if length(varargin) <=sindex(j) then - error(strcat(['parameter MidPercentRefernceLevel required a value.'])); + error(strcat(['parameter MidPercentRefernceLevel required a value.'])); end - + if type(varargin(sindex(j)+1))==1 then - midpercentval= varargin(sindex(j)+1); - elseif type(varargin(sindex(j)+1))==10 & convstr(varargin(sindex(j)+1), 'u')=='STATELEVELS' | convstr(varargin(sindex(j)+1),'u')== 'TOLERANCE' | convstr(varargin(sindex(j)+1), 'u')=='FIG' | convstr(varargin(sindex(j)+1), 'u')=='POLARITY' then - error('parameter MidPercentRefernceLevel required a value.') - - elseif type(varargin(sindex(j)+1))==10 then - error('Expected MidPercentRefernceLevel to be one of these types: double, Instead its type was char.') + midpercentval= varargin(sindex(j)+1); + elseif type(varargin(sindex(j)+1))==10 & convstr(varargin(sindex(j)+1), 'u')=='STATELEVELS' | convstr(varargin(sindex(j)+1),'u')== 'TOLERANCE' | convstr(varargin(sindex(j)+1), 'u')=='FIG' | convstr(varargin(sindex(j)+1), 'u')=='POLARITY' then + error('parameter MidPercentRefernceLevel required a value.') + + elseif type(varargin(sindex(j)+1))==10 then + error('Expected MidPercentRefernceLevel to be one of these types: double, Instead its type was char.') end - case {'TOLERANCE'} - + case {'TOLERANCE'} + if length(varargin) <=sindex(j) then error(strcat(['parameter Tolerance required a value"])); - + elseif type(varargin(sindex(j)+1))==1 then - tolerance= varargin(sindex(j)+1); - + tolerance= varargin(sindex(j)+1); + elseif type(varargin(sindex(j)+1))==10 & convstr(varargin(sindex(j)+1), 'u')== 'STATELEVELS' | convstr(varargin(sindex(j)+1), 'u')== 'MIDPERCENTREFERENCELEVEL' | convstr(varargin(sindex(j)+1), 'u')=='FIG' | convstr(varargin(sindex(j)+1), 'u')=='POLARITY' then - + error('parameter Tolerance required a value.'); - + elseif type(varargin(sindex(j)+1))==10 then - + error('Expected Tolerance to be one of these types: double, Instead its type was char.'); - end - - - + end + + + case {'FIG'} - + if length(varargin) <=sindex(j) then error(strcat(['parameter fig required a value.'])); end - + if type(varargin(sindex(j)+1))==1 then error ('Expected fig to match one of these strings: on or off'); - - elseif type(varargin(sindex(j)+1))==10 & convstr(varargin(sindex(j)+1), 'u')=='STATELEVELS' | convstr(varargin(sindex(j)+1), 'u')== 'TOLERANCE' | convstr(varargin(sindex(j)+1), 'u')=='MIDPERCENTREFERENCELEVEL' | convstr(varargin(sindex(j)+1), 'u')=='POLARITY' then - error('parameter fig required a value.') - else + + elseif type(varargin(sindex(j)+1))==10 & convstr(varargin(sindex(j)+1), 'u')=='STATELEVELS' | convstr(varargin(sindex(j)+1), 'u')== 'TOLERANCE' | convstr(varargin(sindex(j)+1), 'u')=='MIDPERCENTREFERENCELEVEL' | convstr(varargin(sindex(j)+1), 'u')=='POLARITY' then + error('parameter fig required a value.') + else fig= convstr(varargin(sindex(j)+1), 'u'); - - end - - - if fig == 'OFF' | fig == 'ON' then - else + + end + + + if fig == 'OFF' | fig == 'ON' then + else error('Expected fig to match one of these strings: on or off'); - end - - - - case{'ON'} + end + + + + case{'ON'} index_on=sindex(j) if length(varargin) == 1 then - error ('Unexpected input.') - - + error ('Unexpected input.') + + elseif type(varargin(sindex(j)-1))==1 then - error ('Unexpected input.'); + error ('Unexpected input.'); elseif convstr(varargin(sindex(j)-1), 'u')~='FIG' then error('Unexpected input'); end - + case{'OFF'} - + if length(varargin) == 1 then - error ('Unexpected input.') - - + error ('Unexpected input.') + + elseif type(varargin(sindex(j)-1))==1 then - error ('Unexpected input.'); + error ('Unexpected input.'); elseif convstr(varargin(sindex(j)-1), 'u')~='FIG' then error('Unexpected input'); - end - - - - + end + + + + case{'POLARITY'} if length(varargin)<=sindex(j) then error ('Parameter polarity requires a value.') end - + if type( varargin(sindex(j)+1))==1 then error ('POLARITY must be either ''Positive'' or ''Negative''.') - + elseif type(varargin(sindex(j)+1))==10 & convstr(varargin(sindex(j)+1), 'u')== 'STATELEVELS' | convstr(varargin(sindex(j)+1), 'u')== 'MIDPERCENTREFERENCELEVEL' | convstr(varargin(sindex(j)+1), 'u')== 'TOLERANCE' | convstr(varargin(sindex(j)+1), 'u')=='FIG' then - + error ('Parameter polarity requires a value.') - - + + elseif convstr(varargin(sindex(j)+1), 'u') ~= 'POSITIVE' & convstr(varargin(sindex(j)+1), 'u')~= 'NEGATIVE' then - + error ('POLARITY must be either ''Positive'' or ''Negative''.'); - - else - polidx=sindex(j); - end - - + + else + polidx=sindex(j); + end + + case {'POSITIVE'} - + if j==1 then error(strcat(['Unexpected option:', " ", varargin(sindex(j))])); elseif convstr(varargin(sindex(j)-1), 'u') ~= 'POLARITY' error(strcat(['Unexpected option:', " ", varargin(sindex(j))])); else polinputidx= sindex(j); - - pol= convstr(varargin (sindex(j)), 'u') ; + + pol= convstr(varargin (sindex(j)), 'u') ; end - + case {'NEGATIVE'} - + if j==1 then error(strcat(['Unexpected option:', " ", varargin(sindex(j))])); elseif convstr(varargin(sindex(j)-1), 'u') ~= 'POLARITY' error(strcat(['Unexpected option:', " ", varargin(sindex(j))])); else polinputidx= sindex(j); - - pol= convstr(varargin (sindex(j)), 'u') ; - end - - else + + pol= convstr(varargin (sindex(j)), 'u') ; + end + + else error(strcat(['Invalid optional argument'," ", varargin(sindex(j))])); end // switch end // for end // if -// +// if length(index_on)>0 then - varargin(index_on)='OFF'; + varargin(index_on)='OFF'; end if length(polidx)>0 then - varargin(polidx)=null(); + varargin(polidx)=null(); varargin(polinputidx-1)=null(); end - [crossval midref levels t tolerance]= midcross(x, varargin(:)); - + [crossval midref levels t tolerance]= midcross(x, varargin(:)); + upperbound= levels(2)- (tolerance/100)*(levels(2)-levels(1)); mostupperbound=levels(2)+ (tolerance/100)*(levels(2)-levels(1)); lowerbound= levels(1)+ (tolerance/100)*(levels(2)-levels(1)); - mostlowerbound=levels(1)- (tolerance/100)*(levels(2)-levels(1)); + mostlowerbound=levels(1)- (tolerance/100)*(levels(2)-levels(1)); int_pos=[]; final_pos=[]; int_neg=[]; - final_neg=[]; + final_neg=[]; nextcross_pos=[]; nextcross_neg=[]; if length(crossval)>=2 then if x(1)>midref then - + int_pos=crossval(2:2:$); final_pos=crossval(3:2:$); int_neg=crossval(1:2:$); final_neg=crossval(2:2:$); else - + int_pos=crossval(1:2:$); final_pos=crossval(2:2:$); int_neg=crossval(2:2:$); final_neg-crossval(3:2:$); - + end @@ -278,8 +287,8 @@ if length(int_pos)>=2 then end if length(int_neg)>=2 then - nextcross_neg=int_neg(2:$); - end + nextcross_neg=int_neg(2:$); + end @@ -301,112 +310,112 @@ elseif length(int_neg)>length(final_neg) then end if length(final_pos)>length(nextcross_pos) final_pos=final_pos(1:($-1)) - + end - + if length(int_neg)>length(nextcross_neg) then int_neg=int_neg(1:($-1)); end - + if length(final_neg)>length(nextcross_neg) then final_neg=final_neg(1:($-1)); end - + end - - + + s=[]; - - + + if pol=='POSITIVE' then s=nextcross_pos-final_pos; initialcross=int_pos; finalcross=final_pos; nextcross=nextcross_pos; - + else - + s=nextcross_neg-final_neg; initialcross=int_neg; finalcross=final_neg; nextcross=nextcross_neg; - + end - + midreference=midref; if fig=='ON' then // if the defined output is only 1, the it will provide the graphical representation of //levels - + if length(s)==0 then - + plot(t,x, 'LineWidth',1, 'color', 'black') // xtitle('', 'Time (second)','Level (Volts)' ); plot(t,midreference * ones(1, length(t)),'-r', 'LineWidth',0.5) - + plot(t,mostupperbound * ones(1, length(t)),'--r', 'LineWidth',0.5) - - plot(t,levels(2) * ones(1, length(t)),'--k', 'LineWidth',0.5) - + + plot(t,levels(2) * ones(1, length(t)),'--k', 'LineWidth',0.5) + plot(t,upperbound * ones(1, length(t)),'--r', 'LineWidth',0.5) - + plot(t,lowerbound *ones(1, length(t)),'--g', 'LineWidth',0.5) - + plot(t,levels(1) * ones(1, length(t)),'--k', 'LineWidth',0.5) - - plot(t,mostlowerbound * ones(1, length(t)),'--g', 'LineWidth',0.5) - + + plot(t,mostlowerbound * ones(1, length(t)),'--g', 'LineWidth',0.5) + xlabel("Time (second)", "fontsize",3, "color", "black" ) - ylabel("Level (Volts)", "fontsize",3, "color", "black" ) - + ylabel("Level (Volts)", "fontsize",3, "color", "black" ) + + + legends(["Signal"; "upper boundary"; "upper state"; "lower boundary"; "mid reference"; "upper boundary"; "lower state"; "lower boundary"], [[1;1], [5;2], [1;2], [5;2], [5;1], [3;2], [1;2], [3;2]], opt='?') + - legends(["Signal"; "upper boundary"; "upper state"; "lower boundary"; "mid reference"; "upper boundary"; "lower state"; "lower boundary"], [[1;1], [5;2], [1;2], [5;2], [5;1], [3;2], [1;2], [3;2]], opt='?') - + else - else - plot(t,x, 'LineWidth',1, 'color', 'black') - + plot(t,midreference * ones(1, length(t)),'-g', 'LineWidth',0.5) - - + + //n=length(finalcross); - - + + rects=[finalcross; levels(2)*ones(s); s; (levels(2)-levels(1))*ones(s)] - + col=-10*ones(s); midc=[nextcross, finalcross, initialcross]; midcross=gsort(midc, 'c','i' ) - + plot(midcross, midreference*ones(midcross), "r*", 'MarkerSize',15); plot(t,mostupperbound * ones(1, length(t)),'--r', 'LineWidth',0.5) - - plot(t,levels(2) * ones(1, length(t)),'--k', 'LineWidth',0.5) - + + plot(t,levels(2) * ones(1, length(t)),'--k', 'LineWidth',0.5) + plot(t,upperbound * ones(1, length(t)),'--r', 'LineWidth',0.5) - + plot(t,midreference * ones(1, length(t)),'-r', 'LineWidth',0.5) - + plot(t,lowerbound *ones(1, length(t)),'--g', 'LineWidth',0.5) - + plot(t,levels(1) * ones(1, length(t)),'--k', 'LineWidth',0.5) - - plot(t,mostlowerbound * ones(1, length(t)),'--g', 'LineWidth',0.5) - + + plot(t,mostlowerbound * ones(1, length(t)),'--g', 'LineWidth',0.5) + xrects(rects, col); - + xlabel("Time (second)", "fontsize",3, "color", "black" ) - ylabel("Level (Volts)", "fontsize",3, "color", "black" ) - + ylabel("Level (Volts)", "fontsize",3, "color", "black" ) + - legends(["pulse seperation"; "Signal"; "mid cross"; "upper boundary"; "upper state"; "lower boundary"; "mid reference"; "upper boundary"; "lower state"; "lower boundary"], [[-11; 2] , [1;1], [-10;5], [5;2], [1;2], [5;2], [5;1], [3;2],[1;2], [3;2]], opt='?') + legends(["pulse seperation"; "Signal"; "mid cross"; "upper boundary"; "upper state"; "lower boundary"; "mid reference"; "upper boundary"; "lower state"; "lower boundary"], [[-11; 2] , [1;1], [-10;5], [5;2], [1;2], [5;2], [5;1], [3;2],[1;2], [3;2]], 1) - end - end -// + end + end +// // endfunction |