帮我写个Python程序 从采集到的PPG信号文件中导入数据,已知采样频率为40Hz。 2. 计算所采集到的全部数据的持续时间并告知用户,然后用户可以任意指定某个时间段进行心率分析(提示:用户输入分析时间段为x1分y1秒到x2分y2秒,则开始分析位置为(x1*60+y1)406,分析数据点数量为((x2-x1)*60+(y2-y1))*40,注意保证程序健壮性,要对用户输入的分析时间是否合理进行判断)。 1) 分析该时间段内所有完整心跳周期的平均心率并打印出来,单位为次/分,精确到小数点后1位。 2) 绘制出所分析数据的图形,包括原始波形和进行均值滤波之后的波形,作为两个子图放在同一figure中;在进行均值滤波之后的波形图中找出所分析时间段内全部PPG信号的完整周期,即在波峰或波谷处用明显的标识标出
时间: 2024-03-26 12:35:48 浏览: 182
heartrate_analysis_python:适用于PPG和ECG信号的Python心率分析软件包
好的,以下是代码实现,注意代码中的注释:
```python
import numpy as np
import matplotlib.pyplot as plt
# 从PPG信号文件中导入数据
def import_data(file_name):
data = np.loadtxt(file_name, dtype=float, delimiter=',')
return data
# 计算数据持续时间
def calc_duration(data, fs):
duration = len(data) / fs
return duration
# 计算心率
def calc_heart_rate(data, fs, start_time, end_time):
# 将开始时间和结束时间转换成数据点位置
start_pos = int(start_time * 60 + end_time) * fs
end_pos = int(end_time * 60 + end_time) * fs
# 判断输入的时间是否合理
if start_pos < 0 or end_pos > len(data):
print("输入的时间段不合理!")
return
# 计算心率
heart_rates = []
for i in range(start_pos, end_pos):
if i + fs < len(data):
# 计算1秒内的数据的均值
mean_value = np.mean(data[i:i+fs])
# 判断是否出现心跳周期
if data[i+fs] > mean_value and data[i+fs-1] < mean_value:
heart_rate = 60 / ((i+fs) / fs - start_time*60 - end_time)
heart_rates.append(heart_rate)
# 计算平均心率
avg_heart_rate = np.mean(heart_rates)
print("所分析时间段内的平均心率为:%.1f 次/分" % avg_heart_rate)
# 绘制波形图
def plot_waveform(data, fs, start_time, end_time):
# 将开始时间和结束时间转换成数据点位置
start_pos = int(start_time * 60 + end_time) * fs
end_pos = int(end_time * 60 + end_time) * fs
# 判断输入的时间是否合理
if start_pos < 0 or end_pos > len(data):
print("输入的时间段不合理!")
return
# 原始波形
plt.subplot(211)
plt.plot(data[start_pos:end_pos])
plt.title("原始波形")
plt.xlabel("时间(秒)")
plt.ylabel("PPG幅值")
# 均值滤波后的波形
plt.subplot(212)
filtered_data = np.convolve(data, np.ones((10,))/10, mode='valid')
plt.plot(filtered_data[start_pos:end_pos])
plt.title("均值滤波后的波形")
plt.xlabel("时间(秒)")
plt.ylabel("PPG幅值")
# 查找心跳周期并标记
heart_rates = []
for i in range(start_pos, end_pos):
if i + fs < len(filtered_data):
# 计算1秒内的数据的均值
mean_value = np.mean(filtered_data[i:i+fs])
# 判断是否出现心跳周期
if filtered_data[i+fs] > mean_value and filtered_data[i+fs-1] < mean_value:
plt.annotate("心跳周期", xy=(i+fs-start_pos, filtered_data[i+fs]), xytext=(i+fs-start_pos, filtered_data[i+fs]+0.1), arrowprops=dict(facecolor='red', shrink=0.05))
plt.show()
# 主函数
if __name__ == '__main__':
# 导入数据
data = import_data('ppg_signal.txt')
# 计算持续时间
duration = calc_duration(data, 40)
print("PPG信号的持续时间为:%.1f 秒" % duration)
# 计算心率并绘制波形图
start_time = float(input("请输入开始时间(分):"))
start_second = float(input("请输入开始时间(秒):"))
end_time = float(input("请输入结束时间(分):"))
end_second = float(input("请输入结束时间(秒):"))
calc_heart_rate(data, 40, start_time, start_second, end_time, end_second)
plot_waveform(data, 40, start_time, start_second, end_time, end_second)
```
你可以将上述代码保存为一个名为 `ppg_analysis.py` 的文件,然后将采集到的PPG信号文件保存为 `ppg_signal.txt` 放在同一目录下,然后在终端中进入该目录,运行以下命令:
```
python ppg_analysis.py
```
接着按照提示输入开始时间和结束时间,即可进行心率分析并绘制波形图。
阅读全文