{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Synthetic Signal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Synthetic ECG Signal" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vitalDSP.utils.data_processing.synthesize_data import generate_ecg_signal\nimport numpy as np\nfrom plotly import graph_objects as go\nimport plotly.io as pio\npio.renderers.default = \"sphinx_gallery\"\n# pio.renderers.default = \"jupyterlab\" # or \"plotly_mimetype\"\n# from IPython.display import display, HTML\n# display(HTML(''))\nimport matplotlib.pyplot as plt\nfrom vitalDSP.utils.signal_processing.peak_detection import PeakDetection\nfrom vitalDSP.physiological_features.waveform import WaveformMorphology\n\nsfecg = 128\nN = 15\nAnoise = 0.05\nhrmean = 70\necg_signal = generate_ecg_signal(\n sfecg=sfecg, N=N, Anoise=Anoise, hrmean=hrmean\n)\n\ndetector = PeakDetection(\n ecg_signal,\"ecg_r_peak\", **{\n \"distance\": 50, \n \"window_size\": 7, \n \"threshold_factor\":1.6, \n \"search_window\":6}\n )\n\nrpeaks = detector.detect_peaks()\n\nwaveform = WaveformMorphology(ecg_signal, fs=128, signal_type=\"ECG\")\nq_valleys = waveform.detect_q_valley()\np_peaks = waveform.detect_p_peak()\ns_valleys = waveform.detect_s_valley()\nt_peaks = waveform.detect_t_peak()\n \nfig = go.Figure()\n # Plot the ECG signal\nfig.add_trace(go.Scatter(x=np.arange(len(ecg_signal)), y=ecg_signal, mode=\"lines\", name=\"ECG Signal\"))\n\n# Plot R-peaks\nfig.add_trace(go.Scatter(x=rpeaks, y=ecg_signal[rpeaks], mode=\"markers\", name=\"R Peaks\", marker=dict(color=\"red\", size=8)))\nfig.add_trace(go.Scatter(x=q_valleys, y=ecg_signal[q_valleys], mode=\"markers\", name=\"Q Valleys\", marker=dict(color=\"green\", size=8)))\nfig.add_trace(go.Scatter(x=s_valleys, y=ecg_signal[s_valleys], mode=\"markers\", name=\"S Valleys\", marker=dict(size=8)))\nfig.add_trace(go.Scatter(x=p_peaks, y=ecg_signal[p_peaks], mode=\"markers\", name=\"P Peaks\", marker=dict(size=8)))\nfig.add_trace(go.Scatter(x=t_peaks, y=ecg_signal[t_peaks], mode=\"markers\", name=\"T Peaks\", marker=dict(size=8)))\nfig.update_layout(\n title=\"ECG Signal with QRS-peaks/valleys and P, T peaks\",\n xaxis_title=\"Samples\",\n yaxis_title=\"Amplitude\",\n showlegend=True\n)\n# fig.show() # Auto-rendered in Sphinx" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Synthetic PPG Signal" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vitalDSP.utils.data_processing.synthesize_data import generate_synthetic_ppg, generate_synthetic_ppg_reversed\nimport numpy as np\nfrom plotly import graph_objects as go\nimport matplotlib.pyplot as plt\nfrom vitalDSP.utils.signal_processing.peak_detection import PeakDetection\n\ntime, ppg_signal = generate_synthetic_ppg(duration=10, sampling_rate=128, heart_rate=60, noise_level=0.004, display=False)\n\ndetector = PeakDetection(\n ppg_signal,\n \"ppg_systolic_peaks\",\n **{\n \"distance\": 50,\n \"window_size\": 7,\n \"threshold_factor\": 1.6,\n \"search_window\": 6,\n \"fs\": 128,\n },\n)\n\nsystolic_peaks = detector.detect_peaks()\n\nwaveform = WaveformMorphology(ppg_signal, fs=128, signal_type=\"PPG\")\nwaveform.systolic_peaks = systolic_peaks\ndiastolic_peaks = waveform.detect_diastolic_peak()\ndicrotic_notches = waveform.detect_dicrotic_notches()\ntroughs = waveform.detect_troughs()\n\nfig = go.Figure()\n# fig.add_trace(go.Scatter(x=time,y=ppg_signal,mode=\"lines\"))\n\nfig.add_trace(go.Scatter(x=np.arange(len(ppg_signal)), y=ppg_signal, mode=\"lines\", name=\"ECG Signal\"))\n\n# Plot R-peaks\nfig.add_trace(go.Scatter(x=systolic_peaks, y=ppg_signal[systolic_peaks], mode=\"markers\", name=\"systolic peaks\", marker=dict(color=\"red\", size=8)))\nfig.add_trace(go.Scatter(x=diastolic_peaks, y=ppg_signal[diastolic_peaks], mode=\"markers\", name=\"diastolic peaks\", marker=dict(color=\"green\", size=8)))\nfig.add_trace(go.Scatter(x=dicrotic_notches, y=ppg_signal[dicrotic_notches], mode=\"markers\", name=\"dicrotic notches\", marker=dict(size=8)))\nfig.add_trace(go.Scatter(x=troughs, y=ppg_signal[troughs], mode=\"markers\", name=\"troughs\", marker=dict(size=8)))\nfig.update_layout(\n title=\"PPG Signal with Systolic, Diastolic Peaks and Dicrotic Notches\",\n xaxis_title=\"Samples\",\n yaxis_title=\"Amplitude\",\n showlegend=True\n)\n\n# fig.show() # Auto-rendered in Sphinx\n\ntime, ppg_signal_reversed = generate_synthetic_ppg_reversed(duration=10, heart_rate=60, display=False)\nfig = go.Figure()\nfig.add_trace(go.Scatter(x=time,y=ppg_signal_reversed,mode=\"lines\"))\n# fig.show() # Auto-rendered in Sphinx\n" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Synthetic Respiratory Signal " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": "from vitalDSP.utils.data_processing.synthesize_data import generate_resp_signal\nimport numpy as np\nfrom plotly import graph_objects as go\nimport matplotlib.pyplot as plt\n\nresp_signal = generate_resp_signal(sampling_rate=1000.0, duration=20.0)\nfig = go.Figure()\nfig.add_trace(go.Scatter(x=np.arange(len(resp_signal)),y=resp_signal,mode=\"lines\"))\n# fig.show() # Auto-rendered in Sphinx\n" } ], "metadata": { "kernelspec": { "display_name": "wearables", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.17" } }, "nbformat": 4, "nbformat_minor": 2 }