Synthetic Signal
Synthetic ECG Signal
from vitalDSP.utils.data_processing.synthesize_data import generate_ecg_signal
import numpy as np
from plotly import graph_objects as go
import plotly.io as pio
pio.renderers.default = "sphinx_gallery"
# pio.renderers.default = "jupyterlab" # or "plotly_mimetype"
# from IPython.display import display, HTML
# display(HTML('<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>'))
import matplotlib.pyplot as plt
from vitalDSP.utils.signal_processing.peak_detection import PeakDetection
from vitalDSP.physiological_features.waveform import WaveformMorphology
sfecg = 128
N = 15
Anoise = 0.05
hrmean = 70
ecg_signal = generate_ecg_signal(
sfecg=sfecg, N=N, Anoise=Anoise, hrmean=hrmean
)
detector = PeakDetection(
ecg_signal,"ecg_r_peak", **{
"distance": 50,
"window_size": 7,
"threshold_factor":1.6,
"search_window":6}
)
rpeaks = detector.detect_peaks()
waveform = WaveformMorphology(ecg_signal, fs=128, signal_type="ECG")
q_valleys = waveform.detect_q_valley()
p_peaks = waveform.detect_p_peak()
s_valleys = waveform.detect_s_valley()
t_peaks = waveform.detect_t_peak()
fig = go.Figure()
# Plot the ECG signal
fig.add_trace(go.Scatter(x=np.arange(len(ecg_signal)), y=ecg_signal, mode="lines", name="ECG Signal"))
# Plot R-peaks
fig.add_trace(go.Scatter(x=rpeaks, y=ecg_signal[rpeaks], mode="markers", name="R Peaks", marker=dict(color="red", size=8)))
fig.add_trace(go.Scatter(x=q_valleys, y=ecg_signal[q_valleys], mode="markers", name="Q Valleys", marker=dict(color="green", size=8)))
fig.add_trace(go.Scatter(x=s_valleys, y=ecg_signal[s_valleys], mode="markers", name="S Valleys", marker=dict(size=8)))
fig.add_trace(go.Scatter(x=p_peaks, y=ecg_signal[p_peaks], mode="markers", name="P Peaks", marker=dict(size=8)))
fig.add_trace(go.Scatter(x=t_peaks, y=ecg_signal[t_peaks], mode="markers", name="T Peaks", marker=dict(size=8)))
fig.update_layout(
title="ECG Signal with QRS-peaks/valleys and P, T peaks",
xaxis_title="Samples",
yaxis_title="Amplitude",
showlegend=True
)
fig.show()
Synthetic PPG Signal
from vitalDSP.utils.data_processing.synthesize_data import generate_synthetic_ppg, generate_synthetic_ppg_reversed
import numpy as np
from plotly import graph_objects as go
import matplotlib.pyplot as plt
from vitalDSP.utils.signal_processing.peak_detection import PeakDetection
time, ppg_signal = generate_synthetic_ppg(duration=10, sampling_rate=128, heart_rate=60, noise_level=0.004, display=False)
detector = PeakDetection(
ppg_signal,
"ppg_systolic_peaks",
**{
"distance": 50,
"window_size": 7,
"threshold_factor": 1.6,
"search_window": 6,
"fs": 128,
},
)
systolic_peaks = detector.detect_peaks()
waveform = WaveformMorphology(ppg_signal, fs=128, signal_type="PPG")
waveform.systolic_peaks = systolic_peaks
diastolic_peaks = waveform.detect_diastolic_peak()
dicrotic_notches = waveform.detect_dicrotic_notches()
troughs = waveform.detect_troughs()
fig = go.Figure()
# fig.add_trace(go.Scatter(x=time,y=ppg_signal,mode="lines"))
fig.add_trace(go.Scatter(x=np.arange(len(ppg_signal)), y=ppg_signal, mode="lines", name="ECG Signal"))
# Plot R-peaks
fig.add_trace(go.Scatter(x=systolic_peaks, y=ppg_signal[systolic_peaks], mode="markers", name="systolic peaks", marker=dict(color="red", size=8)))
fig.add_trace(go.Scatter(x=diastolic_peaks, y=ppg_signal[diastolic_peaks], mode="markers", name="diastolic peaks", marker=dict(color="green", size=8)))
fig.add_trace(go.Scatter(x=dicrotic_notches, y=ppg_signal[dicrotic_notches], mode="markers", name="dicrotic notches", marker=dict(size=8)))
fig.add_trace(go.Scatter(x=troughs, y=ppg_signal[troughs], mode="markers", name="troughs", marker=dict(size=8)))
fig.update_layout(
title="PPG Signal with Systolic, Diastolic Peaks and Dicrotic Notches",
xaxis_title="Samples",
yaxis_title="Amplitude",
showlegend=True
)
fig.show()
time, ppg_signal_reversed = generate_synthetic_ppg_reversed(duration=10, heart_rate=60, display=False)
fig = go.Figure()
fig.add_trace(go.Scatter(x=time,y=ppg_signal_reversed,mode="lines"))
fig.show()
Synthetic Respiratory Signal
from vitalDSP.utils.data_processing.synthesize_data import generate_resp_signal
import numpy as np
from plotly import graph_objects as go
import matplotlib.pyplot as plt
resp_signal = generate_resp_signal(sampling_rate=1000.0, duration=20.0)
fig = go.Figure()
fig.add_trace(go.Scatter(x=np.arange(len(resp_signal)),y=resp_signal,mode="lines"))
fig.show()