This commit is contained in:
2026-06-06 09:16:49 +08:00
parent 32e8a5a98f
commit 868ff30238
11 changed files with 1167 additions and 174 deletions

View File

@@ -21,8 +21,8 @@ from SSVEP.dwfbcca import FbccaDw
from Tools.plot_MI_EEG import plotMain
from collections import deque
class Decoder_main(threading.Thread):
def __init__(self):
class Decoder_main(threading.Thread, device_type):
def __init__(self, device_type=None):
threading.Thread.__init__(self)
self.Runing=True
self.decoder = None
@@ -33,6 +33,11 @@ class Decoder_main(threading.Thread):
self.decoder_class = None #解码器类别
self.decodingSteps = 0 # 0=停止解码 1=预热 2=解码中 3=解码完成,发送解码结果
self.device_info = {
'device_type': None,
'sample_rate': None,
'channel_num': None,
}
def connect(self, device_type=None, device_host=None, device_port=None, upper_host=None, upper_port=None):
self.DeviceType = device_type if device_type is not None else int(IniRead('system', 'Device_type'))
@@ -113,40 +118,40 @@ class Decoder_main(threading.Thread):
self.parameter_init(8, 30)
elif decoder_class == 'concentration':
self.thread_data_server.interval_inited = False
self.n_chan = 6
self.win_len = 10
self.win_step = 1
self.low_threshold, self.high_threshold = ast.literal_eval(IniRead('system', 'concentration_ThresholdValue'))
self.calculate = Calculate(self.low_threshold, self.high_threshold, self.fs, self.win_len)
self.interval_epoch = [0, 1]
self.parameter_init(2, 40)
# self.eegQueue moved to Calculate class
# elif decoder_class == 'concentration':
# self.thread_data_server.interval_inited = False
# self.n_chan = 6
# self.win_len = 10
# self.win_step = 1
# self.low_threshold, self.high_threshold = ast.literal_eval(IniRead('system', 'concentration_ThresholdValue'))
# self.calculate = Calculate(self.low_threshold, self.high_threshold, self.fs, self.win_len)
# self.interval_epoch = [0, 1]
# self.parameter_init(2, 40)
# # self.eegQueue moved to Calculate class
elif decoder_class == 'blink':
self.n_chan = 2
self.l_freq = 0.1 # 带通滤波器低频截止
self.h_freq = 8.0 # 带通滤波器高频截止
self.total_samples = 0 # 总采样点数
self.window_ms = 600 # 检测窗口大小 (ms)
self.step_ms = 100 # 滑动步长 (ms)
self.window_samples = int(self.window_ms * self.fs / 1000) # 150个样本点
self.step_samples = int(self.step_ms * self.fs / 1000) # 25个样本点
self.buffer_size = self.window_samples + self.step_samples * 5
self.fp1_buffer = deque(maxlen=self.buffer_size)
self.fp2_buffer = deque(maxlen=self.buffer_size)
self.sample_counter = 0
# 预计算滤波器系数,避免在循环中重复设计
self.Dmin, self.Dmax, self.EMin, self.EMax, self.jitterwin,self.double_blink_interval,self.double_blink_jitter = ast.literal_eval(IniRead('system', 'blink'))
self.blink_count = 0 # 单次眨眼的次数
self.last_blink_time = 0 # 上次检测到单次眨眼的时间(样本索引)
self.blink_timestamps = deque(maxlen=10) # 记录最近10次 单次眨眼的时间戳
self.double_blink_count = 0 # 连续两次眨眼的次数
self.double_blink_events = [] # 连续眨眼事件记录
self.last_double_blink_time = 0 # 上次检测到连续眨眼的时间戳
self.blink_events = []
self.blink_b, self.blink_a = signal.butter(4, [self.l_freq / (self.fs / 2), self.h_freq / (self.fs / 2)], btype='band')
# elif decoder_class == 'blink':
# self.n_chan = 2
# self.l_freq = 0.1 # 带通滤波器低频截止
# self.h_freq = 8.0 # 带通滤波器高频截止
# self.total_samples = 0 # 总采样点数
# self.window_ms = 600 # 检测窗口大小 (ms)
# self.step_ms = 100 # 滑动步长 (ms)
# self.window_samples = int(self.window_ms * self.fs / 1000) # 150个样本点
# self.step_samples = int(self.step_ms * self.fs / 1000) # 25个样本点
# self.buffer_size = self.window_samples + self.step_samples * 5
# self.fp1_buffer = deque(maxlen=self.buffer_size)
# self.fp2_buffer = deque(maxlen=self.buffer_size)
# self.sample_counter = 0
# # 预计算滤波器系数,避免在循环中重复设计
# self.Dmin, self.Dmax, self.EMin, self.EMax, self.jitterwin,self.double_blink_interval,self.double_blink_jitter = ast.literal_eval(IniRead('system', 'blink'))
# self.blink_count = 0 # 单次眨眼的次数
# self.last_blink_time = 0 # 上次检测到单次眨眼的时间(样本索引)
# self.blink_timestamps = deque(maxlen=10) # 记录最近10次 单次眨眼的时间戳
# self.double_blink_count = 0 # 连续两次眨眼的次数
# self.double_blink_events = [] # 连续眨眼事件记录
# self.last_double_blink_time = 0 # 上次检测到连续眨眼的时间戳
# self.blink_events = []
# self.blink_b, self.blink_a = signal.butter(4, [self.l_freq / (self.fs / 2), self.h_freq / (self.fs / 2)], btype='band')
def parameter_init(self,bandPass_low,bandPass_high):
self.interval_epoch = [int(i * self.fs) for i in self.interval_epoch] # epoch截取信息