53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
import utils
|
||
import pandas as pd
|
||
import numpy as np
|
||
from scipy import signal
|
||
|
||
def normalize_resp_signal_by_segment(resp_signal: np.ndarray, resp_fs, movement_mask, enable_list):
|
||
# 根据呼吸信号的幅值改变区间,对每段进行Z-Score标准化
|
||
normalized_resp_signal = np.zeros_like(resp_signal)
|
||
# 全部填成nan
|
||
normalized_resp_signal[:] = np.nan
|
||
|
||
resp_signal_no_movement = resp_signal.copy()
|
||
|
||
|
||
resp_signal_no_movement[np.array(movement_mask == 1).repeat(resp_fs)] = np.nan
|
||
|
||
|
||
for i in range(len(enable_list)):
|
||
enable_start = enable_list[i][0] * resp_fs
|
||
enable_end = enable_list[i][1] * resp_fs
|
||
segment = resp_signal_no_movement[enable_start:enable_end]
|
||
|
||
# print(f"Normalizing segment {i+1}/{len(enable_list)}: start={enable_start}, end={enable_end}, length={len(segment)}")
|
||
|
||
segment_mean = np.nanmean(segment)
|
||
segment_std = np.nanstd(segment)
|
||
if segment_std == 0:
|
||
raise ValueError(f"segment_std is zero! segment_start: {enable_start}, segment_end: {enable_end}")
|
||
|
||
# 同下一个enable区间的体动一起进行标准化
|
||
if i <= len(enable_list) - 2:
|
||
enable_end = enable_list[i + 1][0] * resp_fs
|
||
raw_segment = resp_signal[enable_start:enable_end]
|
||
normalized_resp_signal[enable_start:enable_end] = (raw_segment - segment_mean) / segment_std
|
||
|
||
|
||
#如果enable区间不从0开始,则将前面的部分也进行标准化
|
||
if enable_list[0][0] > 0:
|
||
new_enable_start = 0
|
||
enable_start = enable_list[0][0] * resp_fs
|
||
enable_end = enable_list[0][1] * resp_fs
|
||
segment = resp_signal_no_movement[enable_start:enable_end]
|
||
|
||
segment_mean = np.nanmean(segment)
|
||
segment_std = np.nanstd(segment)
|
||
if segment_std == 0:
|
||
raise ValueError(f"segment_std is zero! segment_start: {enable_start}, segment_end: {enable_end}")
|
||
|
||
raw_segment = resp_signal[new_enable_start:enable_start]
|
||
normalized_resp_signal[new_enable_start:enable_start] = (raw_segment - segment_mean) / segment_std
|
||
|
||
return normalized_resp_signal
|