原生python波形数据库(wfdb)包。用于读取、写入和处理WFDB信号和注释的工具库。
此包的核心组件基于原始wfdb规范。此包不包含与原始wfdb包完全相同的功能。它的目标是用用户友好的api实现尽可能多的核心功能。随着时间的推移,还增加了其他有用的生理信号处理工具。
详细介绍:Python wfdb包_程序模块 - PyPI - Python中文网 (cnpython.com)
conda install wfdb / pip install wfdb
自行在终端下载
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
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:信号发生变化的原因
利用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()
结果:
此处仅读取通道为ECG1的数据
用于去除高频噪声
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
'''
低通滤波前后对比图
小波变换(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
常用的归一化方式,用于将数据转化到均值为0方差为1
from scipy import stats
res_data=stats.zscore(res_data)
plt.plot(res_data[0:1000])
plt.show()
结果:
至此就完成了对心电数据的预处理,接下来介绍R峰的获取和数据片段的截取