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