基于窦性心律的阵发性房颤预测算法研究(2)

您所在的位置:网站首页 负荷预测数据归一化 基于窦性心律的阵发性房颤预测算法研究(2)

基于窦性心律的阵发性房颤预测算法研究(2)

2023-04-14 12:21| 来源: 网络整理| 查看: 265

一、wfdb介绍与使用

原生python波形数据库(wfdb)包。用于读取、写入和处理WFDB信号和注释的工具库。

此包的核心组件基于原始wfdb规范。此包不包含与原始wfdb包完全相同的功能。它的目标是用用户友好的api实现尽可能多的核心功能。随着时间的推移,还增加了其他有用的生理信号处理工具。

详细介绍:Python wfdb包_程序模块 - PyPI - Python中文网 (cnpython.com)

1、下载conda install wfdb / pip install wfdb

自行在终端下载

2、读取.hea文件import wfdb record = wfdb.rdheader('../data/abnormal/04015') display(record.__dict__)

结果:

''' {'record_name': '04015', 'n_sig': 2, 'fs': 250, 'counter_freq': None, 'base_counter': None, 'sig_len': 9205760, 'base_time': datetime.time(9, 0), 'base_date': None, 'comments': [], 'sig_name': ['ECG1', 'ECG2'], 'p_signal': None, 'd_signal': None, 'e_p_signal': None, 'e_d_signal': None, 'file_name': ['04015.dat', '04015.dat'], 'fmt': ['212', '212'], 'samps_per_frame': [1, 1], 'skew': [None, None], 'byte_offset': [None, None], 'adc_gain': [200.0, 200.0], 'baseline': [0, 0], 'units': ['mV', 'mV'], 'adc_res': [12, 12], 'adc_zero': [0, 0], 'init_value': [-55, -42], 'checksum': [-27172, -28460], 'block_size': [0, 0]} '''

比较有用的部分:

fs:采样频率;

n_sig:信号通道数;

sig_len:信号长度;

p_signal:模拟信号值,储存形式为ndarray或者是list;

d_signal:数字信号值,储存形式为ndarray或者是list

3、读取标注 .atr/.qrs/.qrscrecord=wfdb.rdann('../data/abnormal/04015', 'atr' ) print(record.__dict__)

结果:

''' { 'record_name': '04015', 'extension': 'atr', 'sample': array([30, 102584, 119604, 121773, 122194, 133348, 166857, 1096245, 1098054, 1135296, 1139595, 1422436, 1423548, 1459277, 1460416], dtype=int64), 'symbol': ['+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+'], 'subtype': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), 'chan': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), 'num': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), 'aux_note': ['(N', '(AFIB', '(N', '(AFIB', '(N', '(AFIB', '(N', '(AFIB', '(N', '(AFIB', '(N', '(AFIB', '(N', '(AFIB', '(N'], 'fs': 250, 'label_store': None, 'description': None, 'custom_labels': None, 'contained_labels': None, 'ann_len': 15} '''

常用到的部分:

sample:专家标注的信号发生变化的位置

symbol:信号发生变化的原因

4、绘制图像

利用matplotlib进行图像的绘制

import wfdb import matplolib.pyplot as plt record = wfdb.rdrecord('../data/abnormal/04015', # 文件所在路径 physical=False, # 若为True则读取原始信号p_signal,如果为False则读取数字信号d_signal,默认为False channel_names=['ECG1','ECG2']) # 读取那个通道,也可以用channel_names指定某个通道;如channel_names=['ECG1'] ​ # 转为数字信号 signal = record.d_signal # 绘制波形 print(signal) plt.plot(signal[0:500]) plt.title("ECG Signal") plt.show()

结果:

ECG信号二、数据预处理

此处仅读取通道为ECG1的数据

1、低通滤波

用于去除高频噪声

from scipy.signal import butter, lfilter # 读取数据 record = wfdb.rdrecord('../data/abnormal/04015',channel_names=['ECG1']) # 获取心电信号数据和注释信息 data = record.p_signal.flatten() annotation = wfdb.rdann('../data/abnormal/04015', 'atr') # 设置滤波器参数 nyquist_freq = 0.5 * record.fs cutoff_freq = 35 # 设置截止频率为35Hz filter_order = 4 # 设置滤波器阶数为4 # 计算滤波器系数 b, a = butter(filter_order, cutoff_freq/nyquist_freq, btype='low') # 对信号进行滤波 data_filtered = lfilter(b, a, data) # 打印原始信号和滤波后的信号的长度 print('Original signal length:', len(data), 'samples') print('Filtered signal length:', len(data_filtered), 'samples') ''' Original signal length: 9205760 samples Filtered signal length: 9205760 samples ''' ​

低通滤波前后对比图

原图低通滤波后2、小波变换

小波变换(wavelet transform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率的局部化分析,通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节。

import pywt # 小波阈值去噪函数 def wavelet_denoising(data): # 小波分解 coeffs = pywt.wavedec(data, 'db4', level=4) # 小波重构 denoised_data = pywt.waverec(coeffs, 'db4') return denoised_data

3、z-score归一化

常用的归一化方式,用于将数据转化到均值为0方差为1

from scipy import stats res_data=stats.zscore(res_data) plt.plot(res_data[0:1000]) plt.show()z-score归一化

至此就完成了对心电数据的预处理,接下来介绍R峰的获取和数据片段的截取



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3