scientific-skills/neurokit2/references/ecg_cardiac.md
Process electrocardiogram (ECG) and photoplethysmography (PPG) signals for cardiovascular analysis. This module provides comprehensive tools for R-peak detection, waveform delineation, quality assessment, and heart rate analysis.
Complete automated ECG processing pipeline that orchestrates multiple steps.
signals, info = nk.ecg_process(ecg_signal, sampling_rate=1000, method='neurokit')
Pipeline steps:
Returns:
signals: DataFrame with cleaned ECG, peaks, rate, quality, cardiac phasesinfo: Dictionary with R-peak locations and processing parametersCommon methods:
'neurokit' (default): Comprehensive NeuroKit2 pipeline'biosppy': BioSPPy-based processing'pantompkins1985': Pan-Tompkins algorithm'hamilton2002', 'elgendi2010', 'engzeemod2012': Alternative methodsRemove noise from raw ECG signals using method-specific filtering.
cleaned_ecg = nk.ecg_clean(ecg_signal, sampling_rate=1000, method='neurokit')
Methods:
'neurokit': High-pass Butterworth filter (0.5 Hz) + powerline filtering'biosppy': FIR filtering between 0.67-45 Hz'pantompkins1985': Band-pass 5-15 Hz + derivative-based'hamilton2002': Band-pass 8-16 Hz'elgendi2010': Band-pass 8-20 Hz'engzeemod2012': FIR band-pass 0.5-40 HzKey parameters:
powerline: Remove 50 or 60 Hz powerline noise (default: 50)Detect R-peaks in ECG signals with optional artifact correction.
peaks_dict, info = nk.ecg_peaks(cleaned_ecg, sampling_rate=1000, method='neurokit', correct_artifacts=False)
Available methods (13+ algorithms):
'neurokit': Hybrid approach optimized for reliability'pantompkins1985': Classic Pan-Tompkins algorithm'hamilton2002': Hamilton's adaptive threshold'christov2004': Christov's adaptive method'gamboa2008': Gamboa's approach'elgendi2010': Elgendi's two moving averages'engzeemod2012': Modified Engelse-Zeelenberg'kalidas2017': XQRS-based'martinez2004', 'rodrigues2021', 'koka2022', 'promac': Advanced methodsArtifact correction:
Set correct_artifacts=True to apply Lipponen & Tarvainen (2019) correction:
Returns:
'ECG_R_Peaks' key containing peak indicesIdentify P, Q, S, T waves and their onsets/offsets.
waves, waves_peak = nk.ecg_delineate(cleaned_ecg, rpeaks, sampling_rate=1000, method='dwt')
Methods:
'dwt' (default): Discrete wavelet transform-based detection'peak': Simple peak detection around R-peaks'cwt': Continuous wavelet transform (Martinez et al., 2004)Detected components:
ECG_P_Peaks, ECG_P_Onsets, ECG_P_OffsetsECG_Q_PeaksECG_S_PeaksECG_T_Peaks, ECG_T_Onsets, ECG_T_OffsetsReturns:
waves: Dictionary with all wave indiceswaves_peak: Dictionary with peak amplitudesAssess ECG signal integrity and quality.
quality = nk.ecg_quality(ecg_signal, rpeaks=None, sampling_rate=1000, method='averageQRS')
Methods:
'averageQRS' (default): Template matching correlation (Zhao & Zhang, 2018)
'zhao2018': Multi-index approach using kurtosis, power spectrum distributionUse cases:
High-level analysis that automatically selects event-related or interval-related mode.
analysis = nk.ecg_analyze(signals, sampling_rate=1000, method='auto')
Mode selection:
Returns: DataFrame with cardiac metrics appropriate for the analysis mode.
Analyze stimulus-locked ECG epochs for event-related responses.
results = nk.ecg_eventrelated(epochs)
Computed metrics:
ECG_Rate_Baseline: Mean heart rate before stimulusECG_Rate_Min/Max: Minimum/maximum heart rate during epochECG_Phase_Atrial/Ventricular: Cardiac phase at stimulus onsetUse case: Experimental paradigms with discrete trials (e.g., stimulus presentations, task events).
Analyze continuous ECG recordings for resting state or extended periods.
results = nk.ecg_intervalrelated(signals, sampling_rate=1000)
Computed metrics:
ECG_Rate_Mean: Average heart rate over intervalhrv() function)
Minimum duration:
Compute instantaneous heart rate from R-peak intervals.
heart_rate = nk.ecg_rate(peaks, sampling_rate=1000, desired_length=None)
Method:
desired_length specifiedReturns:
Determine atrial and ventricular systole/diastole phases.
cardiac_phase = nk.ecg_phase(ecg_cleaned, rpeaks, delineate_info)
Phases computed:
ECG_Phase_Atrial: Atrial systole (1) vs. diastole (0)ECG_Phase_Ventricular: Ventricular systole (1) vs. diastole (0)ECG_Phase_Completion_Atrial/Ventricular: Percentage of phase completion (0-1)Use case:
Extract individual heartbeats for morphological analysis.
heartbeats = nk.ecg_segment(ecg_cleaned, rpeaks, sampling_rate=1000)
Returns:
Detect and correct inverted ECG signals automatically.
corrected_ecg, is_inverted = nk.ecg_invert(ecg_signal, sampling_rate=1000)
Method:
Extract ECG-derived respiration (EDR) as respiratory proxy signal.
edr_signal = nk.ecg_rsp(ecg_cleaned, sampling_rate=1000, method='vangent2019')
Methods:
'vangent2019': Bandpass filtering 0.1-0.4 Hz'charlton2016': Bandpass 0.15-0.4 Hz'soni2019': Bandpass 0.08-0.5 HzUse case:
Generate synthetic ECG signals for testing and validation.
synthetic_ecg = nk.ecg_simulate(duration=10, sampling_rate=1000, heart_rate=70, method='ecgsyn', noise=0.01)
Methods:
'ecgsyn': Realistic dynamical model (McSharry et al., 2003)
'simple': Faster wavelet-based approximation
Key parameters:
heart_rate: Average BPM (default: 70)heart_rate_std: Heart rate variability magnitude (default: 1)noise: Gaussian noise level (default: 0.01)random_state: Seed for reproducibilityVisualize processed ECG with detected R-peaks and signal quality.
nk.ecg_plot(signals, info)
Displays:
Poor R-peak detection:
method='pantompkins1985' often robustecg_invert()correct_artifacts=TrueNoisy signal:
Missing waveform components:
'dwt', 'peak', 'cwt')ecg_quality()# Process both signals
ecg_signals, ecg_info = nk.ecg_process(ecg, sampling_rate=1000)
rsp_signals, rsp_info = nk.rsp_process(rsp, sampling_rate=1000)
# Compute RSA
rsa = nk.hrv_rsa(ecg_info['ECG_R_Peaks'], rsp_signals['RSP_Clean'], sampling_rate=1000)
# Process multiple signals at once
bio_signals, bio_info = nk.bio_process(
ecg=ecg_signal,
rsp=rsp_signal,
eda=eda_signal,
sampling_rate=1000
)