def test_ppg_simulate(): ppg1 = nk.ppg_simulate(duration=20, sampling_rate=500, heart_rate=70, frequency_modulation=.3, ibi_randomness=.25, drift=1, motion_amplitude=.5, powerline_amplitude=.1, burst_amplitude=1, burst_number=5, random_state=42, show=False) assert ppg1.size == 20 * 500 ppg2 = nk.ppg_simulate(duration=200, sampling_rate=1000, heart_rate=70, frequency_modulation=.3, ibi_randomness=.25, drift=1, motion_amplitude=.5, powerline_amplitude=.1, burst_amplitude=1, burst_number=5, random_state=42, show=False) assert ppg2.size == 200 * 1000 # Ensure that frequency_modulation does not affect other signal properties. ppg3 = nk.ppg_simulate(duration=200, sampling_rate=1000, heart_rate=70, frequency_modulation=1, ibi_randomness=.25, drift=1, motion_amplitude=.5, powerline_amplitude=.1, burst_amplitude=1, burst_number=5, random_state=42, show=False) assert np.allclose((ppg2.mean() - ppg3.mean()), 0, atol=1e-2) assert np.allclose((ppg2.std() - ppg3.std()), 0, atol=1e-2) # Ensure that ibi_randomness does not affect other signal properties. ppg4 = nk.ppg_simulate(duration=200, sampling_rate=1000, heart_rate=70, frequency_modulation=1, ibi_randomness=1, drift=1, motion_amplitude=.5, powerline_amplitude=.1, burst_amplitude=1, burst_number=5, random_state=42, show=False) assert np.allclose((ppg3.mean() - ppg4.mean()), 0, atol=1e-1) assert np.allclose((ppg3.std() - ppg4.std()), 0, atol=1e-1)
def test_ppg_clean(): sampling_rate = 500 ppg = nk.ppg_simulate( duration=30, sampling_rate=sampling_rate, heart_rate=180, frequency_modulation=0.01, ibi_randomness=0.1, drift=1, motion_amplitude=0.5, powerline_amplitude=0.1, burst_amplitude=1, burst_number=5, random_state=42, show=False, ) ppg_cleaned_elgendi = nk.ppg_clean(ppg, sampling_rate=sampling_rate, method="elgendi") assert ppg.size == ppg_cleaned_elgendi.size # Assert that bandpass filter with .5 Hz lowcut and 8 Hz highcut was applied. fft_raw = np.abs(np.fft.rfft(ppg)) fft_elgendi = np.abs(np.fft.rfft(ppg_cleaned_elgendi)) freqs = np.fft.rfftfreq(ppg.size, 1 / sampling_rate) assert np.sum(fft_raw[freqs < 0.5]) > np.sum(fft_elgendi[freqs < 0.5]) assert np.sum(fft_raw[freqs > 8]) > np.sum(fft_elgendi[freqs > 8])
def test_ppg_simulate(duration, sampling_rate, heart_rate, freq_modulation): ppg = nk.ppg_simulate( duration=duration, sampling_rate=sampling_rate, heart_rate=heart_rate, frequency_modulation=freq_modulation, ibi_randomness=0, drift=0, motion_amplitude=0, powerline_amplitude=0, burst_amplitude=0, burst_number=0, random_state=42, show=False, ) assert ppg.size == duration * sampling_rate signals, _ = nk.ppg_process(ppg, sampling_rate=sampling_rate) assert np.allclose(signals["PPG_Rate"].mean(), heart_rate, atol=1) # Ensure that the heart rate fluctuates in the requested range. groundtruth_range = freq_modulation * heart_rate observed_range = np.percentile(signals['PPG_Rate'], 90) - np.percentile( signals['PPG_Rate'], 10) assert np.allclose(groundtruth_range, observed_range, atol=groundtruth_range * .15)
def test_ppg_findpeaks(): sampling_rate = 500 ppg = nk.ppg_simulate( duration=30, sampling_rate=sampling_rate, heart_rate=60, frequency_modulation=0.01, ibi_randomness=0.1, drift=1, motion_amplitude=0.5, powerline_amplitude=0.1, burst_amplitude=1, burst_number=5, random_state=42, show=True, ) ppg_cleaned_elgendi = nk.ppg_clean(ppg, sampling_rate=sampling_rate, method="elgendi") info_elgendi = nk.ppg_findpeaks(ppg_cleaned_elgendi, sampling_rate=sampling_rate, show=True) peaks = info_elgendi["PPG_Peaks"] assert peaks.size == 29 assert peaks.sum() == 219763
def test_ppg_simulate_ibi(ibi_randomness, std_heart_rate): ppg = nk.ppg_simulate( duration=20, sampling_rate=50, heart_rate=70, frequency_modulation=0, ibi_randomness=ibi_randomness, drift=0, motion_amplitude=0, powerline_amplitude=0, burst_amplitude=0, burst_number=0, random_state=42, show=False, ) assert ppg.size == 20 * 50 signals, _ = nk.ppg_process(ppg, sampling_rate=50) assert np.allclose(signals["PPG_Rate"].mean(), 70, atol=1.5) # Ensure that standard deviation of heart rate assert np.allclose(signals["PPG_Rate"].std(), std_heart_rate, atol=1)
import numpy as np import pandas as pd import matplotlib.pyplot as plt import neurokit2 as nk # ============================================================================= # Simulate physiological signals # ============================================================================= # Generate synthetic signals ecg = nk.ecg_simulate(duration=10, heart_rate=70) ppg = nk.ppg_simulate(duration=10, heart_rate=70) rsp = nk.rsp_simulate(duration=10, respiratory_rate=15) eda = nk.eda_simulate(duration=10, scr_number=3) emg = nk.emg_simulate(duration=10, burst_number=2) # Visualise biosignals data = pd.DataFrame({ "ECG": ecg, "PPG": ppg, "RSP": rsp, "EDA": eda, "EMG": emg }) nk.signal_plot(data, subplots=True) # Save it data = pd.DataFrame({ "ECG": nk.ecg_simulate(duration=10, heart_rate=70, noise=0), "PPG":