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

一、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/.qrsc

record=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()

结果:

基于窦性心律的阵发性房颤预测算法研究(2)--数据预处理_第1张图片

 

二、数据预处理

此处仅读取通道为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)--数据预处理_第2张图片 原图

 

基于窦性心律的阵发性房颤预测算法研究(2)--数据预处理_第3张图片 低通滤波后图像

 

 

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()

结果:

基于窦性心律的阵发性房颤预测算法研究(2)--数据预处理_第4张图片

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

你可能感兴趣的:(算法,python,人工智能)