我有一个PTB心电数据集是从https://www.physionet.org/content/ptb-xl/1.0.3/这个网址中下载的,下载位置是D:\下载\ptb-xl-a-large-publicly-available-electrocardiography-dataset-1.0.3,里面包含多种文件,具体信息可以参考网址中内容。现在要编写python代码,要求如下:1.使用小波原理对信号进行滤波;2.去除信号的基线漂移;3.如果有工频干扰的话,请去除工频干扰;4.绘制最后的信号图像
时间: 2024-03-19 07:41:59 浏览: 107
好的,以下是符合您要求的Python代码示例:
```python
import wfdb
import pywt
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 加载数据
record = wfdb.rdrecord('D:/下载/ptb-xl-a-large-publicly-available-electrocardiography-dataset-1.0.3/records100/00000/00001_lr')
signal = record.p_signal[:, 0] # 取第一列信号
fs = record.fs # 采样率
# 小波滤波
w = 'db4' # 选用Daubechies4小波
level = 6 # 小波分解层数
coeffs = pywt.wavedec(signal, w, level=level)
for i in range(1, level+1):
coeffs[i] = pywt.threshold(coeffs[i], np.std(coeffs[i])/2) # 阈值为标准差的一半
filtered_signal = pywt.waverec(coeffs, w)
# 去除基线漂移
baseline = signal - filtered_signal
filtered_signal += np.mean(baseline)
# 去除工频干扰
notch_freq_Hz = np.array([50.0]) # 工频干扰频率为50Hz
for freq_Hz in np.nditer(notch_freq_Hz):
bp_stop_Hz = freq_Hz + 3.0 * np.array([-1, 1])
b, a = signal.butter(3, bp_stop_Hz / (fs / 2.0), 'bandstop')
filtered_signal = signal.lfilter(b, a, filtered_signal)
# 绘制图像
plt.figure(figsize=(10, 5))
plt.plot(signal, label='Original')
plt.plot(filtered_signal, label='Filtered')
plt.title('Filtered Signal')
plt.xlabel('Sample')
plt.ylabel('Amplitude')
plt.legend()
plt.show()
```
这段代码使用了Python中的wfdb、pywt、numpy、matplotlib和scipy库,其中wfdb用于加载心电数据,pywt用于小波滤波,numpy用于数组计算,matplotlib用于绘制图像,scipy用于去除工频干扰。代码中的注释可以帮助您更好地理解代码的实现过程。
阅读全文