From 43adc6fb42c51022d232407341ab32144003db2d Mon Sep 17 00:00:00 2001 From: lizhao Date: Wed, 10 Jun 2026 15:18:22 +0800 Subject: [PATCH] update Decoder --- Decoder.py | 6 +++--- Zmq/zmqServer.py | 25 ++++++++++++++++++++----- upperHost_stimmock/MI_headless.py | 4 ++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Decoder.py b/Decoder.py index 7362a54..cde5d7c 100644 --- a/Decoder.py +++ b/Decoder.py @@ -112,8 +112,8 @@ class Decoder_main(threading.Thread): elif decoder_class == 'mi' or decoder_class == 'ma': self.zmqServer.interval_init(decoder_class) self.n_chan = 21 - self.interval_epoch = ast.literal_eval(IniRead('system', 'MI_IntervalEpoch')) - self.sample_length = round(self.interval_epoch[1] - self.interval_epoch[0], 6) # 解码数据长度2s,# 精确到小数点后6位 + self.interval_epoch = ast.literal_eval(IniRead('system', 'MI_IntervalEpoch')) # [0.5, 4.5] + self.sample_length = round(self.interval_epoch[1] - self.interval_epoch[0], 6) # 解码数据长度4s,# 精确到小数点后6位 self.single_train = 40 # 单类别数量 self.num_target = 2 # 分类目标数目 @@ -370,7 +370,7 @@ class Decoder_main(threading.Thread): '''训练阶段采集数据''' if self.zmqServer.state_mode == 'train' and self.train_started == False: # 训练状态 if self.zmqServer.epoch_finished and self.zmqServer.paradigmBuffer.GetDataLenCount() >= \ - self.interval_epoch[1] + self.zmqServer.event_inner_idx: + self.zmqServer.train_epoch[1] + self.zmqServer.event_inner_idx: self.currentLabel = self.zmqServer.currentLabel # 同步当前标签 algo_log(f"训练队列数据:{self.zmqServer.paradigmBuffer.GetDataLenCount()}", level="DEBUG") originalTrial = self.zmqServer.paradigmBuffer.get_MIData() # 取出MI导联数据 diff --git a/Zmq/zmqServer.py b/Zmq/zmqServer.py index 45ef9ef..5dea432 100644 --- a/Zmq/zmqServer.py +++ b/Zmq/zmqServer.py @@ -96,6 +96,7 @@ class zmqServer(threading.Thread): self.pack_contain_event = False self.event_inner_idx = -1 self.interval_inited = False + self.last_epoch_finish_time = None def reset_state(self): """清空采集器状态和缓存数据""" @@ -119,11 +120,11 @@ class zmqServer(threading.Thread): self.train_latency = (self.train_epoch[1] + 0.1 * self.device_info['sample_rate']) // 5 #120包 600个点 elif decoder_class == 'mi': - interval_epoch = ast.literal_eval(IniRead('system', 'MI_IntervalEpoch')) - self.interval_epoch = [int(i * self.device_info['sample_rate']) for i in interval_epoch] + interval_epoch = ast.literal_eval(IniRead('system', 'MI_IntervalEpoch')) # [0.5, 4.5] + self.interval_epoch = [int(i * self.device_info['sample_rate']) for i in interval_epoch] #[125, 1125] self.train_epoch = self.interval_epoch.copy() - self.latency = self.interval_epoch[1] // 5 - self.train_latency = self.latency + self.latency = self.interval_epoch[1] // 5 #225 + self.train_latency = self.latency #225 algo_log(f"时间窗初始化完成: {interval_epoch}", level="INFO") self.count_events: Dict[str, int] = {} @@ -325,8 +326,22 @@ class zmqServer(threading.Thread): if self.pack_contain_event: self.paradigmBuffer.resetAllPara() self.paradigmBuffer.appendBuffer(data_np) + if self.epoch_finished: - algo_log('Epoch采集完成: ' + datetime.datetime.now().strftime('%H:%M:%S.%f')[:-3], level="DEBUG") + now = datetime.datetime.now() + time_diff_str = "" + # 计算与上一次Epoch完成的时间差 + if self.last_epoch_finish_time is not None: + # 时间差 单位:秒,保留3位小数 + delta_seconds = (now - self.last_epoch_finish_time).total_seconds() + time_diff_str = f" | 与上一次间隔: {delta_seconds:.3f} s" + + # 拼接日志,增加时间差信息 + log_msg = f"Epoch采集完成: {now.strftime('%H:%M:%S.%f')[:-3]}{time_diff_str}" + algo_log(log_msg, level="DEBUG") + + # 更新上一次Epoch完成时间为当前时间 + self.last_epoch_finish_time = now else: self.paradigmBuffer.appendBuffer(data_np) diff --git a/upperHost_stimmock/MI_headless.py b/upperHost_stimmock/MI_headless.py index 92aa669..4609f81 100644 --- a/upperHost_stimmock/MI_headless.py +++ b/upperHost_stimmock/MI_headless.py @@ -172,8 +172,8 @@ def run_headless(): client.send_data('decoderClass', 'mi') # MI_IntervalEpoch = [0.5, 4.5],trial时长 = 4.5-0.5 = 4.0s - _mi_iv = ast.literal_eval(IniRead('system', 'MI_IntervalEpoch')) - _trial_sec = float(_mi_iv[1] - _mi_iv[0]) + _mi_iv = ast.literal_eval(IniRead('system', 'MI_IntervalEpoch')) # [0.5, 4.5] + _trial_sec = float(_mi_iv[1] - _mi_iv[0]) # 4.0s _margin = 1.0 train_time = max(5.0, _trial_sec + _margin) # 训练刺激时长(与 MI_main.py 保持一致)