基于Python的心率分析

一、简介

本篇文章主要讲解心率信号的快速傅里叶变化、滤波器的实现和最后心率的获取。

  1. 环境:anaconda(Spyder)
  2. 版本:Python3.6.0
  3. 数据获取网址:https://archive.physionet.org/cgi-bin/atm/ATM
  4. 参考:https://docs.huihoo.com/scipy/scipy-zh-cn/filters.html#firiir

二、心率波形显示

在PhysioBank ATM找到相关的心电信号数据,保存为Excel或者mat文件,读取相关数据,通过plot函数库进行绘图。

import pylab as pl
import scipy.io as sio
import numpy as np

data = sio.loadmat('11950_02m.mat')
data = data['val']
data = data[1]

#中文显示
pl.rcParams['font.sans-serif']=['SimHei']
pl.rcParams['axes.unicode_minus'] = False

pl.legend()
pl.xlabel(u"时间")
pl.ylabel(u"幅值")
pl.title(u"心电信号")
pl.plot(data)

在这里插入图片描述

三、傅里叶变换

https://www.jianshu.com/p/994050a42724
这篇文章对时域、频域之间的关系进行的详细的讲解,有兴趣的可以了解一下,有助于你对傅里叶变换的理解。
下面我们对心电信号进行傅里叶变换,可以得到心电信号在频域中的相关分布情况

sampling_rate = 250
fft_size = 250
t = np.arange(0,1.0,1.0/sampling_rate)
xs = data[:fft_size]
xs = xs.flatten()#将列转换为行,重要

xf = np.fft.rfft(xs)/fft_size
freqs = np.linspace(0,sampling_rate/2,fft_size/2+1)
xfp = 20*np.log10(np.clip(np.abs(xf),1e-20,1e100))

这里调用的是numpy函数库的fft函数,xs参数必须为行向量数组,否则得到错误的数据。
在这里插入图片描述
由傅里叶变换之后的波形图,我们可以看出在10Hz~30Hz这个区间的波形比较平缓。
接下来分析一下心率波形的组成
在这里插入图片描述
我们一般都是通过获取R波的个数来得出心率的。R波的信号成分在20Hz以上,T波成分一般在10Hz以下。(这里是网上的总结,不知怎么得来的,希望路过的大侠,帮忙解答一下)
这里与傅里叶变换之后的波形基本吻合。

四、滤波器的实现

1、低通滤波器

先实现一个低通滤波器,这里调用remez函数实现一个截止频率为10Hz的低通滤波器。
remez()
参数1:滤波器的长度,生成滤波参数的个数;
参数2:通带和截带;截止频率/采样率,本文中为10/250=0.04;
参数3:增益
调用freqz函数计算频率响应

import scipy.signal as signal

low = signal.remez(65,(0,0.03,0.04,0.50),(1,0.01))
w,h = signal.freqz(low,1)

pl.plot(w/2/np.pi,20*np.log10(np.abs(h)))

可以得到如下的频率响应曲线图
在这里插入图片描述
接下来调用lfilter函数创建FIR低通滤波器,导入一秒的心电数据。
lfilter()
参数1:bandb为调用remez函数生成的滤波器参数;
参数2:当banda为1时表示创建FIR滤波器;
参数3:导入的数据。

banda=1
bandb=np.array([0.0626444,-0.00591505,-0.00644119,-0.00733662,-0.00858695,-0.0100849,-0.0117168,-0.0133311,-0.0148219,-0.0160526,-0.0169183,-0.017282,-0.0170576,-0.0161446,-0.0145,-0.0120671,-0.00885165,-0.0048518,-0.000134043,0.00524337,0.0111587,0.0175071,0.0241233,0.0308625,0.0375254,0.0439567,0.0499621,0.0553981,0.0600621,0.0638317,0.066553,0.0683189,0.0789989,0.0683189,0.066553,0.0638317,0.0600621,0.0553981,0.0499621,0.0439567,0.0375254,0.0308625,0.0241233,0.0175071,0.0111587,0.00524337,-0.000134043,-0.0048518,-0.00885165,-0.0120671,-0.0145,-0.0161446,-0.0170576,-0.017282,-0.0169183,-0.0160526,-0.0148219,-0.0133311,-0.0117168,-0.0100849,-0.00858695,-0.00733662,-0.00644119,-0.00591505,0.0626444])

deBandFilterData = signal.lfilter(bandb,banda, xs)

图1为原始数据,图2为经过低通滤波后的数据。
在这里插入图片描述
可以看出R波被完全滤除,保留了T波。

2、带通滤波器

这里调用remez函数实现通带为10Hz~20Hz的带通滤波器。

low = signal.remez(33,(0,0.03,0.04,0.50),(0.01,1))
high = signal.remez(33,(0,0.1,0.12,0.50),(1,0.01))
DD = np.convolve(low,high)
w,h = signal.freqz(DD ,1)
pl.plot(w/2/np.pi,20*np.log10(np.abs(h)))

在这里插入图片描述

banda = 1
bandb=np.array([-0.00802303,-7.24425e-05,0.00152734,0.00348844,0.00495073,0.00515223,0.00377258,0.00122724,-0.00140695,-0.00274613,-0.00159154,0.0025182,0.00897934,0.0161445,0.0218003,0.0238291,-0.0429597,-0.00113136,-0.00286913,-0.00207864,-0.0025121,-0.00886799,-0.0243103,-0.0478642,-0.0738221,-0.0930648,-0.0958544,-0.0757677,-0.0329661,0.0246284,0.0831973,0.127074,0.138074,0.127074,0.0831973,0.0246284,-0.0329661,-0.0757677,-0.0958544,-0.0930648,-0.0738221,-0.0478642,-0.0243103,-0.00886799,-0.0025121,-0.00207864,-0.00286913,-0.00113136,-0.0429597,0.0238291,0.0218003,0.0161445,0.00897934,0.0025182,-0.00159154,-0.00274613,-0.00140695,0.00122724,0.00377258,0.00515223,0.00495073,0.00348844,0.00152734,-7.24425e-05,-0.00802303])

deBandFilterData = signal.lfilter(bandb,banda, xs)

在这里插入图片描述
经过带通滤波器之后,得到的波形,我们可以看出保存了R波,滤掉了T波。

五、心率的计算

得到滤波信号之后,我们来看一下心率的计算 ,这里主要是统计R波的个数。

### 回答1: Python基于PPG信号的心率分析系统是一种利用Python编程语言开发的系统,它可以通过PPG信号来分析人的心率。PPG信号是一种反映心脏活动的生理信号,通过对PPG信号的采集和处理,可以得到人的心率信息。该系统可以实时采集PPG信号,并对其进行滤波、峰值检测等处理,最终得到人的心率。该系统可以应用于医疗、健康管理等领域。 ### 回答2: 随着现代人生活节奏的加快,心脏病等心脑血管疾病已经成为我国社会公共卫生问题之一。心率变异性(HRV)是指心率在不同时间间隔下的变化。它是自主神经系统调节心率的一种反映,既是生理学也是医学上重要的指标之一。近年来,随着生物医学工程领域的不断发展,基于PPG(photoplethysmography)信号的心率分析系统逐渐得到了广泛应用。本文将讨论Python语言在基于PPG信号的心率分析系统方面的实践和应用。 PPG信号通常是通过光电测量技术采集的。光电传感器将光转换为电信号并转化为由动脉搏动引起的变化波形。这种波形包含的信息可以用来获得心率心律不齐和血压等鲜明的生理特征。 为了实现基于PPG信号的心率分析系统,Python语言可以通过使用相关的Python库和软件来协助开发人员处理这些数据,例如Numpy、Scipy、Matplotlib、Pandas和Scikit-Learn等。Numpy可以用来处理和处理数值数据,Scipy可以用来计算信号特征和基本信号处理,Matplotlib用于绘制像,Pandas用于数据集更易读性,而Scikit-Learn用于构建机器学习模型。 基于PPG信号的心率分析系统的设计和开发需要遵循以下几个步骤: 1. 数据收集:通过光电测量技术,并通过Python获取收集数据。收集到的数据可能包括心率、血氧饱和度和呼吸率等指标。 2. 数据预处理:将收集的数据进行预处理,例如去除噪声、滤波和信号矫正等。使用Numpy和Scipy等Python库可以方便的实现这些功能。 3. 特征提取:提取PPG信号的心率变异性特征,例如时间域、频域和非线性动力学特征。 4. 视觉化:使用Matplotlib库对收集的数据进行可视化分析,例如绘制波形心率曲线和统计分析表等。 5. 机器学习:将预处理后的数据输入到机器学习模型中,进行模型训练和预测,包括分类、聚类和回归等有监督和无监督算法模型。 6. 应用:将模型应用于实际场景,例如健康管理、老年人照护、体育训练和心理学研究等。 总之,Python语言在基于PPG信号的心率分析系统方面有很大的潜力和应用价值。开发人员可以使用相关的Python库和软件来简化和加速开发过程,并可以将心率分析模型应用于更广泛的生物医学和健康管理领域。 ### 回答3: Python是一种高级编程语言,非常适合用于开发心率分析系统。这些系统利用ppg信号来测量心率,它是一种无创的技术,可以通过脉搏波来测量心率。这种技术的优点在于无需通过穿刺、贴电极等方式对人体进行治疗,因此安全性和便利性都非常高。 Python语言在这方面的应用非常广泛,并且是一个可靠的工具,可以帮助程序员开发出高质量的心率分析系统。使用Python进行心率分析,程序员可以很容易地将ppg信号传输到计算机上,并利用Python提供的数据处理工具和算法来分析这些数据。 通过分析ppg信号,心率分析系统可以实时监测心率心率变异性,这对于诊断和治疗许多心血管疾病非常有用。一些基于Python的工具和库,例如Numpy和Scipy,可以帮助程序员对信号进行快速处理,并通过不同的算法和模型来确定心率变异性及其重要指标。此外,Matplotlib等数据可视化库可以将分析结果以形方式表示,使医生和病人能够更好地理解数据并做出相应的决策。 总之,Python基于ppg信号的心率分析系统是一种非常有用和现代化的技术,它不仅可以为医生和病人提供可靠的测量结果,还可以提高诊断效率,减少错误率,帮助人们更好地管理和预防心血管疾病。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值