{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Signal Transformations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Discrete Cosine Transformations" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.transforms.discrete_cosine_transform import DiscreteCosineTransform\n", "import numpy as np\n", "import os\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\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", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "dct = DiscreteCosineTransform(signal_col)\n", "dct_coefficients = dct.compute_dct()\n", "compressed_coefficients = dct.compress_signal(threshold=0.05)\n", "reconstructed_signal = dct.compute_idct(compressed_coefficients)\n", "plot_trace(signal_col,reconstructed_signal)\n", "\n", "# Feature extraction: Energy distribution in low-frequency components\n", "low_freq_energy = np.sum(dct_coefficients[:20]**2)\n", "total_energy = np.sum(dct_coefficients**2)\n", "low_freq_ratio = low_freq_energy / total_energy\n", "\n", "print(\"Low Frequency Energy Ratio:\", low_freq_ratio)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.transforms.discrete_cosine_transform import DiscreteCosineTransform\n", "import numpy as np\n", "import os\n", "from vitalDSP.notebooks import load_sample_ppg, plot_trace\n", "\n", "\n", "signal_col, date_col = load_sample_ppg()\n", "signal_col = np.array(signal_col)\n", "\n", "dct = DiscreteCosineTransform(signal_col)\n", "dct_coefficients = dct.compute_dct()\n", "\n", "# Zero out small coefficients (noise reduction)\n", "compressed_coefficients = dct.compress_signal(threshold=0.1)\n", "\n", "# Reconstruct the signal from filtered DCT coefficients\n", "ppg_reconstructed = dct.compute_idct(compressed_coefficients, norm='ortho')\n", "\n", "plot_trace(signal_col, ppg_reconstructed)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fourier Transform" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.transforms.fourier_transform import FourierTransform\n", "import numpy as np\n", "import matplotlib.pyplot as plt\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", "ft = FourierTransform(signal_col)\n", "filtered_signal = ft.filter_frequencies(low_cutoff=0.3, high_cutoff=1.5)\n", "plot_trace(signal_col,filtered_signal)\n", "\n", "# Plot the frequency spectrum\n", "fs=128\n", "ecg_freq_content = ft.compute_dft()\n", "freqs = np.fft.fftfreq(len(signal_col), d=1/fs)\n", "plt.plot(freqs[:len(freqs)//2], np.abs(ecg_freq_content)[:len(freqs)//2])\n", "plt.title(\"ECG Frequency Spectrum\")\n", "plt.xlabel(\"Frequency (Hz)\")\n", "plt.ylabel(\"Amplitude\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hilbert Transform" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.transforms.hilbert_transform import HilbertTransform\n", "import numpy as np\n", "import plotly.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", "# Apply Hilbert Transform\n", "ht = HilbertTransform(signal_col)\n", "analytic_signal = ht.compute_hilbert()\n", "# Compute the envelope of the ECG signal\n", "envelope_ecg = ht.envelope()\n", "# Compute the instantaneous phase of the ECG signal\n", "phase_ecg = ht.instantaneous_phase()\n", "print(\"ECG Analytic Signal:\", analytic_signal)\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(y=envelope_ecg, mode=\"lines\", name=\"envelope_ecg\"))\n", "fig.add_trace(go.Scatter(y=phase_ecg, mode=\"lines\", name=\"phase_ecg\"))\n", "fig.show()\n", "\n", "print(\"ECG Envelope:\", envelope_ecg)\n", "print(\"ECG Instantaneous Phase:\", phase_ecg)\n", "plot_trace(signal_col,np.real(analytic_signal))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Vital Transform" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.transforms.vital_transformation import VitalTransformation\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import os\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "\n", "fs = 128\n", "signal_type = 'ecg'\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "options = {\n", " 'artifact_removal': 'baseline_correction',\n", " 'artifact_removal_options': {'cutoff': 0.5},\n", " 'bandpass_filter': {'lowcut': 0.2, 'highcut': 10, 'filter_order': 4, 'filter_type': 'butter'},\n", " 'detrending': {'detrend_type': 'linear'},\n", " 'normalization': {'normalization_range': (0, 20)},\n", " 'smoothing': {'smoothing_method': 'moving_average', 'window_size': 5, 'iterations': 2},\n", " 'enhancement': {'enhance_method': 'square'},\n", " 'advanced_filtering': {'filter_type': 'kalman_filter', 'options': {'R': 0.1, 'Q': 0.01}},\n", " }\n", "method_order = ['artifact_removal', 'bandpass_filter', 'detrending', 'normalization', \n", " 'smoothing', 'enhancement','advanced_filtering']\n", "transformer = VitalTransformation(signal_col, fs=fs, signal_type=signal_type)\n", "transformed_signal = transformer.apply_transformations(options, method_order)\n", "plot_trace(signal_col, transformed_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 }