Source code for vitalDSP.respiratory_analysis.sleep_apnea_detection.amplitude_threshold

"""
Respiratory Analysis Module for Physiological Signal Processing

This module provides comprehensive capabilities for physiological
signal processing including ECG, PPG, EEG, and other vital signs.

Author: vitalDSP Team
Date: 2025-01-27
Version: 1.0.0

Key Features:
- Multiple processing methods and functions
- NumPy integration for numerical computations

Examples:
---------
Basic usage:
    >>> import numpy as np
    >>> from vitalDSP.sleep_apnea_detection.amplitude_threshold import AmplitudeThreshold
    >>> signal = np.random.randn(1000)
    >>> processor = AmplitudeThreshold(signal)
    >>> result = processor.process()
    >>> print(f'Processing result: {result}')
"""

import numpy as np
from vitalDSP.preprocess.preprocess_operations import preprocess_signal


[docs] def detect_apnea_amplitude( signal, sampling_rate, threshold, min_duration=10, preprocess=None, **preprocess_kwargs, ): """ Detect sleep apnea events based on amplitude thresholding. Parameters ---------- signal : numpy.ndarray The input respiratory signal. sampling_rate : float The sampling rate of the signal in Hz. threshold : float Amplitude threshold below which an apnea event is detected. min_duration : int, optional (default=10) Minimum duration (in seconds) for which the signal must be below the threshold to be considered an apnea event. preprocess : str, optional The preprocessing method to apply before detection (e.g., "bandpass", "wavelet"). preprocess_kwargs : dict, optional Additional arguments for the preprocessing function. Returns ------- apnea_events : list of tuple List of apnea events, each represented as a tuple (start_time, end_time) in seconds. Examples -------- >>> signal = np.sin(2 * np.pi * 0.2 * np.arange(0, 60, 0.01)) * 0.2 >>> apnea_events = detect_apnea_amplitude(signal, sampling_rate=100, threshold=0.1) >>> print(apnea_events) """ if preprocess: signal = preprocess_signal( signal, sampling_rate, filter_type=preprocess, **preprocess_kwargs ) # Identify segments where the signal amplitude is below the threshold below_threshold = np.abs(signal) < threshold apnea_events = [] current_start = None for i, below in enumerate(below_threshold): if below and current_start is None: current_start = i elif not below and current_start is not None: duration = (i - current_start) / sampling_rate if duration >= min_duration: apnea_events.append((current_start / sampling_rate, i / sampling_rate)) current_start = None # Check if the signal ends during an apnea event if current_start is not None: duration = (len(signal) - current_start) / sampling_rate if duration >= min_duration: apnea_events.append( (current_start / sampling_rate, len(signal) / sampling_rate) ) return apnea_events