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