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