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()