小波变换 python MITBIH数据库 基线漂移去噪

本文介绍如何利用小波变换处理心电信号中的基线噪声。通过选用合适的分解层数与小波基(sym8),有效提取并减弱了低频噪声。文章提供了Python代码实例,并分析了时频域的变化。
部署运行你感兴趣的模型镜像


基线噪声

对于心电信号,,基线信号存在于脉搏信号中。对于基线,一般频率小于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函数对其进行扩展,

因此分解尺度过大的问题,源自不是整数倍

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值