[Eeglablist] Mindset's EEG file import

Robert Lawson robert.lawson at augustmail.com
Mon Dec 20 23:26:23 PST 2004


Hi Dean

I am not a programmer so I cannot help with the coding. My friend wrote 
me a perl script to convert the new Mindset data to ASCII. This was 
before Wayne Nolan wrote the official mindset ASCII out. Wayne was very 
helpful when when Jim was making the perl script. Either one of these 
ASCII conversions would solve the big/little endian problem. The also 
both do the scaling correctly.

I will back channel the perl script to you. I will also forward this to 
my friend to see if he can help you. He is a perl guy I met on the Splus 
list. He has been very helpful with little scripts like this. For 
example, he wrote a nifty edf2ascii converter and some conversions from 
ASCII to a proprietary binary format.

Robert

Dean Cvetkovic wrote:

> Hi Robert and other EEGLAB memebers,
> 
> I am able to read the older Mindset EEG data into Matlab using '.mat' file
> format, however the scaling and little-endian ordering is required which I
> am not so sure how to do in Matlab.
> 
> Does anyone know how to do correct scaling and conversion from little to
> big-endian ordering?
> 
> Here is an explonation on how scaling is performed, ordering codes in C and
> my matlab codes so far:
> 
> For an average of 20 Mindsets and 16 channels/Mindset, the absolute value
> returned by the ADC is 363.63 counts per microvolt. The "363.63" figure
> comes from empirical testing. This is the value used in the MindMeld
> program.
> 
> For example, a 2uV peak-to-peak (1uV peak) signal will swing the ADC 363.63
> (hex $16C) counts either side of $7000. ($7000 is the null, or
> zero point.) That is, the ADC count will vary from $7000 - $16C to $7000 +
> $16C, or $6E94 to $716C.
> 
> A 20 uV peak-to-peak (10uV peak) signal will swing the ADC count 3,636
> ($E34) either side of $7000. That is, the ADC count will go
> from $61CC to $7E34. A 50 uV peak-to-peak (25uV peak) signal will swing it
> from $4C74 to $938C.
> 
> Another way to look at it is each ADC count is about 2.75 nanovolts. There
> is always some thermal noise present, so the readings are
> accurate to about 0.5uV.
> 
> Since Matlab probably expects the data to be in little endian (intel)
> format, I need to convert each 16 bit data sample to little
> endian before assigning it to a Matlab variable.
> 
> I don't know how to do this in Matlab, but here's how to do it in C:
> 
> -----
> unsigned short thesample;          // samples are 16 bits, unsigned
> unsigned short highbyte, lowbyte;  // temporary variables
> 
>      thesample = getnextsample();   // get the next 16 bit data sample
> from the file
>      lowbyte = thesample & 0x00FF;  // isolate the low byte
>      highbyte = thesample >> 8;     // isolate the high byte
> 
>      thesample = lowbyte << 8;      // move the low byte to high position
>      thesample |= highbyte;         // merge the high byte into the low
> position
> 
> -----
> 
> Another method is to get one byte at a time from the data stream:
> 
> -----
> unsigned short thesample;          // samples are 16 bits, unsigned
> byte highbyte, lowbyte;            // temporary variables
> 
>      highbyte = getnextsamplebyte(); // get the most significant byte
>      lowbyte = getnextsamplebyte();  // get the least significant byte
> 
>      thesample = lowbyte << 8;      // move the low byte to high position
>      thesample |= highbyte;         // merge the high byte into the low
> position
> 
> -----
> 
> In the C language, the '<<' operator is a shift left.  So "<<= 8" shifts the
> variable 8 places to the left, which is the same as
> multiplying by 256.
> 
> Note that in C we're dealing with UNSIGNED variables, so that $FFFF is taken
> as +65535 instead of -1, and $8000 is taken as +32768
> instead of -32768. The endian conversion needs to be performed before
> assigning the value
> to a Matlab variable.
> 
> Here is the Matlab code I wrote, but need to perform the little-endian
> ordering:
> 
>     % function outarg = MindToMat(eegfilename,matfilename,nochannels);
>     % Program to import Mindset older .eeg file into Matlab
> 
>     % Open .eeg File
>     [fid,message]=fopen(EEGfilename.eeg','r','l');
>     MATfile= 'EEGfilename.mat';
> 
>     % Read Header File Information
> 
>     [ident,c1]=fread(fid,8,'char');
>     [revis,c2]=fread(fid,1,'char');
>     [filetype,c3]=fread(fid,1,'char');
>     [structrev,c4]=fread(fid,1,'char');
>     [devicetype,c5]=fread(fid,1,'char');
>     [nochannels,c6]=fread(fid,1,'char');
>     [bytespersample,c7]=fread(fid,1,'char');
>     [samplerate,c8]=fread(fid,1,'short');
>     [nosamples,c9]=fread(fid,1,'int');
> 
>     % Read Main body of information
> 
>     status=fseek(fid,20,-1);
>     [EEG,c10]=fread(fid,[nochannels,nosamples],'char');
> 
>     % EEG signal converted to microVolts (not Volts)
> 
>     EEG=((EEG-28672)/363.63);
> 
>     % Extract only the required channels
>     switch channels (16 channels)
> 
>     case 1
>         ch=EEG(1,:)';
>     case 2
>         ch=EEG(1:2,:)';
>     .
>     .
>     .
> 
>     otherwise
>         ch=EEG(1:16,:)';
>     end
> 
>     % create the time data
>     time = [0:(nosamples-1)]/samplerate;
> 
>     % Save New MatLab File
> 
>     save(MATfile,'ch','time','samplerate','nosamples');
> 
>     fclose(fid);
>     outarg = load(MATfile);
> 
> Mindset Data File Formats
> 
> This document describes the .eeg and .bin file formats as saved by the
> MindLab/WaveLab and MindMeld programs.
> 
> Older EEG File Format (MindLab/WaveLab)
> 
> .eeg files start with a 20 byte header followed by the actual data samples.
> All values in the file are in hex.
> 
> Byte
> 
> Offset                         Data                           Meaning
> 
> 0000                      4D494E4453455400         signature = "MINDSET" in
> ASCII characters (null terminated)
> 
> 0008                        01                                revision = 1
> 
> 0009                        01                                filetype = 1
> 
> 000A                       00                                structure
> revision
> 
> 000B                       01                                type of device
> (1 = Mindset)
> 
> 000C                       10                                number of
> channels = 16
> 
> 000D                       10                               number of
> bits/sample = 16
> 
> 000E                       0100                           samplerate = 256
> sps
> 
> 0010                      xx xx xx xx                  dword: the number of
> samples that follow
> 
> 0014                                                        the Data Samples
> start here
> 
> Here's an actual header from an .eeg file:
> 
> 4D494E4453455400 01 01 00 01 10 10 0001 101E0000 71DD 71CF 6F8E ...
> 
> Note the Intel ordering (little endian) for the header bytes and Motorola
> ordering (big endian) for the data samples.
> 
> Here's the header as a C structure:
> 
> struct {
> 
> BYTE identifier[8]; // signature = "MINDSET" (null terminated)
> 
> BYTE revision; // revision = 1
> 
> BYTE filetype; // filetype = 1
> 
> BYTE structrev; // structure revision = 0
> 
> BYTE devicetype; // type of device (1 = Mindset MS-1000)
> 
> BYTE numberofchannels; // number of channels = 16
> 
> BYTE bitspersample; // number of bits/sample = 16
> 
> short samplerate; // samplerate
> 
> DWORD numberofsamples; // number of data samples (for each channel) in the
> file
> 
> } eeg_header;
> 
> The data samples for the 16 channels are each 16 bits in length arranged as
> follows:
> 
> Channel 1 Channel 2 Channel 3 .. Channel 16
> 
> Data Sample 1: 7000 7000 7000 .. 7000
> 
> Data Sample 2: 7000 7000 7000 .. 7000
> 
> Data Sample 3: 7000 7000 7000 .. 7000
> 
> .
> 
> .
> 
> .
> 
> Note that in this case each data sample is 32 bytes in length (one 16 bit
> sample for each of the 16 channels). In the .eeg header the
> 
> "numberofsamples" field contains the number of data samples, each data
> sample being 32 bytes in length.
> 
> Thank you very much.
> 
> Regards,
> 
> Dean
> ----- Original Message -----
> From: "Robert Lawson" <robert at EEGWorks.com>
> To: <s9809696 at student.rmit.edu.au>
> Sent: Wednesday, December 15, 2004 7:40 AM
> Subject: Re: [Eeglablist] Mindset's EEG file import
> 
> 
> 
>>Hi Dean
>>
>>Contact Wayne Noland, the manufacturer. He has an ASCII out utility now.
>>EEGlab has native ASCII import. I have a perl script that converts the new
>>format to ASCII you can have. Also- Wayne might give you an upgrade.
>>
>>wayne at nolancomputersystems.com
>>
>>If he does not support the old file format ASCII out, ask hi for the file
>>format. Once you have that, people on the EEG lab list can help w/ the
>>import.
>>
>>Robert
>>
>>------Original Mail------
>>From: "Dean Cvetkovic" <s9809696 at student.rmit.edu.au>
>>To: "eeglablist" <eeglablist at sccn.ucsd.edu>
>>Sent: Tue, 14 Dec 2004 19:15:53 +1100
>>Subject: [Eeglablist] Mindset's EEG file import
>>
>>Hi all,
>>
>>Does anyone know if you can import Mindset's EEG file format '.eeg' (older
>>version) into EEGLAB?
>>
>>Thank you very much.
>>
>>Dean
> 
> 
> 



More information about the eeglablist mailing list