{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Artifact Removal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Mean Subtraction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.artifact_removal import ArtifactRemoval\n", "import plotly.io as pio\n", "pio.renderers.default = \"sphinx_gallery\"\n", "# pio.renderers.default = \"plotly_mimetype\" # or \"plotly_mimetype\"\n", "# from IPython.display import display, HTML\n", "# display(HTML(''))\n", "import numpy as np\n", "from plotly import graph_objects as go\n", "import os\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "ar = ArtifactRemoval(signal_col)\n", "cleaned_signal = ar.mean_subtraction()\n", "\n", "plot_trace(signal_col,cleaned_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Baseline Correction" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.artifact_removal import ArtifactRemoval\n", "import numpy as np\n", "from plotly import graph_objects as go\n", "import os\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "fs = 128\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "ar = ArtifactRemoval(signal_col)\n", "cleaned_signal = ar.baseline_correction(cutoff=0.5, fs=fs)\n", "\n", "plot_trace(signal_col,cleaned_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Wavelet Denoising" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.artifact_removal import ArtifactRemoval\n", "import numpy as np\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "fs = 128\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "ar = ArtifactRemoval(signal_col)\n", "\n", "# Daubechies db4, level 2 + Gaussian post-smoothing\n", "cleaned_db = ar.wavelet_denoising(\n", " wavelet_type=\"db\", level=2, order=4,\n", " smoothing=\"gaussian\", sigma=1.0\n", ")\n", "plot_trace(signal_col, np.real(cleaned_db), title=\"Daubechies db4 + Gaussian\")\n", "\n", "# Haar, level 2 + median post-smoothing\n", "cleaned_haar = ar.wavelet_denoising(wavelet_type=\"haar\", level=2,\n", " smoothing=\"median\", kernel_size=5)\n", "plot_trace(signal_col, np.real(cleaned_haar), title=\"Haar + Median\")\n", "\n", "# Symlet sym4, level 2 + moving average post-smoothing\n", "cleaned_sym = ar.wavelet_denoising(wavelet_type=\"sym\", order=4, level=2,\n", " smoothing=\"moving_average\", window_size=7)\n", "plot_trace(signal_col, np.real(cleaned_sym), title=\"Symlet sym4 + Moving Average\")\n", "\n", "# Custom wavelet (user-defined FIR) + low-pass post-smoothing\n", "custom_wavelet = np.array([0.1, 0.2, 0.4, 0.2, 0.1, 1.0, -0.5, 0.1, 0.2, 0.5, 0.2, 0.2])\n", "cleaned_custom = ar.wavelet_denoising(wavelet_type=\"custom\",\n", " custom_wavelet=custom_wavelet,\n", " smoothing=\"lowpass\", cutoff=0.3, fs=float(fs))\n", "plot_trace(signal_col, np.real(cleaned_custom), title=\"Custom wavelet + Low-pass\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adaptive Filtering" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.artifact_removal import ArtifactRemoval\n", "import numpy as np\n", "from vitalDSP.utils.data_processing.synthesize_data import generate_ecg_signal\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "fs = 128\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "# Synthetic ECG used as reference (correlated with real signal rhythm)\n", "reference = generate_ecg_signal(sfecg=128, N=30, Anoise=0.005, hrmean=70, sfint=512)\n", "reference = np.array(reference)\n", "\n", "n = min(len(reference), len(signal_col))\n", "signal_slice = signal_col[:n]\n", "reference_slice = reference[:n]\n", "\n", "ar = ArtifactRemoval(signal_slice)\n", "cleaned_signal = ar.adaptive_filtering(reference_slice, learning_rate=0.01, num_iterations=50)\n", "\n", "plot_trace(signal_slice, cleaned_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Notch Filter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.artifact_removal import ArtifactRemoval\n", "import numpy as np\n", "from plotly import graph_objects as go\n", "import os\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "fs = 128\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "ar = ArtifactRemoval(signal_col)\n", "cleaned_signal = ar.notch_filter(freq=5, fs=fs, Q=2)\n", "\n", "plot_trace(signal_col,cleaned_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PCA Artifact Removal" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.artifact_removal import ArtifactRemoval\n", "import numpy as np\n", "from plotly import graph_objects as go\n", "import os\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "fs = 128\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "ar = ArtifactRemoval(signal_col)\n", "cleaned_signal = ar.pca_artifact_removal(num_components=1,window_size=5, overlap=1) #QRS T Components\n", "\n", "plot_trace(signal_col,cleaned_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ICA Artifact Removal" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.artifact_removal import ArtifactRemoval\nimport numpy as np\nfrom plotly import graph_objects as go\nimport os\nfrom vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n\nfs = 128\nsignal_col, date_col = load_sample_ecg_small()\nsignal_col = np.array(signal_col)\n\nar = ArtifactRemoval(signal_col)\ncleaned_signal = ar.ica_artifact_removal(num_components=3)\n\nplot_trace(signal_col,cleaned_signal)" ] } ], "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 }