一、R峰的提取
Pan-Tompkins算法是一种基于离散小波变换的心电图(ECG)信号处理方法,用于监测并检测QRS波群的出现。该算法首先对原始ECG信号进行预处理,包括滤波、差分运算和积分运算等,然后使用一个特殊的小波滤波器来提取Q波、R波和S波的信息,并根据信号特征来检测QRS波群的位置。算法的主要流程如下图:
检测出来的R峰如图所示
二、片段提取
由于R峰的检测效果并不是那么好,因此本文直接用原始数据集标注的R峰
本文的目的是找到房颤数据集中标注正常的那一部分数据,与原始正常数据集中的数据进行学习,以此来通过正常的心律片段来预测房颤。因此找到标注文件中的数据,提取的正常心电片段。
主要利用qrs标注文件,找到标注为'(N'的片段,提取阵发性房颤片段中的正常部分~
提取部分为从一个'(N'到下一个'(N'的部分,形成一段数据集,然后在这段数据集中,提取R峰左边1s右边2s的数据
def getDataSet_abnormal(number, X_data, Y_data, flag):
# 读取心电数据记录
print(flag, "正在读取 ,", number, " 号心电数据...")
record = wfdb.rdrecord(destination + category[flag] + '/' + number, channel_names=['ECG1'])
data = record.p_signal.flatten()
data1 = filtering(data, record) # 低通滤波
data2 = wavelet_denoising(data=data1) # 小波变换
# data3 = resample(data2, record)
res_data = stats.zscore(data2)
# 获取心电数据记录中R波的位置和对应的标签
annotation = wfdb.rdann(destination + category[flag] + '/' + number, 'atr')
Rlocation = annotation.sample
# 获取标记符号列表
symbol_list = annotation.aux_note
# 查找所有包含N标记的注释区间
N_ranges = []
N_start = None
for i, symbol in enumerate(symbol_list):
if symbol == '(N' and N_start is None:
N_start = Rlocation[i]
elif symbol != '(N' and N_start is not None:
N_end = Rlocation[i]
N_ranges.append((N_start, N_end))
N_start = None
# 如果最后一个注释是N,需要手动添加其结束位置
if N_start is not None:
N_end = len(res_data)
N_ranges.append((N_start, N_end))
# 输出找到的N区间的数量
# print('Found %d N segments.' % len(N_ranges))
# 从正常位置中找到R峰
for start, end in N_ranges:
x_ann = wfdb.rdann(destination + category[flag] + '/' + number, 'qrs', sampfrom=start, sampto=end)
Rlocation_N = x_ann.sample
i = 5
j = len(Rlocation_N) - 10
while i < j:
try:
tmp_data = res_data[Rlocation_N[i] - left_len * fs_afdb:Rlocation_N[i] + right_len * fs_afdb]
# 需要对房颤数据集进行下采样
re_signal = scipy.signal.resample(tmp_data, 384) # 采样
X_data.append(re_signal)
Y_data.append(flag)
i += 3 # 间隔三个周期提取一个波形
except ValueError:
i += 3
return
三、下采样
将房颤数据集的采样频率(250hz)和正常窦性心律数据集(128hz)的采用频率对齐,即
384的原因:3s的采样,3*128hz=384个采样点
# 需要对房颤数据集进行下采样
re_signal = scipy.signal.resample(tmp_data, 384) # 采样
下一节解释数据集的划分以及处理数据集不平衡的办法