14 KiB
Respiratory Signal Processing
Overview
Respiratory signal processing in NeuroKit2 enables analysis of breathing patterns, respiratory rate, amplitude, and variability. Respiration is closely linked to cardiac activity (respiratory sinus arrhythmia), emotional state, and cognitive processes.
Main Processing Pipeline
rsp_process()
Automated processing of respiratory signals with peak/trough detection and feature extraction.
signals, info = nk.rsp_process(rsp_signal, sampling_rate=100, method='khodadad2018')
Pipeline steps:
- Signal cleaning (noise removal, filtering)
- Peak (exhalation) and trough (inhalation) detection
- Respiratory rate calculation
- Amplitude computation
- Phase determination (inspiration/expiration)
- Respiratory volume per time (RVT)
Returns:
signals: DataFrame with:RSP_Clean: Filtered respiratory signalRSP_Peaks,RSP_Troughs: Extrema markersRSP_Rate: Instantaneous breathing rate (breaths/min)RSP_Amplitude: Breath-to-breath amplitudeRSP_Phase: Inspiration (0) vs. expiration (1)RSP_Phase_Completion: Phase completion percentage (0-1)RSP_RVT: Respiratory volume per time
info: Dictionary with peak/trough indices
Methods:
'khodadad2018': Khodadad et al. algorithm (default, robust)'biosppy': BioSPPy-based processing (alternative)
Preprocessing Functions
rsp_clean()
Remove noise and smooth respiratory signal.
cleaned_rsp = nk.rsp_clean(rsp_signal, sampling_rate=100, method='khodadad2018')
Methods:
1. Khodadad2018 (default):
- Butterworth low-pass filter
- Removes high-frequency noise
- Preserves breathing waveform
2. BioSPPy:
- Alternative filtering approach
- Similar performance to Khodadad
3. Hampel filter:
cleaned_rsp = nk.rsp_clean(rsp_signal, sampling_rate=100, method='hampel')
- Median-based outlier removal
- Robust to artifacts and spikes
- Preserves sharp transitions
Typical respiratory frequency:
- Adults at rest: 12-20 breaths/min (0.2-0.33 Hz)
- Children: faster rates
- During exercise: up to 40-60 breaths/min
rsp_peaks()
Identify inhalation troughs and exhalation peaks in respiratory signal.
peaks, info = nk.rsp_peaks(cleaned_rsp, sampling_rate=100, method='khodadad2018')
Detection methods:
'khodadad2018': Optimized for clean signals'biosppy': Alternative approach'scipy': Simple scipy-based detection
Returns:
- Dictionary with:
RSP_Peaks: Indices of exhalation peaks (maximum points)RSP_Troughs: Indices of inhalation troughs (minimum points)
Respiratory cycle definition:
- Inhalation: Trough → Peak (air flows in, chest/abdomen expands)
- Exhalation: Peak → Trough (air flows out, chest/abdomen contracts)
rsp_findpeaks()
Low-level peak detection with multiple algorithm options.
peaks_dict = nk.rsp_findpeaks(cleaned_rsp, sampling_rate=100, method='scipy')
Methods:
'scipy': Scipy's find_peaks- Custom threshold-based algorithms
Use case:
- Fine-tuned peak detection
- Custom parameter adjustment
- Algorithm comparison
rsp_fixpeaks()
Correct detected peak/trough anomalies (e.g., missed or false detections).
corrected_peaks = nk.rsp_fixpeaks(peaks, sampling_rate=100)
Corrections:
- Remove physiologically implausible intervals
- Interpolate missing peaks
- Remove artifact-related false peaks
Feature Extraction Functions
rsp_rate()
Compute instantaneous breathing rate (breaths per minute).
rate = nk.rsp_rate(peaks, sampling_rate=100, desired_length=None)
Method:
- Calculate inter-breath intervals from peak/trough timing
- Convert to breaths per minute (BPM)
- Interpolate to match signal length
Typical values:
- Resting adult: 12-20 BPM
- Slow breathing: <10 BPM (meditation, relaxation)
- Fast breathing: >25 BPM (exercise, anxiety)
rsp_amplitude()
Compute breath-to-breath amplitude (peak-to-trough difference).
amplitude = nk.rsp_amplitude(cleaned_rsp, peaks)
Interpretation:
- Larger amplitude: deeper breaths (tidal volume increase)
- Smaller amplitude: shallow breaths
- Variable amplitude: irregular breathing pattern
Clinical relevance:
- Reduced amplitude: restrictive lung disease, chest wall rigidity
- Increased amplitude: compensatory hyperventilation
rsp_phase()
Determine inspiration/expiration phases and completion percentage.
phase, completion = nk.rsp_phase(cleaned_rsp, peaks, sampling_rate=100)
Returns:
RSP_Phase: Binary (0 = inspiration, 1 = expiration)RSP_Phase_Completion: Continuous 0-1 indicating phase progress
Use cases:
- Respiratory-gated stimulus presentation
- Phase-locked averaging
- Respiratory-cardiac coupling analysis
rsp_symmetry()
Analyze breath symmetry patterns (peak-trough balance, rise-decay timing).
symmetry = nk.rsp_symmetry(cleaned_rsp, peaks)
Metrics:
- Peak-trough symmetry: Are peaks and troughs equally spaced?
- Rise-decay symmetry: Is inhalation time equal to exhalation time?
Interpretation:
- Symmetric: normal, relaxed breathing
- Asymmetric: effortful breathing, airway obstruction
Advanced Analysis Functions
rsp_rrv()
Respiratory Rate Variability - analogous to heart rate variability.
rrv_indices = nk.rsp_rrv(peaks, sampling_rate=100)
Time-domain metrics:
RRV_SDBB: Standard deviation of breath-to-breath intervalsRRV_RMSSD: Root mean square of successive differencesRRV_MeanBB: Mean breath-to-breath interval
Frequency-domain metrics:
- Power in frequency bands (if applicable)
Interpretation:
- Higher RRV: flexible, adaptive breathing control
- Lower RRV: rigid, constrained breathing
- Altered RRV: anxiety, respiratory disorders, autonomic dysfunction
Recording duration:
- Minimum: 2-3 minutes
- Optimal: 5-10 minutes for stable estimates
rsp_rvt()
Respiratory Volume per Time - fMRI confound regressor.
rvt = nk.rsp_rvt(cleaned_rsp, peaks, sampling_rate=100)
Calculation:
- Derivative of respiratory signal
- Captures rate of volume change
- Correlates with BOLD signal fluctuations
Use cases:
- fMRI artifact correction
- Neuroimaging preprocessing
- Respiratory confound regression
Reference:
- Birn, R. M., et al. (2008). Separating respiratory-variation-related fluctuations from neuronal-activity-related fluctuations in fMRI. NeuroImage, 31(4), 1536-1548.
rsp_rav()
Respiratory Amplitude Variability indices.
rav = nk.rsp_rav(amplitude, sampling_rate=100)
Metrics:
- Standard deviation of amplitudes
- Coefficient of variation
- Range of amplitudes
Interpretation:
- High RAV: irregular depth (sighing, arousal changes)
- Low RAV: stable, controlled breathing
Analysis Functions
rsp_analyze()
Automatically select event-related or interval-related analysis.
analysis = nk.rsp_analyze(signals, sampling_rate=100)
Mode selection:
- Duration < 10 seconds → event-related
- Duration ≥ 10 seconds → interval-related
rsp_eventrelated()
Analyze respiratory responses to specific events/stimuli.
results = nk.rsp_eventrelated(epochs)
Computed metrics (per epoch):
RSP_Rate_Mean: Average breathing rate during epochRSP_Rate_Min/Max: Minimum/maximum rateRSP_Amplitude_Mean: Average breath depthRSP_Phase: Respiratory phase at event onset- Dynamics of rate and amplitude across epoch
Use cases:
- Respiratory changes during emotional stimuli
- Anticipatory breathing before task events
- Breath-holding or hyperventilation paradigms
rsp_intervalrelated()
Analyze extended respiratory recordings.
results = nk.rsp_intervalrelated(signals, sampling_rate=100)
Computed metrics:
RSP_Rate_Mean: Average breathing rateRSP_Rate_SD: Variability in rateRSP_Amplitude_Mean: Average breath depth- RRV indices (if sufficient data)
- RAV indices
Recording duration:
- Minimum: 60 seconds
- Optimal: 5-10 minutes
Use cases:
- Resting state breathing patterns
- Baseline respiratory assessment
- Stress or relaxation monitoring
Simulation and Visualization
rsp_simulate()
Generate synthetic respiratory signals for testing.
synthetic_rsp = nk.rsp_simulate(duration=60, sampling_rate=100, respiratory_rate=15,
method='sinusoidal', noise=0.1, random_state=42)
Methods:
'sinusoidal': Simple sinusoidal oscillation (fast)'breathmetrics': Advanced realistic breathing model (slower, more accurate)
Parameters:
respiratory_rate: Breaths per minute (default: 15)noise: Gaussian noise levelrandom_state: Seed for reproducibility
Use cases:
- Algorithm validation
- Parameter tuning
- Educational demonstrations
rsp_plot()
Visualize processed respiratory signal.
nk.rsp_plot(signals, info, static=True)
Displays:
- Raw and cleaned respiratory signal
- Detected peaks and troughs
- Instantaneous breathing rate
- Phase markers
Interactive mode: Set static=False for Plotly visualization
Practical Considerations
Sampling Rate Recommendations
- Minimum: 10 Hz (adequate for rate estimation)
- Standard: 50-100 Hz (research-grade)
- High-resolution: 1000 Hz (typically unnecessary, oversampled)
Recording Duration
- Rate estimation: ≥10 seconds (few breaths)
- RRV analysis: ≥2-3 minutes
- Resting state: 5-10 minutes
- Circadian patterns: Hours to days
Signal Acquisition Methods
Strain gauge/piezoelectric belt:
- Chest or abdominal expansion
- Most common
- Comfortable, non-invasive
Thermistor/thermocouple:
- Nasal/oral airflow temperature
- Direct airflow measurement
- Can be intrusive
Capnography:
- End-tidal CO₂ measurement
- Gold standard for physiology
- Expensive, clinical settings
Impedance pneumography:
- Derived from ECG electrodes
- Convenient for multi-modal recording
- Less accurate than dedicated sensors
Common Issues and Solutions
Irregular breathing:
- Normal in awake, resting humans
- Sighs, yawns, speech, swallowing cause variability
- Exclude artifacts or model as events
Shallow breathing:
- Low signal amplitude
- Check sensor placement and tightness
- Increase gain if available
Movement artifacts:
- Spikes or discontinuities
- Minimize participant movement
- Use robust peak detection (Hampel filter)
Talking/coughing:
- Disrupts natural breathing pattern
- Annotate and exclude from analysis
- Or model as separate event types
Best Practices
Standard workflow:
# 1. Clean signal
cleaned = nk.rsp_clean(rsp_raw, sampling_rate=100, method='khodadad2018')
# 2. Detect peaks/troughs
peaks, info = nk.rsp_peaks(cleaned, sampling_rate=100)
# 3. Extract features
rate = nk.rsp_rate(peaks, sampling_rate=100, desired_length=len(cleaned))
amplitude = nk.rsp_amplitude(cleaned, peaks)
phase = nk.rsp_phase(cleaned, peaks, sampling_rate=100)
# 4. Comprehensive processing (alternative)
signals, info = nk.rsp_process(rsp_raw, sampling_rate=100)
# 5. Analyze
analysis = nk.rsp_analyze(signals, sampling_rate=100)
Respiratory-cardiac integration:
# Process both signals
ecg_signals, ecg_info = nk.ecg_process(ecg, sampling_rate=1000)
rsp_signals, rsp_info = nk.rsp_process(rsp, sampling_rate=100)
# Respiratory sinus arrhythmia (RSA)
rsa = nk.hrv_rsa(ecg_info['ECG_R_Peaks'], rsp_signals['RSP_Clean'], sampling_rate=1000)
# Or use bio_process for multi-signal integration
bio_signals, bio_info = nk.bio_process(ecg=ecg, rsp=rsp, sampling_rate=1000)
Clinical and Research Applications
Psychophysiology:
- Emotion and arousal (rapid, shallow breathing during stress)
- Relaxation interventions (slow, deep breathing)
- Respiratory biofeedback
Anxiety and panic disorders:
- Hyperventilation during panic attacks
- Altered breathing patterns
- Breathing retraining therapy effectiveness
Sleep medicine:
- Sleep apnea detection
- Breathing pattern abnormalities
- Sleep stage correlates
Cardiorespiratory coupling:
- Respiratory sinus arrhythmia (HRV modulation by breathing)
- Heart-lung interaction
- Autonomic nervous system assessment
Neuroimaging:
- fMRI artifact correction (RVT regressor)
- BOLD signal confound removal
- Respiratory-related brain activity
Meditation and mindfulness:
- Breath awareness training
- Slow breathing practices (resonance frequency ~6 breaths/min)
- Physiological markers of relaxation
Athletic performance:
- Breathing efficiency
- Training adaptations
- Recovery monitoring
Interpretation Guidelines
Breathing rate:
- Normal: 12-20 BPM (adults at rest)
- Slow: <10 BPM (relaxation, meditation, sleep)
- Fast: >25 BPM (exercise, anxiety, pain, fever)
Breathing amplitude:
- Tidal volume typically 400-600 mL at rest
- Deep breathing: 2-3 L
- Shallow breathing: <300 mL
Respiratory patterns:
- Normal: Smooth, regular sinusoidal
- Cheyne-Stokes: Crescendo-decrescendo with apneas (clinical pathology)
- Ataxic: Completely irregular (brainstem lesion)
References
- Khodadad, D., Nordebo, S., Müller, B., Waldmann, A., Yerworth, R., Becher, T., ... & Bayford, R. (2018). A review of tissue substitutes for ultrasound imaging. Ultrasound in medicine & biology, 44(9), 1807-1823.
- Grossman, P., & Taylor, E. W. (2007). Toward understanding respiratory sinus arrhythmia: Relations to cardiac vagal tone, evolution and biobehavioral functions. Biological psychology, 74(2), 263-285.
- Birn, R. M., Diamond, J. B., Smith, M. A., & Bandettini, P. A. (2006). Separating respiratory-variation-related fluctuations from neuronal-activity-related fluctuations in fMRI. NeuroImage, 31(4), 1536-1548.