@@ -354,6 +354,37 @@ def get_local_min_max_points(self, signal: list, filter_len: int = 3) -> list:
354354 return points
355355
356356
357+ def get_flat_start_points (self , signal : list , filter_len : int = 4 , delta : float = 0.005 ) -> list :
358+ """ Get flat starting points in given signal
359+
360+ Args:
361+ signal (list): list with float signal
362+ filter_len (int): length of the filter to detect flat signal positions
363+ delta (float): delta to detect an flat position in the signal
364+
365+ Returns:
366+ list: indexes of flat starting points
367+ """
368+ if filter_len < 2 :
369+ filter_len = 2
370+
371+ if len (signal ) < filter_len :
372+ return []
373+
374+ threshold = (max (signal ) - min (signal )) * delta
375+
376+ filtered_indexe = [i for i in range (len (signal )- filter_len ) \
377+ if all (abs (signal [i + j ] - signal [i + j + 1 ]) <= threshold for j in range (filter_len ))
378+ ]
379+
380+ flat_start_points = [item for item in filtered_indexe \
381+ if all ((item - j ) not in filtered_indexe for j in range (1 , 2 * filter_len ))
382+ ]
383+
384+ self .logger .info ("Found %d flat start points" , len (flat_start_points ))
385+ return flat_start_points
386+
387+
357388 def get_direction_changes (self , signal : list , filter_len : int = 3 ) -> list :
358389 """ Get direction changes positions in given signal
359390
@@ -362,7 +393,7 @@ def get_direction_changes(self, signal: list, filter_len: int = 3) -> list:
362393 filter_len (int): length of the filter to detect an direction change
363394
364395 Returns:
365- list: indexes of direction changes
396+ list: indexes of direction changes
366397 """
367398 if len (signal ) < filter_len :
368399 return []
@@ -385,6 +416,10 @@ def get_direction_changes(self, signal: list, filter_len: int = 3) -> list:
385416 current_direction = direction
386417
387418 self .logger .info ("Found %d direction changes" , len (changepoints ))
419+
420+ for idx in self .get_flat_start_points (signal , filter_len + 1 ):
421+ bisect .insort (changepoints , idx )
422+
388423 return changepoints
389424
390425
0 commit comments