Source code for neuroconv.tools.signal_processing

from typing import Optional

import numpy as np


[docs]def get_rising_frames_from_ttl(trace: np.ndarray, threshold: Optional[float] = None) -> np.ndarray: """ Return the frame indices for rising events in a TTL pulse. Parameters ---------- trace : numpy.ndarray A TTL signal. threshold : float, optional The threshold used to distinguish on/off states in the trace. The mean of the trace is used by default. Returns ------- rising_frames : numpy.ndarray The frame indices of rising events. """ flattened_trace = np.ravel(trace) # Shapes like (1, x, 1, 1) might result from slicing patterns and are allowed if np.max(trace.shape) != flattened_trace.shape[0]: # TODO: when 3.7 dropped, use math.prod to avoid overflow raise ValueError(f"This function expects a one-dimensional array! Received shape of {trace.shape}.") threshold = np.mean(trace) if threshold is None else threshold sign = np.sign(flattened_trace - threshold) diff = np.diff(sign) rising_frames = np.where(diff > 0)[0] + 1 return rising_frames
[docs]def get_falling_frames_from_ttl(trace: np.ndarray, threshold: Optional[float] = None) -> np.ndarray: """ Return the frame indices for falling events in a TTL pulse. Parameters ---------- trace : numpy.ndarray A TTL signal. threshold : float, optional The threshold used to distinguish on/off states in the trace. The mean of the trace is used by default. Returns ------- falling_frames : numpy.ndarray The frame indices of falling events. """ flattened_trace = np.ravel(trace) # Shapes like (1, x, 1, 1) might result from slicing patterns and are allowed if np.max(trace.shape) != flattened_trace.shape[0]: # TODO: when 3.7 dropped, use math.prod to avoid overflow raise ValueError(f"This function expects a one-dimensional array! Received shape of {trace.shape}.") threshold = np.mean(trace) if threshold is None else threshold sign = np.sign(flattened_trace - threshold) diff = np.diff(sign) falling_frames = np.where(diff < 0)[0] + 1 return falling_frames