59 lines
2.7 KiB
Python
59 lines
2.7 KiB
Python
|
||
def check_split(event_mask, current_start, window_sec, verbose=False):
|
||
# 检查当前窗口是否包含在禁用区间或低幅值区间内
|
||
resp_movement_mask = event_mask["Resp_Movement_Label"][current_start : current_start + window_sec]
|
||
resp_low_amp_mask = event_mask["Resp_LowAmp_Label"][current_start : current_start + window_sec]
|
||
|
||
# 体动与低幅值进行与计算
|
||
low_move_mask = resp_movement_mask | resp_low_amp_mask
|
||
if low_move_mask.sum() > 2/3 * window_sec:
|
||
if verbose:
|
||
print(f"{current_start}-{current_start + window_sec} rejected due to movement/low amplitude mask more than 2/3")
|
||
return False
|
||
return True
|
||
|
||
|
||
def resp_split(dataset_config, event_mask, event_list, verbose=False):
|
||
# 提取体动区间和呼吸低幅值区间
|
||
enable_list = event_list["EnableSegment"]
|
||
disable_list = event_list["DisableSegment"]
|
||
|
||
# 读取数据集配置
|
||
window_sec = dataset_config["window_sec"]
|
||
stride_sec = dataset_config["stride_sec"]
|
||
|
||
segment_list = []
|
||
disable_segment_list = []
|
||
|
||
# 遍历每个enable区间, 如果最后一个窗口不足stride的1/2,则舍弃,否则以enable_end为结尾截取一个窗口
|
||
for enable_start, enable_end in enable_list:
|
||
current_start = enable_start
|
||
while current_start + window_sec <= enable_end:
|
||
if check_split(event_mask, current_start, window_sec, verbose):
|
||
segment_list.append((current_start, current_start + window_sec))
|
||
else:
|
||
disable_segment_list.append((current_start, current_start + window_sec))
|
||
current_start += stride_sec
|
||
# 检查最后一个窗口是否需要添加
|
||
if (enable_end - current_start >= stride_sec / 2) and (enable_end - current_start >= window_sec):
|
||
if check_split(event_mask, enable_end - window_sec, window_sec, verbose):
|
||
segment_list.append((enable_end - window_sec, enable_end))
|
||
else:
|
||
disable_segment_list.append((enable_end - window_sec, enable_end))
|
||
|
||
# 遍历每个disable区间, 如果最后一个窗口不足stride的1/2,则舍弃,否则以disable_end为结尾截取一个窗口
|
||
for disable_start, disable_end in disable_list:
|
||
current_start = disable_start
|
||
while current_start + window_sec <= disable_end:
|
||
disable_segment_list.append((current_start, current_start + window_sec))
|
||
current_start += stride_sec
|
||
# 检查最后一个窗口是否需要添加
|
||
if (disable_end - current_start >= stride_sec / 2) and (disable_end - current_start >= window_sec):
|
||
disable_segment_list.append((disable_end - window_sec, disable_end))
|
||
|
||
|
||
return segment_list, disable_segment_list
|
||
|
||
|
||
|