mirror of
https://github.com/YuTaoV5/YuEEG.git
synced 2025-11-04 14:50:03 +08:00
fix plot bug
This commit is contained in:
parent
3e760acdf5
commit
ba095322e1
@ -11,15 +11,18 @@ from qfluentwidgets import FluentIcon as FIF
|
||||
from scipy.signal import butter, lfilter, lfilter_zi, iirnotch
|
||||
|
||||
# 配置参数
|
||||
DATA_LENGTH = 20000 # 数据缓存长度
|
||||
PLOT_LENGTH = 750 # 显示数据长度
|
||||
FFT_LENGTH = 1000 # FFT分析长度
|
||||
UPDATE_INTERVAL = 30 # 界面刷新间隔(ms)
|
||||
DATA_LENGTH = 2000 # 数据缓存长度
|
||||
PLOT_LENGTH = 1000 # 显示数据长度
|
||||
FFT_LENGTH = 500 # FFT分析长度
|
||||
UPDATE_INTERVAL = 60 # 界面刷新间隔(ms)
|
||||
SAMPLE_RATE = 500 # 采样率
|
||||
FILTER_CUTOFF = 45 # 低通滤波截止频率
|
||||
|
||||
# 新增滤波器参数
|
||||
NOTCH_FREQ = 50.0 # 陷波频率
|
||||
QUALITY_FACTOR = 30 # 品质因数(决定带宽)
|
||||
QUALITY_FACTOR = 10 # 品质因数(决定带宽)
|
||||
FILTER_CUTOFF = 45 # 低通滤波截止频率
|
||||
BUTTER_ORDER = 4 # 巴特沃兹滤波器阶数
|
||||
BUTTER_CUTOFF = 45 # 巴特沃兹截止频率
|
||||
|
||||
class SerialThread(QtCore.QThread):
|
||||
data_received = QtCore.pyqtSignal(str)
|
||||
@ -27,6 +30,7 @@ class SerialThread(QtCore.QThread):
|
||||
def __init__(self, com_port):
|
||||
super().__init__()
|
||||
self.com_port = com_port
|
||||
self.filter_flag = True
|
||||
self.serial_port = None
|
||||
self.running = False
|
||||
self.data_buffer = [[] for _ in range(9)] # 动态数据池
|
||||
@ -43,11 +47,12 @@ class SerialThread(QtCore.QThread):
|
||||
nyquist = 0.5 * SAMPLE_RATE
|
||||
freq = NOTCH_FREQ / nyquist
|
||||
self.b_notch, self.a_notch = iirnotch(freq, QUALITY_FACTOR)
|
||||
self.zi_notch = [lfilter_zi(self.b_notch, self.a_notch) for _ in range(9)]
|
||||
|
||||
# 为每个通道初始化滤波器状态
|
||||
for i in range(9):
|
||||
self.zi_notch[i] = lfilter_zi(self.b_notch, self.a_notch)
|
||||
|
||||
# 巴特沃兹滤波器初始化
|
||||
butter_cutoff = BUTTER_CUTOFF / nyquist
|
||||
self.b_butter, self.a_butter = butter(BUTTER_ORDER, butter_cutoff, btype='low')
|
||||
self.zi_butter = [lfilter_zi(self.b_butter, self.a_butter) for _ in range(9)]
|
||||
|
||||
def run(self):
|
||||
self.running = True
|
||||
@ -81,7 +86,15 @@ class SerialThread(QtCore.QThread):
|
||||
zi=self.zi_notch[i]
|
||||
)
|
||||
filtered_values.append(filtered_value[0])
|
||||
|
||||
# 第二级:4阶巴特沃兹低通滤波
|
||||
for i in range(9):
|
||||
filtered, self.zi_butter[i] = lfilter(
|
||||
self.b_butter,
|
||||
self.a_butter,
|
||||
[filtered_values[i]],
|
||||
zi=self.zi_butter[i]
|
||||
)
|
||||
filtered_values[i] = filtered[0]
|
||||
# 将滤波后的数据存入缓冲区(替代原始数据)
|
||||
while len(self.timestamps) >= self.max_data_length:
|
||||
for ch in self.data_buffer:
|
||||
@ -89,7 +102,10 @@ class SerialThread(QtCore.QThread):
|
||||
self.timestamps.pop(0)
|
||||
|
||||
for i in range(9):
|
||||
self.data_buffer[i].append(filtered_values[i])
|
||||
if self.filter_flag:
|
||||
self.data_buffer[i].append(filtered_values[i])
|
||||
else:
|
||||
self.data_buffer[i].append(values[i])
|
||||
self.timestamps.append(self.write_index)
|
||||
self.write_index += 1
|
||||
|
||||
@ -204,9 +220,11 @@ class ADCPlotter(QtWidgets.QMainWindow):
|
||||
def fun_change(self):
|
||||
if self.fun_selector.text() == "测试":
|
||||
self.serial_thread.serial_port.write(b'1')
|
||||
self.serial_thread.filter_flag = True
|
||||
self.fun_selector.setText("标准")
|
||||
elif self.fun_selector.text() == "标准":
|
||||
self.serial_thread.serial_port.write(b'3')
|
||||
self.serial_thread.filter_flag = False
|
||||
self.fun_selector.setText("测试")
|
||||
|
||||
def update_display_mode(self):
|
||||
|
||||
Loading…
Reference in New Issue
Block a user