{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Signal Quality Indices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Amplitude Variability SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Configure Plotly for ReadTheDocs\n", "import plotly.io as pio\n", "pio.renderers.default = \"sphinx_gallery\"\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\n", "import numpy as np\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", "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", "duration = 60\n", "step_size = fs * 20\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.amplitude_variability_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=2,threshold_type='above', aggregate=False\n", ")\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Baseline Wander SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.baseline_wander_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=2,threshold_type='above'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Zero-Crossing SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.zero_crossing_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=2,threshold_type='above'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Entropy SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.signal_entropy_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=-2,threshold_type='below'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Skewness " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.skewness_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=-2,threshold_type='below'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kurtosis SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.kurtosis_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=2,threshold_type='above'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Peak-to-Peak Amplitude SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.peak_to_peak_amplitude_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=2,threshold_type='above'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Signal-to-Noise Ratio (SNR) SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.snr_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=-1,threshold_type='below'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Energy SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\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", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.energy_sqi(\n", " window_size=fs * duration, step_size=step_size, threshold=2,threshold_type='above'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Waveform Similarity SQI" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from vitalDSP.signal_quality_assessment.signal_quality_index import SignalQualityIndex\n", "import numpy as np\n", "from vitalDSP.utils.data_processing.synthesize_data import generate_ecg_signal\n", "from plotly import graph_objects as go\n", "import os\n", "from vitalDSP.notebooks import load_sample_ecg_small, plot_trace\n", "pio.renderers.default = \"sphinx_gallery\"\n", "\n", "fs = 128\n", "duration = 60\n", "step_size = fs * 20\n", "\n", "signal_col, date_col = load_sample_ecg_small()\n", "signal_col = np.array(signal_col)\n", "\n", "offset = 1000\n", "target = generate_ecg_signal(sfecg=fs, duration=duration, \n", " Anoise=0.01, hrmean=70, sfint=512)\n", "reference_signal = target[offset:(fs*duration+offset)]\n", "\n", "sqi = SignalQualityIndex(signal_col)\n", "sqi_values, normal_segments, abnormal_segments = sqi.waveform_similarity_sqi(\n", " window_size=fs * duration, step_size=step_size, \n", " reference_waveform=reference_signal,\n", " threshold=-2,threshold_type='below'\n", ", aggregate=False)\n", "\n", "# Prepare the normal and abnormal segments along with their corresponding date_col\n", "date_col_normal = []\n", "date_col_abnormal = []\n", "normal_signal = []\n", "abnormal_signal = []\n", "\n", "for start, end in normal_segments:\n", " date_col_normal.extend(date_col[start:end])\n", " normal_signal.extend(signal_col[start:end])\n", "\n", "for start, end in abnormal_segments:\n", " date_col_abnormal.extend(date_col[start:end])\n", " abnormal_signal.extend(signal_col[start:end])\n", "\n", "# Convert lists to numpy arrays\n", "normal_signal = np.array(normal_signal)\n", "abnormal_signal = np.array(abnormal_signal)\n", "date_col_normal = np.array(date_col_normal)\n", "date_col_abnormal = np.array(date_col_abnormal)\n", "\n", "# Plot the original signal and segments\n", "fig = go.Figure()\n", "fig.add_trace(go.Scatter(x=date_col, y=signal_col, mode='lines', name='Original Signal'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_normal, y=normal_signal,\n", " mode='lines', line=dict(color='green', width=2),\n", " name='Normal Segments'))\n", "\n", "fig.add_trace(go.Scatter(x=date_col_abnormal, y=abnormal_signal,\n", " mode='lines', line=dict(color='red', width=2),\n", " name='Abnormal Segments'))\n", "\n", "\n", "# Update layout\n", "fig.update_layout(\n", " title=\"Signal with Combined Normal and Abnormal Segments\",\n", " xaxis_title=\"Time\",\n", " yaxis_title=\"Amplitude\",\n", " legend_title=\"Segments\"\n", ")\n", "\n", "fig.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "# Plot the histogram of SQI values\n", "# Plot the histogram of SQI values using Plotly\n", "fig_hist = go.Figure()\n", "fig_hist.add_trace(go.Histogram(\n", " x=sqi_values,\n", " nbinsx=20,\n", " marker_color=\"blue\",\n", " marker_line=dict(color=\"black\", width=1),\n", " name=\"SQI Values\"\n", "))\n", "\n", "fig_hist.update_layout(\n", " title=\"Histogram of SQI Values\",\n", " xaxis_title=\"SQI Value\",\n", " yaxis_title=\"Frequency\",\n", " showlegend=False\n", ")\n", "\n", "fig_hist.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 }