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