基于窦性心律的阵发性房颤预测算法研究(3)--R峰定位和片段截取

一、R峰的提取

Pan-Tompkins算法是一种基于离散小波变换的心电图(ECG)信号处理方法,用于监测并检测QRS波群的出现。该算法首先对原始ECG信号进行预处理,包括滤波、差分运算和积分运算等,然后使用一个特殊的小波滤波器来提取Q波、R波和S波的信息,并根据信号特征来检测QRS波群的位置。算法的主要流程如下图:

基于窦性心律的阵发性房颤预测算法研究(3)--R峰定位和片段截取_第1张图片

 检测出来的R峰如图所示

基于窦性心律的阵发性房颤预测算法研究(3)--R峰定位和片段截取_第2张图片

 二、片段提取

由于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)  # 采样

下一节解释数据集的划分以及处理数据集不平衡的办法

你可能感兴趣的:(算法,神经网络,深度学习,python)