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
|
from scipy.signal import butter, lfilter, lfilter_zi, iirnotch
|
||||||
|
|
||||||
# 配置参数
|
# 配置参数
|
||||||
DATA_LENGTH = 20000 # 数据缓存长度
|
DATA_LENGTH = 2000 # 数据缓存长度
|
||||||
PLOT_LENGTH = 750 # 显示数据长度
|
PLOT_LENGTH = 1000 # 显示数据长度
|
||||||
FFT_LENGTH = 1000 # FFT分析长度
|
FFT_LENGTH = 500 # FFT分析长度
|
||||||
UPDATE_INTERVAL = 30 # 界面刷新间隔(ms)
|
UPDATE_INTERVAL = 60 # 界面刷新间隔(ms)
|
||||||
SAMPLE_RATE = 500 # 采样率
|
SAMPLE_RATE = 500 # 采样率
|
||||||
FILTER_CUTOFF = 45 # 低通滤波截止频率
|
|
||||||
# 新增滤波器参数
|
# 新增滤波器参数
|
||||||
NOTCH_FREQ = 50.0 # 陷波频率
|
NOTCH_FREQ = 50.0 # 陷波频率
|
||||||
QUALITY_FACTOR = 30 # 品质因数(决定带宽)
|
QUALITY_FACTOR = 10 # 品质因数(决定带宽)
|
||||||
|
FILTER_CUTOFF = 45 # 低通滤波截止频率
|
||||||
|
BUTTER_ORDER = 4 # 巴特沃兹滤波器阶数
|
||||||
|
BUTTER_CUTOFF = 45 # 巴特沃兹截止频率
|
||||||
|
|
||||||
class SerialThread(QtCore.QThread):
|
class SerialThread(QtCore.QThread):
|
||||||
data_received = QtCore.pyqtSignal(str)
|
data_received = QtCore.pyqtSignal(str)
|
||||||
@ -27,6 +30,7 @@ class SerialThread(QtCore.QThread):
|
|||||||
def __init__(self, com_port):
|
def __init__(self, com_port):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.com_port = com_port
|
self.com_port = com_port
|
||||||
|
self.filter_flag = True
|
||||||
self.serial_port = None
|
self.serial_port = None
|
||||||
self.running = False
|
self.running = False
|
||||||
self.data_buffer = [[] for _ in range(9)] # 动态数据池
|
self.data_buffer = [[] for _ in range(9)] # 动态数据池
|
||||||
@ -43,11 +47,12 @@ class SerialThread(QtCore.QThread):
|
|||||||
nyquist = 0.5 * SAMPLE_RATE
|
nyquist = 0.5 * SAMPLE_RATE
|
||||||
freq = NOTCH_FREQ / nyquist
|
freq = NOTCH_FREQ / nyquist
|
||||||
self.b_notch, self.a_notch = iirnotch(freq, QUALITY_FACTOR)
|
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):
|
butter_cutoff = BUTTER_CUTOFF / nyquist
|
||||||
self.zi_notch[i] = lfilter_zi(self.b_notch, self.a_notch)
|
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):
|
def run(self):
|
||||||
self.running = True
|
self.running = True
|
||||||
@ -81,7 +86,15 @@ class SerialThread(QtCore.QThread):
|
|||||||
zi=self.zi_notch[i]
|
zi=self.zi_notch[i]
|
||||||
)
|
)
|
||||||
filtered_values.append(filtered_value[0])
|
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:
|
while len(self.timestamps) >= self.max_data_length:
|
||||||
for ch in self.data_buffer:
|
for ch in self.data_buffer:
|
||||||
@ -89,7 +102,10 @@ class SerialThread(QtCore.QThread):
|
|||||||
self.timestamps.pop(0)
|
self.timestamps.pop(0)
|
||||||
|
|
||||||
for i in range(9):
|
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.timestamps.append(self.write_index)
|
||||||
self.write_index += 1
|
self.write_index += 1
|
||||||
|
|
||||||
@ -204,9 +220,11 @@ class ADCPlotter(QtWidgets.QMainWindow):
|
|||||||
def fun_change(self):
|
def fun_change(self):
|
||||||
if self.fun_selector.text() == "测试":
|
if self.fun_selector.text() == "测试":
|
||||||
self.serial_thread.serial_port.write(b'1')
|
self.serial_thread.serial_port.write(b'1')
|
||||||
|
self.serial_thread.filter_flag = True
|
||||||
self.fun_selector.setText("标准")
|
self.fun_selector.setText("标准")
|
||||||
elif self.fun_selector.text() == "标准":
|
elif self.fun_selector.text() == "标准":
|
||||||
self.serial_thread.serial_port.write(b'3')
|
self.serial_thread.serial_port.write(b'3')
|
||||||
|
self.serial_thread.filter_flag = False
|
||||||
self.fun_selector.setText("测试")
|
self.fun_selector.setText("测试")
|
||||||
|
|
||||||
def update_display_mode(self):
|
def update_display_mode(self):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user