便携式心电监测设备研究

        这是和我研究生毕业课题关联性很强的一个部分,使用的芯片是AD8232,测量原理图使用的是心电监护仪配置。

         主要是考虑到我做的这个设备使用场景不存在较大的运动伪影,测取的波形更多是用于辅助诊断。

        因为我的最终目标是通过AD8232获取12导联心电信号,但是AD8232只能获取II导联心电信号,因此我第一步解决的问题就是如何从II导联心电信号获取到12导联心电信号。这里我采用的是基于深度学习的方法(具体是什么等论文accept之后发出来,这里仅展示最终结果)实现从II导联重建12导联心电信号。

电路设计

        除了AD8232之外,还包括主控芯片Hi3861,充放电模块,3v3降压模块,复位电路,串口等。我直接贴图:

 

 数据采集

        在采集数据时,电极位置一定要正确贴好,不然会对信号质量产生较大的影响,我自己测的和同门测的就有很大的区别。建议不采用左右手加右腿的贴法,建议使用下面这种贴法。

         AD8232采集到数据之后再结果Hi3861进行一次AD转换,再通过TCP就可以在电脑端查看到实时的额心电图波形,在这一步获得的信号还包含了各种噪声,我这里因为缩放拉伸的原因,看起来好像没什么噪声。

信号预处理

        在这里我采用的滤波算法包括平滑滤波,db8小波滤波,然后我还根据实际情况添加了巴特沃斯高通滤波器 。这是滤波后的效果:

 滤波器的代码也贴在这里了,自取。

import os
import wfdb
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.pyplot as plt
import pywt
from scipy import signal

#模块调用
import pandas as pd
import matplotlib.pyplot as plt
import math
import pywt 
# 平滑滤波函数
from scipy.signal import savgol_filter
from scipy.signal import butter, filtfilt




# 应用Savitzky-Golay滤波器

def np_move_avg(a,n,mode="same"):
    return(np.convolve(a, np.ones((n,))/n, mode=mode))
# 调用平滑滤波函数 

#封装成函数
def sgn(num):
    if(num > 0.0):
        return 1.0
    elif(num == 0.0):
        return 0.0
    else:
        return -1.0



def wavelet_noising(new_df):
    data = new_df
    data = data.T.tolist()  # 将np.ndarray()转为列表
    w = pywt.Wavelet('db8')
    # [ca3, cd3, cd2, cd1] = pywt.wavedec(data, w, level=3)  # 分解波
    [ca5, cd5, cd4, cd3, cd2, cd1] = pywt.wavedec(data, w, level=5)  # 分解波

    length1 = len(cd1)
    length0 = len(data)

    Cd1 = np.array(cd1)
    abs_cd1 = np.abs(Cd1)
    median_cd1 = np.median(abs_cd1)

    sigma = (1.0 / 0.6745) * median_cd1
    lamda = sigma * math.sqrt(2.0 * math.log(float(length0 ), math.e))
    usecoeffs = []
    usecoeffs.append(ca5)  # 向列表末尾添加对象

    #软硬阈值折中的方法
    a = 0.5

    for k in range(length1):
        if (abs(cd1[k]) >= lamda):
            cd1[k] = sgn(cd1[k]) * (abs(cd1[k]) - a * lamda)
        else:
            cd1[k] = 0.0

    length2 = len(cd2)
    for k in range(length2):
        if (abs(cd2[k]) >= lamda):
            cd2[k] = sgn(cd2[k]) * (abs(cd2[k]) - a * lamda)
        else:
            cd2[k] = 0.0

    length3 = len(cd3)
    for k in range(length3):
        if (abs(cd3[k]) >= lamda):
            cd3[k] = sgn(cd3[k]) * (abs(cd3[k]) - a * lamda)
        else:
            cd3[k] = 0.0

    length4 = len(cd4)
    for k in range(length4):
        if (abs(cd4[k]) >= lamda):
            cd4[k] = sgn(cd4[k]) * (abs(cd4[k]) - a * lamda)
        else:
            cd4[k] = 0.0

    length5 = len(cd5)
    for k in range(length5):
        if (abs(cd5[k]) >= lamda):
            cd5[k] = sgn(cd5[k]) * (abs(cd5[k]) - a * lamda)
        else:
            cd5[k] = 0.0

    usecoeffs.append(cd5)
    usecoeffs.append(cd4)
    usecoeffs.append(cd3)
    usecoeffs.append(cd2)
    usecoeffs.append(cd1)
    recoeffs = pywt.waverec(usecoeffs, w)
    return recoeffs 
def high_fliter(data, frequency=100, lowpass=1):
	#3是滤波器阶数 
	#lowpass / frequency * 2 计算机截至频率
	#[b, a]为设计好的滤波器的系统函数的系数
    [b, a] = signal.butter(3, lowpass / frequency * 2, 'highpass')
	# 将设计好的系数和待滤波的信号扔进filtfilt中返回值为滤波之后的结果
    Signal_pro = signal.filtfilt(b, a, data)
    return Signal_pro
def filtfilt1 (data,sampling_freq = 100,cutoff_freq =40):
# 定义低通滤波器参数
    order = 2  # 滤波器阶

    # 计算归一化截止频率
    nyquist_freq = 0.5 * sampling_freq
    normalized_cutoff_freq = cutoff_freq / nyquist_freq

# 使用巴特沃斯滤波器设计滤波器系数
    b, a = butter(order, normalized_cutoff_freq, btype='low', analog=False)

###用filtfilt滤波
    acc_y_filtered = filtfilt(b,a,data)
    return acc_y_filtered

         然后便是对滤波后的信号使用12导联心电信号重建算法,获取完整的12导联心电信号。实际效果如下,在把信号给心电图诊断专家分析之后表示:这个重建的12导联心电图有一定的诊断价值。 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值