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