Clarification on raw FFT data


Hi there,

I’m relatively new to EEG and signal processing, and am using the Muse for a
school project. To help better my understanding of what the Muse was doing, I
tried to redo the signal processing steps that the Muse performs to report
absolute band powers using data from the research tools exported to CSV format.

Unfortunately, I haven’t been successful in getting the same numbers that the
Muse reports for the FFT. It isn’t important for my project, but I was
wondering if someone might be able to point out where I went wrong.

My understanding is that no FFT is done until the Muse has sent 256 raw EEG data
packets, so I made sure to start recording the data stream in time to pick the
first 256 packets up so that I would know which values were used in the Muse
calculation. I took the first column of the first 256 raw EEG records
(appearing in the data before any FFTs), which I believe correspond to TP9
channel and ran these values through the rfft function provided by the numpy
package for Python.

Since all the inputs are real, it only returns half of the frequency bins since
the others are just reflected about 0 Hz term (as indicated in the docs).

Now, I know that the values reported at /muse/elements/rawfftX are actually based
on the power spectral density. To calculate this, I have done as indicated in
the numpy documentation at
and transformed the array by computing the square of the magnitude of each
element. Since the inputs were the values from TP9, I would expect this to
produce the first array reported at /muse/elements/rawfft0, but this was not the

I did some digging and saw that Tom mentioned in his first reply here
that these values are actually the log of the PSD, but I don’t know if that is
still the case.

My guess is I did not calculate the PSD correctly, although that seems pretty
straightforward. Would anyone be able to offer another opinion?