Files
Feature-Extraction/ecg_calculate_areas.py
2025-10-20 22:01:18 +08:00

196 lines
7.0 KiB
Python
Raw Permalink 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 simpson
from global_var import global_var_init
cycle, fs_ecg, fs_ppg, record_name, record_name_csv, data_path = global_var_init()
from ecg_time_interval import compute_interval
(intervals_ecg, ratio_pp_tt)= compute_interval()
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 ecg_peaks_val import ecg_peaks_val
(P_peaks, Q_peaks, R_peaks, S_peaks, T_peaks,
P_onsets, P_offsets, T_onsets, T_offsets,
P_peaks_values, Q_peaks_values, R_peaks_values, S_peaks_values, T_peaks_values,
P_onsets_values, P_offsets_values, T_onsets_values, T_offsets_values,
PQ_baseline) = ecg_peaks_val()
num = len(R_peaks)
#--------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------
#----------------------------------- 计算面积 ----------------------------------------
#--------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------
# 计算每个周期相对于基线的面积
def ecg_areas_calculate():
ecg_areas = []
for i in range(num):
# 获取当前周期的起点和终点,并将其转换为整数索引
start = int(P_onsets[i])
end = int(T_offsets[i])
# print("此时的P_onsets为", P_onsets[i])
# print("此时的T_offsets为", T_offsets[i])
# 提取当前周期的ECG信号片段
signal_segment = ecg_signal[start:end]
# 提取当前周期的时间片段
time_segment = t_ecg[start:end]
# 当前周期的基线值使用p_offset点的纵坐标值
baseline_value = P_offsets_values[i]
# 创建一个与信号片段大小相同的基线片段
baseline_segment = np.full_like(signal_segment.shape, baseline_value)
# 计算相对于基线的信号
relative_signal = signal_segment - baseline_segment
# 相对于基线的信号进行积分,计算面积
area = simpson(relative_signal, time_segment)
# 将计算得到的面积添加到列表中
ecg_areas.append(area)
# # 输出所有周期的面积列表
# print("ecg_areas", ecg_areas)
# 计算P_areas
P_areas = []
for i in range(num):
# 获取当前周期的起点和终点,并将其转换为整数索引
start = int(P_onsets[i])
end = int(P_offsets[i])
# 提取当前周期的ECG信号片段
signal_segment = ecg_signal[start:end]
# 提取当前周期的时间片段
time_segment = t_ecg[start:end]
# 当前周期的基线值使用p_offset点的纵坐标值
baseline_value = P_offsets_values[i]
# 创建一个与信号片段大小相同的基线片段
baseline_segment = np.full_like(signal_segment.shape, baseline_value)
# 计算相对于基线的信号
relative_signal = signal_segment - baseline_segment
# 相对于基线的信号进行积分,计算面积
area = simpson(relative_signal, time_segment)
# 将计算得到的面积添加到列表中
P_areas.append(area)
# # 输出所有周期的面积列表
# print("P_areas:", P_areas)
# 计算T_areas
T_areas = []
for i in range(num):
# 获取当前周期的起点和终点,并将其转换为整数索引
start = int(T_onsets[i])
end = int(T_offsets[i])
# print("此时的T_onsets为", T_onsets[i])
# print("此时的T_offsets为", T_offsets[i])
# 提取当前周期的ECG信号片段
signal_segment = ecg_signal[start:end]
# 提取当前周期的时间片段
time_segment = t_ecg[start:end]
# 当前周期的基线值使用T_offset点的纵坐标值
baseline_value = T_offsets_values[i]
# 创建一个与信号片段大小相同的基线片段
baseline_segment = np.full_like(signal_segment.shape, baseline_value)
# 计算相对于基线的信号
relative_signal = signal_segment - baseline_segment
# 相对于基线的信号进行积分,计算面积
area = simpson(relative_signal, time_segment)
# 将计算得到的面积添加到列表中
T_areas.append(area)
# # 输出所有周期的面积列表
# print("T_areas:", T_areas)
# 计算QRS_areas
QRS_areas = []
for i in range(num):
# 获取当前周期的起点和终点,并将其转换为整数索引
start = int(Q_peaks[i])
end = int(S_peaks[i])
# 提取当前周期的ECG信号片段
signal_segment = ecg_signal[start:end]
# 提取当前周期的时间片段
time_segment = t_ecg[start:end]
# 当前周期的基线值使用S_peaks点的纵坐标值
baseline_value = S_peaks_values[i]
# 创建一个与信号片段大小相同的基线片段
baseline_segment = np.full_like(signal_segment.shape, baseline_value)
# 计算相对于基线的信号
relative_signal = signal_segment - baseline_segment
# 相对于基线的信号进行积分,计算面积
area = simpson(relative_signal, time_segment)
# 将计算得到的面积添加到列表中
QRS_areas.append(area)
# # 输出所有周期的面积列表
# print("QRS_areas:", QRS_areas)
# values = [ ecg_areas, P_areas, T_areas, QRS_areas]
# # 遍历并打印每个列表的长度
# for idx, values in enumerate(values):
# print(f"List {idx+1}: {len(values)}")
return ecg_areas, P_areas, T_areas, QRS_areas
if __name__ == "__main__":
ecg_areas_calculate()