Skip to content

Commit e98ad96

Browse files
author
arch
committed
add flat point detection
1 parent 95a1c81 commit e98ad96

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

funscript_editor/algorithms/signal.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)