Atharv Kashyap‘s Status Report for 10/18/2026
This week, the main focus was on getting my design report sections complete, accurate, and well-formatted on LaTeX. But outside of that, I also focused on validating the SSVEP classification pipeline I wrote last week in Python by using real EEG recordings from the Wang et al. dataset. I limited it as the dataset was way too big to accomodate on my device. I also prepared the decoder for deployment on the ESP32-S3. This included working on dataset integration, signal processing, testing, and the C++ implementation.
Previously, I had developed and tested our Python-based EEG decoder using synthetic signals. This week, I downloaded and integrated the Wang et al. (2017) SSVEP benchmark dataset to test whether the pipeline could classify the actual brain signals. To match what we want to achieve and also limit the size of the dataset to test the classification, I used recordings from three subjects (S1–S3), selecting the O1, Oz, O2, and POz channels to match our planned electrode configuration. The dataset contains recordings at 8, 12, and 15 Hz, which are close to our target frequencies. To achieve this I used Claude to write a benchmark walkthrough that checks each stage of the pipeline including but not limited to loading raw EEG, filtering, CCA classification, and final predictions.

The highlighted shows 2.5-second EEG window used for classification.

The peaks at the stimulus frequencies and their harmonics confirm that the recordings contain detectable SSVEP responses.
Then I also needed to test the digital signal processing and filtering. I tested the filtering pipeline on the real EEG recordings to verify that it removes unwanted noise without significantly altering the SSVEP signals. The pipeline uses a 0.5–45 Hz bandpass filter, with a configurable 60 Hz notch filter. The 12 Hz signal experienced only 0.02 dB attenuation.

The next step was to evaluate the complete classification pipeline using 54 real EEG trials across the three subjects. I chose this number because it is how much disk space I had left and it felt significant enough. With our four-channel configuration, the classifier correctly identified 52 out of 54 trials, thus being 96.3% accurate. I also used Claude to generated confusion matrices and correlation-score distributions to examine where the classifier made mistakes. Both incorrect predictions occurred on 15 Hz trials.

I also ran experiments to understand how different processing parameters affect classification accuracy. Specifically, I compared EEG window lengths, electrode configurations, and the number of harmonics used in CCA. This was the most fun part to tweak and observe what changed and how! Results showed that window length accuracy increased from approximately 85% at 1 second to 96.3% at 2.5 seconds, with marginal improvement at 3 seconds. But I can’t afford to spend too much time on the window due to our latency user requirements. I also found that using two harmonics improved accuracy compared with using only the fundamental frequency.
Once all this was done, the final porting to ESP32 remains. It is not yet complete and will be the focus of next week.
Schedule
The Python signal-processing and classification pipeline is implemented and has now been tested successfully on real EEG data. The next major milestone is running the decoder on the ESP32-S3. The C++ implementation is in the work, but the full firmware has not yet been compiled and tested on the microcontroller. Also, final calibration values discussed in previous report and will depend on recordings from our custom EEG acquisition hardware. In the meantime, I can continue firmware development and testing using prerecorded EEG data.
Deliverables for Next Week
For next week, I want to finalize and complete ESP32 firware integration, compile and flash the firmware, and test the decoder on the firmware with the practice EEG data to see if the data matched what I achieved this week. While this happens, I will also measure latency, processing time, and memory usage.