125 lines
4.6 KiB
Python
125 lines
4.6 KiB
Python
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()
|