196 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | ||
| 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() |