Files
Feature-Extraction/ppg_areas.py

125 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
from scipy.integrate import simps
from processing import processing
(signal_dwt , waves_dwt , rpeaks , ecg_signal,
signal, signal.v, signal.fs, rows_to_extract, t_ecg, t_ppg,
on_column_list, on_column_list_toArea, on_values, on_values_toArea,
sp_column_list, sp_values, dn_column_list, dn_values, dp_column_list,
dp_values, u_column_list, u_column_list_toArea, u_values, u_values_toArea,
v_column_list, v_values, w_column_list, w_values, a_column_list, a_column_list_toArea,
a_values, a_values_toArea, b_column_list, b_values, c_column_list, c_values,
e_column_list, e_values, f_column_list, f_values,
signal.ppg, signal.vpg, signal.apg, signal.jpg) = processing()
from ppg_peaks_val import ppg_peaks_val
(on, on_toArea, sp, dn, dp,
on_values, on_toArea_values, sp_values, dn_values, dp_values,
u, u_toArea, v, w,
u_values, u_toArea_values, v_values, w_values,
a, a_toArea, b, c, e, f,
a_values, a_toArea_values, b_values, c_values, e_values, f_values) = ppg_peaks_val()
def ppg_areas():
# 计算'on'波的纵坐标平均值作为基线
baseline_on = np.mean(on_toArea_values)
# 初始化'on'波之间周期的面积列表
ppg_areas_values = []
# 遍历'on'波的索引,计算每个周期的面积
for i in range(len(on_toArea) - 1):
start_idx = on_toArea[i]
end_idx = on_toArea[i + 1]
# 提取当前周期的PPG信号
current_ppg_segment = signal.ppg[start_idx:end_idx]
# 创建时间向量
t_segment = t_ppg[start_idx:end_idx]
# 计算相对于基线的PPG信号
baseline_segment = np.full_like(current_ppg_segment, baseline_on) # 创建一个与 current_ppg_segment 相同长度的数组,所有值都等于 baseline_on
diff_signal = current_ppg_segment - baseline_segment
# 使用辛普森法计算面积
if len(diff_signal) == 0 or len(t_segment) == 0:
continue # 跳过空的信号或时间片段
area = simps(diff_signal, t_segment)
ppg_areas_values.append(area)
# print("ppg_areas:",ppg_areas_values)
# 初始化'u'波之间周期的面积列表
vpg_areas_values = []
# 遍历'u'波的索引计算每个周期的VPG信号相对于X轴的面积
for i in range(len(u_toArea) - 1):
start_idx = u_toArea[i]
end_idx = u_toArea[i + 1]
# 提取当前周期的VPG信号
current_vpg_segment = signal.vpg[start_idx:end_idx]
# 创建时间向量
t_segment = t_ppg[start_idx:end_idx]
# 使用辛普森法计算面积相对于X轴即y=0线
area = simps(current_vpg_segment, t_segment)
vpg_areas_values.append(area)
# print("vpg_areas:",vpg_areas_values)
# 初始化'a'波之间周期的面积列表
apg_areas_values = []
# 遍历'a'波的索引计算每个周期的APG信号相对于X轴的面积
for i in range(len(a_toArea) - 1):
start_idx = a_toArea[i]
end_idx = a_toArea[i + 1]
# 提取当前周期的APG信号
current_apg_segment = signal.apg[start_idx:end_idx]
# 创建时间向量
t_segment = t_ppg[start_idx:end_idx]
# 使用辛普森法计算面积相对于X轴即y=0线
area = simps(current_apg_segment, t_segment)
apg_areas_values.append(area)
# print("apg_areas:",apg_areas_values)
# 定义包含所有区域值的字典
areas_values = {
"ppg_areas": ppg_areas_values,
"vpg_areas": vpg_areas_values,
"apg_areas": apg_areas_values,
}
# 计算比值并存储在新字典中
ratios_areas = {}
for start_label, start_values in areas_values.items():
for end_label, end_values in areas_values.items():
if start_label != end_label:
ratio_label = f"{start_label}/{end_label}"
# 计算对应位置的比值
ratios = [end_val / start_val for start_val, end_val in zip(start_values, end_values)]
ratios_areas[ratio_label] = ratios
# 计算差值并存储在新字典中
diffs_areas = {}
for start_label, start_values in areas_values.items():
for end_label, end_values in areas_values.items():
if start_label != end_label:
diff_label = f"{start_label}-{end_label}"
# 计算对应位置的差值
diffs = [end_val - start_val for start_val, end_val in zip(start_values, end_values)]
diffs_areas[diff_label] = diffs
return areas_values, ratios_areas, diffs_areas
if __name__ == "__main__":
ppg_areas()