How to Store Analog Data

NeuroExplorer up to version 5.020 always stored analog data internally as 16-bit integers. The reason? Most data acquisition systems use analog to digital converters that have 12-bit or 16-bit resolution and store A/D data as 16-bit integers.

To display real signal values, we use scaling. For example, if analog to digital converter has input range from -1000mV to +1000mV and 10X amplification was used, then maximum 16-bit value 32767 corresponds to 1000mV/10 (non-amplified signal value). This means that 32767*ScalingFactor = 100, and ScalingFactor is 100.0/32767.

16-bit storage model seems perfect — we do not loose any signal resolution and we save on storage space. However, if we import data from Matlab (where the data values are stored as floating point numbers), we have to calculate ScalingFactor to fit floating point values into 16-bit range. As a result, we loose signal resolution (especially when the signal has a few large peaks and lots of small values).

There are also clipping issues when we try to modify signal values in NexScript. If we try to assign the value that is outside the original  non-amplified  range, we would have to clip the value since we have hard limits for 16-bit internal representation of signals.

Things, however, are changing with NeuroExplorer 5.021. Now NeuroExplorer can store analog data both as 16-bit integers and as 32-bit floating point numbers.

Analog signals imported from data files created by data acquisition system are still stored as 16-bit integers.

Continuous channels imported from Matlab or generated in NeuroExplorer (using frequency filtering, etc.) are now stored as 32-bit floating point values. Both data representations can be saved and loaded using .nex5 data files.

Matlab scripts for reading and writing .nex5 files (HowToReadAndWriteNexAndNex5FilesInMatlab.zip) have been updated and can be used to read and write .nex5 files with analog data stored as 32-bit floats.