{ "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\n", "import numpy as np\n", "from plotly import graph_objects as go\n", "import plotly.io as pio\n", "pio.renderers.default = \"sphinx_gallery\"\n", "# pio.renderers.default = \"jupyterlab\" # or \"plotly_mimetype\"\n", "# from IPython.display import display, HTML\n", "# display(HTML(''))\n", "import matplotlib.pyplot as plt\n", "from vitalDSP.utils.signal_processing.peak_detection import PeakDetection\n", "from vitalDSP.physiological_features.waveform import WaveformMorphology\n", "\n", "sfecg = 128\n", "N = 15\n", "Anoise = 0.05\n", "hrmean = 70\n", "ecg_signal = generate_ecg_signal(\n", " sfecg=sfecg, N=N, Anoise=Anoise, hrmean=hrmean\n", ")\n", "\n", "detector = 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", "\n", "rpeaks = detector.detect_peaks()\n", "\n", "waveform = WaveformMorphology(ecg_signal, fs=128, signal_type=\"ECG\")\n", "q_valleys = waveform.detect_q_valley()\n", "p_peaks = waveform.detect_p_peak()\n", "s_valleys = waveform.detect_s_valley()\n", "t_peaks = waveform.detect_t_peak()\n", " \n", "fig = go.Figure()\n", " # Plot the ECG signal\n", "fig.add_trace(go.Scatter(x=np.arange(len(ecg_signal)), y=ecg_signal, mode=\"lines\", name=\"ECG Signal\"))\n", "\n", "# Plot R-peaks\n", "fig.add_trace(go.Scatter(x=rpeaks, y=ecg_signal[rpeaks], mode=\"markers\", name=\"R Peaks\", marker=dict(color=\"red\", size=8)))\n", "fig.add_trace(go.Scatter(x=q_valleys, y=ecg_signal[q_valleys], mode=\"markers\", name=\"Q Valleys\", marker=dict(color=\"green\", size=8)))\n", "fig.add_trace(go.Scatter(x=s_valleys, y=ecg_signal[s_valleys], mode=\"markers\", name=\"S Valleys\", marker=dict(size=8)))\n", "fig.add_trace(go.Scatter(x=p_peaks, y=ecg_signal[p_peaks], mode=\"markers\", name=\"P Peaks\", marker=dict(size=8)))\n", "fig.add_trace(go.Scatter(x=t_peaks, y=ecg_signal[t_peaks], mode=\"markers\", name=\"T Peaks\", marker=dict(size=8)))\n", "fig.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()" ] }, { "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\n", "import numpy as np\n", "from plotly import graph_objects as go\n", "import matplotlib.pyplot as plt\n", "from vitalDSP.utils.signal_processing.peak_detection import PeakDetection\n", "\n", "time, ppg_signal = generate_synthetic_ppg(duration=10, sampling_rate=128, heart_rate=60, noise_level=0.004, display=False)\n", "\n", "detector = 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", "\n", "systolic_peaks = detector.detect_peaks()\n", "\n", "waveform = WaveformMorphology(ppg_signal, fs=128, signal_type=\"PPG\")\n", "waveform.systolic_peaks = systolic_peaks\n", "diastolic_peaks = waveform.detect_diastolic_peak()\n", "dicrotic_notches = waveform.detect_dicrotic_notches()\n", "troughs = waveform.detect_troughs()\n", "\n", "fig = go.Figure()\n", "# fig.add_trace(go.Scatter(x=time,y=ppg_signal,mode=\"lines\"))\n", "\n", "fig.add_trace(go.Scatter(x=np.arange(len(ppg_signal)), y=ppg_signal, mode=\"lines\", name=\"ECG Signal\"))\n", "\n", "# Plot R-peaks\n", "fig.add_trace(go.Scatter(x=systolic_peaks, y=ppg_signal[systolic_peaks], mode=\"markers\", name=\"systolic peaks\", marker=dict(color=\"red\", size=8)))\n", "fig.add_trace(go.Scatter(x=diastolic_peaks, y=ppg_signal[diastolic_peaks], mode=\"markers\", name=\"diastolic peaks\", marker=dict(color=\"green\", size=8)))\n", "fig.add_trace(go.Scatter(x=dicrotic_notches, y=ppg_signal[dicrotic_notches], mode=\"markers\", name=\"dicrotic notches\", marker=dict(size=8)))\n", "fig.add_trace(go.Scatter(x=troughs, y=ppg_signal[troughs], mode=\"markers\", name=\"troughs\", marker=dict(size=8)))\n", "fig.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()\n", "\n", "time, ppg_signal_reversed = generate_synthetic_ppg_reversed(duration=10, heart_rate=60, display=False)\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=time,y=ppg_signal_reversed,mode=\"lines\"))\n", "fig.show()\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\n", "import numpy as np\n", "from plotly import graph_objects as go\n", "import matplotlib.pyplot as plt\n", "\n", "resp_signal = generate_resp_signal(sampling_rate=1000.0, duration=20.0)\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=np.arange(len(resp_signal)),y=resp_signal,mode=\"lines\"))\n", "fig.show()\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 }