基线噪声
对于心电信号,,基线信号存在于脉搏信号中。对于基线,一般频率小于0.5HZ,不存在与心电信号频谱重叠的区域。因此采用基于sym8小波函数对信号进行分解,提取0~0.1HZ内的基线信号。
小波基选择

分解示意图

如上图所示,9层分解之后,得到的CA9的频率范围是0~0.703125HZ,
如果只分解8层,则会CD8频率范围1.40625~2.8125,因此选择9层分解。
对于MIT-BIH数据库(采样率360hz)的数据进行小波9层分解,每一层分解如图所示。

代码实现与时频域分析
cA9, cD9, cD8, cD7, cD6, cD5, cD4, cD3, cD2, cD1 = coeffs #数字越小频率越大
注意代数与频率的对应关系,CD1代表的是高频,CA9则是本次分解的最低频。

小波变换前后的时频域图像如下图所示:

可以看到小波变换之后,0HZ周围的噪声已经减弱。
代码也很简单,本网站有很多,需要的也可以留言邮箱。
def WT(data,wavelet,level):
#小波变换之后
Data = data.flatten()
coeffs = pywt.wavedec(data = Data, wavelet = wavelet, level = level)
# print(len(coeffs))
cA9, cD9, cD8, cD7, cD6, cD5, cD4, cD3, cD2, cD1 = coeffs #数字越小频率越大
plt.figure(figsize=(16,4))
plt.subplot(1,2,1)
plt.plot(cA9)
plt.title('cA9')
plt.subplot(1,2,2)
plt.plot(cD1)
plt.title('cD1')
# 将高频信号cD1、cD2,低频信号CA9置零
cD1.fill(0)
cD2.fill(0)
cD9.fill(0)
cA9.fill(0)
#180~360, 90~180,0.703125~1.40625,0~0.703125 均置为0
rdata = pywt.waverec(coeffs, wavelet='sym8')
return rdata
如果需要软阈值滤波:
threshold = (np.median(np.abs(cD1)) / 0.6745) * (np.sqrt(2 * np.log(len(cD1))))
# 将高频信号cD1、cD2置零
cD1.fill(0)
cD2.fill(0)
# 将其他中低频信号按软阈值公式滤波
for i in range(1, len(coeffs) - 2):
coeffs[i] = pywt.threshold(coeffs[i], threshold)
下面是相关滤波器设计的官网:
FIR filter design with Python and SciPy
问题分析
如果需要在k级进行分解,则2^k必须均匀地划分为信号的长度。如果原始信号的长度不正确,可以使用wextend函数对其进行扩展,
因此分解尺度过大的问题,源自不是整数倍
本文介绍如何利用小波变换处理心电信号中的基线噪声。通过选用合适的分解层数与小波基(sym8),有效提取并减弱了低频噪声。文章提供了Python代码实例,并分析了时频域的变化。
1181

被折叠的 条评论
为什么被折叠?



