Я пытаюсь оценить PSD вариабельности сердечного ритма сигнала ЭКГ. Чтобы протестировать мой код, я извлек интервал R-R из базы данных ЭКГЭФФЭКТ. Я извлек сигнал, доступ к которому можно получить здесь. Чтобы рассчитать PSD, я использую метод welch, как показано ниже:
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import welch
ibi_signal = np.loadtxt('fantasia-f1y01-RR.txt')
t = np.array(ibi_signal[:, 0]) # time index in seconds
ibi = np.array(ibi_signal[:, 1]) # the IBI in seconds
# Convert the IBI in milliseconds
ibi = ibi * 1000
# Calculate the welch estimate
Fxx, Pxx = welch(ibi, fs=4.0, window='hanning', nperseg=256, noverlap=128)
Далее, площадь под кривой вычисляется для оценки спектра мощности различных диапазонов HRV, как показано ниже.
ulf = 0.003
vlf = 0.04
lf = 0.15
hf = 0.4
Fs = 250
# find the indexes corresponding to the VLF, LF, and HF bands
ulf_freq_band = (Fxx <= ulf)
vlf_freq_band = (Fxx >= ulf) & (Fxx <= vlf)
lf_freq_band = (Fxx >= vlf) & (Fxx <= lf)
hf_freq_band = (Fxx >= lf) & (Fxx <= hf)
tp_freq_band = (Fxx >= 0) & (Fxx <= hf)
# Calculate the area under the given frequency band
dy = 1.0 / Fs
ULF = np.trapz(y=abs(Pxx[ulf_freq_band]), x=None, dx=dy)
VLF = np.trapz(y=abs(Pxx[vlf_freq_band]), x=None, dx=dy)
LF = np.trapz(y=abs(Pxx[lf_freq_band]), x=None, dx=dy)
HF = np.trapz(y=abs(Pxx[hf_freq_band]), x=None, dx=dy)
TP = np.trapz(y=abs(Pxx[tp_freq_band]), x=None, dx=dy)
LF_HF = float(LF) / HF
HF_LF = float(HF) / LF
HF_NU = float(HF) / (TP - VLF)
LF_NU = float(LF) / (TP - VLF)
Затем я рисую PSD и получаю следующий сюжет
Вначале я выгляжу хорошо. Однако, когда я сравниваю свой результат с продуктом Kubios, который является программным обеспечением, чем анализирует ВСР, я заметил, что есть различия. Следующая таблица показывает ожидаемое значение для PSD, рассчитанное Kubios А именно, эти два графика визуально отличаются друг от друга, и их значения различны. Чтобы подтвердить это, распечатка моих данных ясно показывает, что мои вычисления ошибочны.
ULF 0.0
VLF 13.7412277853
LF 45.3602063444
HF 147.371442221
TP 239.521363002
LF_HF 0.307795090152
HF_LF 3.2489147228
HF_NU 0.652721029154
LF_NU 0.200904328012
Я, таким образом, задаюсь вопросом:
- Может кто-нибудь предложить документ, который я должен прочитать, чтобы улучшить свое понимание анализа спектров?
- Что не так с моим подходом?
- Как выбрать наиболее подходящие параметры для функции welch?
- Хотя оба сюжета имеют одну и ту же форму, данные совершенно разные. Как я могу улучшить это?
- Есть ли лучший способ решить эту проблему? Я думаю об использовании оценки Lomb-Scargle, но я жду, чтобы получить хотя бы метод Welch.