{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Advanced Filtering" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kalman Filter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.advanced_signal_filtering import AdvancedSignalFiltering\n", "import plotly.io as pio\n", "pio.renderers.default = \"sphinx_gallery\"\n", "# pio.renderers.default = \"plotly_mimetype\" # or \"jupyterlab\"\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 plot_trace, load_sample_ecg_small\n", "\n", "\n", "# FILE_PATH = os.path.join(\"..\",\"..\",\"..\",\"sample_data\",\"public\",\"ecg.csv\")\n", "# signal_col, date_col = process_in_chunks(FILE_PATH,data_type='ecg', fs=128)\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "af = AdvancedSignalFiltering(signal_col)\n", "filtered_signal = af.kalman_filter(R=0.1, Q=0.01)\n", "\n", "plot_trace(signal_col,filtered_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optimization-based filter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.advanced_signal_filtering import AdvancedSignalFiltering\n", "from vitalDSP.utils.data_processing.synthesize_data import generate_ecg_signal\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", "target = generate_ecg_signal(sfecg=128, N=30, Anoise=0.01, hrmean=70, sfint=512)\n", "target = np.array(target[:min(len(target), len(signal_col))])\n", "signal_col = signal_col[:len(target)]\n", "\n", "af = AdvancedSignalFiltering(signal_col)\n", "filtered_signal = af.optimization_based_filtering(target, loss_type=\"mse\",\n", " initial_guess=0, learning_rate=0.01,\n", " iterations=20)\n", "plot_trace(signal_col, filtered_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gradient Descent Filter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.advanced_signal_filtering import AdvancedSignalFiltering\n", "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 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", "# Create a target signal\n", "target = generate_ecg_signal(sfecg=128, N=30, Anoise=0.01, hrmean=70, sfint=512)\n", "target = target[:min(len(target),len(signal_col))]\n", "\n", "signal_col = signal_col[:min(len(target),len(signal_col))]\n", "af = AdvancedSignalFiltering(signal_col)\n", "filtered_signal = af.gradient_descent_filter(target, learning_rate=0.1, \n", " iterations=20)\n", "\n", "plot_trace(signal_col,filtered_signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convolution-based filter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.advanced_signal_filtering import AdvancedSignalFiltering\n", "import numpy as np\n", "from vitalDSP.notebooks import plot_trace, load_sample_ecg_small\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "af = AdvancedSignalFiltering(signal_col)\n", "\n", "smoothed = af.convolution_based_filter(kernel_type=\"smoothing\", kernel_size=5)\n", "plot_trace(signal_col, smoothed, title=\"Smoothing kernel\")\n", "\n", "edge = af.convolution_based_filter(kernel_type=\"edge_detection\")\n", "plot_trace(signal_col, edge, title=\"Edge detection kernel\")\n", "\n", "sharpened = af.convolution_based_filter(kernel_type=\"sharpening\")\n", "plot_trace(signal_col, sharpened, title=\"Sharpening kernel\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Attention-based filter" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.advanced_signal_filtering import AdvancedSignalFiltering\n", "import numpy as np\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "af = AdvancedSignalFiltering(signal_col)\n", "\n", "gaussian_out = af.attention_based_filter(attention_type=\"gaussian\", size=11, sigma=2.0)\n", "plot_trace(signal_col, gaussian_out, title=\"Gaussian attention\")\n", "\n", "linear_out = af.attention_based_filter(attention_type=\"linear\", size=11, ascending=True)\n", "plot_trace(signal_col, linear_out, title=\"Linear attention\")\n", "\n", "exp_out = af.attention_based_filter(attention_type=\"exponential\", size=7, base=2.0)\n", "plot_trace(signal_col, exp_out, title=\"Exponential attention\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## LMS Adaptive Filtering" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.filtering.advanced_signal_filtering import AdvancedSignalFiltering\n", "from vitalDSP.utils.data_processing.synthesize_data import generate_ecg_signal\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", "target = generate_ecg_signal(sfecg=128, N=30, Anoise=0.01, hrmean=70, sfint=512)\n", "target = np.array(target[:min(len(target), len(signal_col))])\n", "signal_col = signal_col[:len(target)]\n", "\n", "af = AdvancedSignalFiltering(signal_col)\n", "# mu must satisfy mu < 1/(filter_order * max_signal_power) for LMS stability\n", "filtered_signal = af.adaptive_filtering(target, mu=0.005, filter_order=5)\n", "\n", "plot_trace(signal_col, filtered_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 }