diff --git a/Decoder.py b/Decoder.py index 3dbc3ba..2b8b543 100644 --- a/Decoder.py +++ b/Decoder.py @@ -185,7 +185,7 @@ class Decoder_main(threading.Thread): def run(self): while self.Runing: # 当滤波数据大于5秒时,启动滤波线程 - if self.zmqServer.filterBuffer.GetDataLenCount() > self.device_info['sample_rate'] * 5: + if not self.sliding_filter.is_alive() and self.zmqServer.filterBuffer.GetDataLenCount() > self.device_info['sample_rate'] * 5: algo_log("启动滤波线程", level="DEBUG") self.sliding_filter.start() diff --git a/Zmq/filterProcess.py b/Zmq/filterProcess.py index 3f4dee7..5d25eb8 100644 --- a/Zmq/filterProcess.py +++ b/Zmq/filterProcess.py @@ -53,21 +53,21 @@ class FilterRingBuffer: :param count: 读取点数 :return: np.ndarray, shape=(n_chan, count) """ - with self.lock: - count = min(count, self.total_samples) - if count == 0: - return np.zeros((self.n_chan, 0)) + # with self.lock: + count = min(count, self.total_samples) + if count == 0: + return np.zeros((self.n_chan, 0)) - # 环形读取:end是当前写入指针(最新数据的下一位),start是end - count - end = self.current_ptr - start = end - count - if start >= 0: - return self.buffer[:, start:end].copy() - else: - # 跨环形边界:前半部分从缓存末尾取,后半部分从开头取 - part1 = self.buffer[:, start:] # start为负,等价于n_points + start - part2 = self.buffer[:, :end] - return np.concatenate((part1, part2), axis=1) + # 环形读取:end是当前写入指针(最新数据的下一位),start是end - count + end = self.current_ptr + start = end - count + if start >= 0: + return self.buffer[:, start:end].copy() + else: + # 跨环形边界:前半部分从缓存末尾取,后半部分从开头取 + part1 = self.buffer[:, start:] # start为负,等价于n_points + start + part2 = self.buffer[:, :end] + return np.concatenate((part1, part2), axis=1) def get_latest_n_points(self, n): """ @@ -75,10 +75,9 @@ class FilterRingBuffer: :param n: 点数 :return: np.ndarray, shape=(n_chan, n) | None(数据不足时) """ - with self.lock: - if self.total_samples < n: - return None - return self.getData(n) + if self.total_samples < n: + return None + return self.getData(n) def GetDataLenCount(self): """获取当前缓存总点数(兼容原有接口)""" @@ -173,12 +172,14 @@ class SlidingFilter(threading.Thread): try: # 获取最新的3秒窗口数据 window_data = self.ring_buffer.get_latest_n_points(self.window_size) + algo_log(f"获取到{window_data.shape}数据", level='debug') if window_data is None: algo_log(f"缓存数据不足,当前缓存{self.ring_buffer.GetDataLenCount()}点,需{self.window_size}点", level='debug') continue # 滤波并提取无边界效应的200ms数据 filtered_data = self._filter_window_data(window_data) + algo_log(f"滤波后{filtered_data.shape}数据", level='debug') # 回调返回结果(外部可处理) if self.filter_result_callback is not None: diff --git a/Zmq/zmqServer.py b/Zmq/zmqServer.py index 46a564f..af5a2c6 100644 --- a/Zmq/zmqServer.py +++ b/Zmq/zmqServer.py @@ -268,7 +268,7 @@ class zmqServer(threading.Thread): # -------------------------- 数据端口消息处理 -------------------------- def _handle_data_message(self, frames): """处理8100端口二进制脑电数据消息""" - algo_log(f"收到数据帧,总帧数:{len(frames)}", level="DEBUG", record_once=False) + algo_log(f"收到数据帧,总帧数:{len(frames)}", level="DEBUG", record_once=True) # 然后再进行解析 if len(frames) == 4: # 你的上位机格式