用Python实现查心率

本文介绍了一个Python项目,用于在PyCharm中利用matplotlib和均值滤波技术分析光电容积脉搏波(PPG)信号数据。通过对data.txt文件中特定数据段的处理,提取并滤波信号,然后计算平均心率。代码首先根据学号确定数据起点,读取指定数量的数据点,进行均值滤波,并在图形上标记出波峰和波谷,从而确定心跳周期。最终,通过计算平均心率并展示结果图表,完成心率分析任务。

一、
期末Python老师要求做一个项目,内容是在Pycharm中通过matplotlib模块测心率。
二、
data.txt中的数据为某人的光电容积脉搏波(PPG)信号的采样值,请按照以下要求进行分析:

  1. 数据分析的起始位置为:
    取学号最后两位减一后乘以100(比如最后两位为26,则从(26-1)100开始)作为初始处理点,记为k,向后分析300行(即300个数据点)。
    提示:我给同学们的数据每一行有6个字符(5个数字加一个换行符),可以使用seek(k*6)快速定位。
  2. 绘制出所分析数据的图形,包括原始波形和进行均值滤波之后的波形,作为两个子图放在同一幅图中;在进行均值滤波之后的波形图中找出所分析数据段内全部PPG信号的完整周期,即在波峰或波谷处用明显的标识标出。
  3. 已知数据采集速率为40采样点/秒,请求出你所分析的300个数据点内所有完整心跳周期的平均心率,单位为次/分,精确到小数点后1位。
    提示:若求出某个周期内的数据点数为n,则该周期对应的心率为:40 * 60 / n(次/分)
  4. 最终提交内容为:
    1) 要求2所生成的图片,图片名称为你所求出的平均心率,例如:平均心率为72.6bpm;
    图片效果为(标出波峰或波谷其中之一即可):
    2) 完整代码的py文档,命名为学号+姓名。
    在这里插入图片描述

三、下面是详细代码:

import numpy as np
import matplotlib.pyplot as plt

SN = '19560640837'  # 学号
Name = '阿豪'  # 姓名
raw_list = []  # 存放原始数据列表
dpi = 200  # 图片分辨率
start_pos = ((int(SN[-2:]) - 1) * 100) * 6
data_limit = 300  # 分析数据量
filter_window = 8  # 滤波窗口大小
myfilter = []  # 自建均值滤波器
smooth_list = []  # 存放滤波后数据列表
print(start_pos)
with open('F:\学习\Python/data.txt', 'r') as f1:
    tail = f1.seek(0, 2)
    f1.seek(start_pos)
    while f1.tell() < tail:
        raw_data = int(f1.readline())
        if len(raw_list) == data_limit:
            break
        else:
            if len(myfilter) < filter_window:
                myfilter.append(raw_data)
            else:
                smooth_data = np.mean(myfilter)
                myfilter.pop(0)
                myfilter.append(raw_data)
                raw_list.append(raw_data)
                smooth_list.append(smooth_data)
slip_max = []
slip_min = []
size = 9
x1 = []
x2 = []
for i in range(0, len(smooth_list) - size + 1):
    if smooth_list[i + 4] == max(smooth_list[i:i + size]):
        slip_max.append(max(smooth_list[i:i + size]))
        x1.append(i)
    if smooth_list[i + 4] == min(smooth_list[i:i + size]):
        slip_min.append(min(smooth_list[i:i + size]))
        x2.append(i)
t = []
for i in range(0, len(x1)-1):
    t.append(x1[i+1]-x1[i])
#平均心率 40 * 60 / n(次 / 分)
average = (40/np.mean(t))*60
print(average)
print(smooth_list)
print(raw_list)
x = range(len(raw_list))
plt.figure(dpi=dpi)
plt.subplot(211)
plt.plot(x, raw_list)
plt.xlabel('x-采样点', fontproperties='SimHei')
plt.ylabel('y-幅值', fontproperties='SimHei')
plt.title('原始波形', fontproperties='STLITI', fontsize=24)
plt.subplot(212)
plt.plot(x, smooth_list)
plt.xlabel('x-采样点', fontproperties='SimHei')
plt.ylabel('y-幅值', fontproperties='SimHei')
plt.title('均值滤波波形', fontproperties='STLITI', fontsize=24)
plt.scatter(x1, slip_max, marker='*', color='c')
plt.scatter(x2, slip_min, marker='.', color='r')
plt.show()

四、最后运行代码,显示心率波峰图

在这里插入图片描述
下面给大家分享百度网盘和阿里云盘的链接,供大家免费下载使用。
百度网盘-测心率
阿里云盘-测心率
(百度网盘提取码hqjd)

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值