一、 期末Python老师要求做一个项目,内容是在Pycharm中通过matplotlib模块测心率。 二、 data.txt中的数据为某人的光电容积脉搏波(PPG)信号的采样值,请按照以下要求进行分析:
- 数据分析的起始位置为:
取学号最后两位减一后乘以100(比如最后两位为26,则从(26-1)100开始)作为初始处理点,记为k,向后分析300行(即300个数据点)。 提示:我给同学们的数据每一行有6个字符(5个数字加一个换行符),可以使用seek(k*6)快速定位。 - 绘制出所分析数据的图形,包括原始波形和进行均值滤波之后的波形,作为两个子图放在同一幅图中;在进行均值滤波之后的波形图中找出所分析数据段内全部PPG信号的完整周期,即在波峰或波谷处用明显的标识标出。
- 已知数据采集速率为40采样点/秒,请求出你所分析的300个数据点内所有完整心跳周期的平均心率,单位为次/分,精确到小数点后1位。
提示:若求出某个周期内的数据点数为n,则该周期对应的心率为:40 * 60 / n(次/分) - 最终提交内容为:
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])
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)
|