Skip to content

Commit 577c41f

Browse files
committed
lfilter is used and psd calculation updated.
1 parent 30ed1cc commit 577c41f

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

ffteeg.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
import pyqtgraph as pg
77
import pylsl
88
import sys
9-
from scipy.signal import butter, filtfilt, iirnotch
9+
from scipy.signal import butter, iirnotch, lfilter, lfilter_zi
1010
from scipy.fft import fft
11+
import math
1112

1213
class EEGMonitor(QMainWindow):
1314
def __init__(self):
@@ -73,8 +74,6 @@ def __init__(self):
7374
print(f"Sampling rate: {self.sampling_rate} Hz")
7475

7576
# Data and Buffers
76-
self.filter_buffer_size = 30 # Minimum length for filtfilt
77-
self.filter_buffer = deque(maxlen=self.filter_buffer_size)
7877
self.one_second_buffer = deque(maxlen=self.sampling_rate) # 1-second buffer
7978
self.buffer_size = self.sampling_rate * 10
8079
self.moving_window_size = self.sampling_rate * 2 # 2-second window
@@ -86,6 +85,9 @@ def __init__(self):
8685
self.b_notch, self.a_notch = iirnotch(50, 30, self.sampling_rate)
8786
self.b_band, self.a_band = butter(4, [0.5 / (self.sampling_rate / 2), 48.0 / (self.sampling_rate / 2)], btype='band')
8887

88+
self.zi_notch = lfilter_zi(self.b_notch, self.a_notch) * 0
89+
self.zi_band = lfilter_zi(self.b_band, self.a_band) * 0
90+
8991
# Timer for updating the plot
9092
self.timer = pg.QtCore.QTimer()
9193
self.timer.timeout.connect(self.update_plot)
@@ -99,16 +101,13 @@ def update_plot(self):
99101
if samples:
100102
for sample in samples:
101103
raw_point = sample[0]
102-
self.filter_buffer.append(raw_point)
103104

104-
# Apply the filters if the buffer is full
105-
if len(self.filter_buffer) == self.filter_buffer_size:
106-
notch_filtered = filtfilt(self.b_notch, self.a_notch, list(self.filter_buffer))[-1]
107-
band_filtered = filtfilt(self.b_band, self.a_band, list(self.filter_buffer))[-1]
108-
else:
109-
continue
105+
notch_filtered, self.zi_notch = lfilter(self.b_notch, self.a_notch, [raw_point], zi=self.zi_notch)
106+
band_filtered, self.zi_band = lfilter(self.b_band, self.a_band, notch_filtered, zi=self.zi_band)
107+
band_filtered = band_filtered[-1] # Get the current filtered point
110108

111-
self.eeg_data[self.current_index] = band_filtered # Plot the filtered data
109+
# Update the EEG plot
110+
self.eeg_data[self.current_index] = band_filtered
112111
self.current_index = (self.current_index + 1) % self.buffer_size
113112

114113
if self.current_index == 0:
@@ -139,12 +138,16 @@ def process_fft_and_brainpower(self):
139138
self.brainwave_bars.setOpts(height=brainwave_power)
140139

141140
def calculate_brainwave_power(self, fft_data, freqs):
142-
delta_power = np.sum(fft_data[(freqs >= 0.5) & (freqs <= 4)] ** 2)
143-
theta_power = np.sum(fft_data[(freqs >= 4) & (freqs <= 8)] ** 2)
144-
alpha_power = np.sum(fft_data[(freqs >= 8) & (freqs <= 13)] ** 2)
145-
beta_power = np.sum(fft_data[(freqs >= 13) & (freqs <= 30)] ** 2)
146-
gamma_power = np.sum(fft_data[(freqs >= 30) & (freqs <= 45)] ** 2)
147-
141+
delta_power = math.sqrt(np.sum(((fft_data[(freqs >= 0.5) & (freqs <= 4)])**2)/4))
142+
theta_power = math.sqrt(np.sum(((fft_data[(freqs >= 4) & (freqs <= 8)])**2)/5))
143+
alpha_power = math.sqrt(np.sum(((fft_data[(freqs >= 8) & (freqs <= 13)])**2)/6))
144+
beta_power = math.sqrt(np.sum(((fft_data[(freqs >= 13) & (freqs <=30)])**2)/18))
145+
gamma_power = math.sqrt(np.sum(((fft_data[(freqs >= 30) & (freqs <= 45)])**2)/16))
146+
print(f"Delta", delta_power)
147+
print(f"Theta", theta_power)
148+
print(f"Alpha", alpha_power)
149+
print(f"Beta", beta_power)
150+
print(f"Gamma", gamma_power)
148151
return [delta_power, theta_power, alpha_power, beta_power, gamma_power]
149152

150153
if __name__ == "__main__":

0 commit comments

Comments
 (0)