Scaling Raw EEG data from mili to micro volts




I’m using Muse C++ Windows API to receive Raw EEG data.

In the documentation, we can read that the received values are in millivolts

The values I obtain from device, most often fall within the range 700-900 mV (milivolts),
while in many of EEG researches, data is analysed in real numbers, in the range of +/- 100 uV (microvolts).

Also, most algorithms for identifying interference from EMG or EEA operate on amplitudes and rejects everything outside the range +/- 80uV

What is the best approach for scaling Muse’s Raw EEG data from mV to +/- 100 uV ?


You can do a baseline correction for each channel by averaging the values in that channel and then subtracting the average from each value in the channel.


Which method of signal averaging can you suggest in this case ?
Can you extend the description of the solution (also for other users having same issue) ?

I was also thinking in different way (because of the spikes in the signal)

  1. Count mean for dataset

  2. Count standard deviation for dataset

  3. Count original min/max bounds (mean-sd / mean+sd)

  4. Use linear conversion to scale the values into new range, i.e.:

    scale = (newMax - newMin) / (originalMax- originalMin)
    scaledValue = (newMin+ ((value - originalMin) * scale))

What do you think about this method ?

Also, do you know what is the value of signal amplification in Muse 2016 ?


There was a typo in the documentation, thanks for pointing it out! it’s now been corrected to uV as it should be.

You’ll notice that the signal are offset by about 825 uV. This is a peculiarity of the hardware design, but it doesn’t affect the measurements. To get rid of that offset, you can do the following:

  1. Compute mean amplitude of each channel (over entire recording, or part of it)
  2. Subtract the mean amplitude from each respective channel

Your EEG signals will be centered around 0 uV, and have a range of approximately 100-200 uV.

Finally, the method that you describe will “compress” the data so that values that fall between (mean - originalMin) and (mean + originalMax) now fall between newMin and newMax. It can be useful depending on your application, but does not achieve the same thing as the method described above, which only makes sure your data is centered around 0 uV.


Thank you for those explanations ! The issue has been resolved. Finally I followed your suggestions to move down values by signal’s mean amplitude and now it looks very good.