From b3e33d06654cb4a83d936ddef14bab6b0c78c77a Mon Sep 17 00:00:00 2001 From: Ferdinand Fischer <ferdinand.fischer@fau.de> Date: Tue, 2 Jun 2020 21:36:16 +0200 Subject: [PATCH] added new stepRatio feature to signals.RandomStairs --- +signals/RandomStairs.m | 63 ++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/+signals/RandomStairs.m b/+signals/RandomStairs.m index 77679ca..9dab4c4 100644 --- a/+signals/RandomStairs.m +++ b/+signals/RandomStairs.m @@ -25,7 +25,8 @@ classdef RandomStairs properties % Number of the stairs - steps = 0; + steps = []; + stepsRatio = []; % Number of signals to be generated dim = 1; @@ -47,6 +48,8 @@ classdef RandomStairs G; % IIR-Filter for smoothing of the jumps f0; % Initial-values for the filtered values. name string; % A name for the signal + + normalize logical = false; end methods @@ -59,7 +62,8 @@ classdef RandomStairs % constructor. myParser = misc.Parser(); - myParser.addParameter('steps', randi(42 ,1)); + myParser.addParameter('steps', []); + myParser.addParameter('stepsRatio', []); myParser.addParameter('seedt', []); myParser.addParameter('seedf', []); myParser.addParameter('fmin', -1); @@ -68,7 +72,14 @@ classdef RandomStairs myParser.addParameter('f0', []); myParser.addParameter('dim', 1); myParser.addParameter('name', ""); - myParser.parse2obj(obj, varargin{:}); + myParser.addParameter('normalize', false); + myParser.parse2obj(obj, varargin{:}); + myParser.unmatchedWarning(); + + if myParser.isDefault('stepsRatio') && myParser.isDefault('steps') + obj.stepsRatio = 2; + end + end function q = quantity.Discrete(obj, timeDomain, optArg) @@ -105,22 +116,36 @@ classdef RandomStairs rng(obj.seedf); else rng('shuffle') - end - - fk = rand(obj.steps, obj.dim) * diag(obj.fmax - obj.fmin) ... - + repmat(obj.fmin', obj.steps, 1); + end + + mySteps = obj.getMySteps(t); + + fk = rand(mySteps, obj.dim) * diag(obj.fmax - obj.fmin) ... + + repmat(obj.fmin', mySteps, 1); - fk = [fk; fk(end,:)]; + fk = [fk; fk(end,:)]; + + % if required normalize fk to min max values: + if obj.normalize + + % get all non zero entries + i = ( fk ~= 0 ); + + fk(i) = fk(i) ./ fk(i) .* sign(fk(i)); + end f = interp1(tk, fk, t(:), 'previous', 'extrap'); - end - + end + function tk = jumpingPoints(obj, t) %JUMPINGPOINTS computes the points at which a jump occurs, %depent if they should be equally or randomly distributed. + + mySteps = obj.getMySteps(t); + if ~isempty(obj.seedt) && obj.seedt < 0 % create equally distributed intervals - tk = linspace(t(1), t(end), obj.steps + 1).'; + tk = linspace(t(1), t(end), mySteps + 1).'; else if isempty(obj.seedt) @@ -130,7 +155,7 @@ classdef RandomStairs rng(obj.seedt); end - tk = rand(obj.steps,1); + tk = rand(mySteps,1); tk = [0; cumsum(tk)]; tk = tk * (t(end) - t(1)) / tk(end) + t(1); end @@ -181,8 +206,18 @@ classdef RandomStairs plot(t, obj.smoothSignal(t, f)); end - end - + end + + methods ( Access = protected ) + function mySteps = getMySteps(obj, t) + if isempty( obj.steps ) + mySteps = ceil( (t(end) - t(1)) * obj.stepsRatio ); + else + mySteps = obj.steps; + end + end + end + methods (Static) function example() %EXAMPLE for the usage of RandomStairs -- GitLab