📄 cntopen.m
字号:
h.fspnoise = fread(fid,1,'float');
h.fspv1 = fread(fid,1,'short');
h.montage = fread(fid,40,'char');
h.eventfile = fread(fid,40,'char');
h.fratio = fread(fid,1,'float');
h.minor_rev = fread(fid,1,'char'); %%%
h.eegupdate = fread(fid,1,'short');
h.compressed = fread(fid,1,'char');
h.xscale = fread(fid,1,'float');
h.yscale = fread(fid,1,'float');
h.xsize = fread(fid,1,'float');
h.ysize = fread(fid,1,'float');
h.acmode = fread(fid,1,'char');
h.commonchnl = fread(fid,1,'uchar');
h.xtics = fread(fid,1,'char');
h.xrange = fread(fid,1,'char');
h.ytics = fread(fid,1,'char');
h.yrange = fread(fid,1,'char');
h.xscalevalue = fread(fid,1,'float');
h.xscaleinterval = fread(fid,1,'float');
h.yscalevalue = fread(fid,1,'float');
h.yscaleinterval = fread(fid,1,'float');
h.scaletoolx1 = fread(fid,1,'float');
h.scaletooly1 = fread(fid,1,'float');
h.scaletoolx2 = fread(fid,1,'float');
h.scaletooly2 = fread(fid,1,'float');
h.port = fread(fid,1,'short');
h.numsamples = fread(fid,1,'int32'); %%%
h.filterflag = fread(fid,1,'char'); %%%
h.lowcutoff = fread(fid,1,'float'); %%%
h.lowpoles = fread(fid,1,'short');
h.highcutoff = fread(fid,1,'float'); %%%
h.highpoles = fread(fid,1,'short');
h.filtertype = fread(fid,1,'char');
h.filterdomain = fread(fid,1,'char');
h.snrflag = fread(fid,1,'char');
h.coherenceflag = fread(fid,1,'char');
h.continuoustype = fread(fid,1,'char');
h.eventtablepos = fread(fid,1,'int32'); %%%
h.continuousseconds = fread(fid,1,'float');
h.channeloffset = fread(fid,1,'uint32');
h.autocorrectflag = fread(fid,1,'char');
h.dcthreshold = fread(fid,1,'uchar');
if ftell(fid)~=900,
warning(['supicous Neuroscan file ',FILENAME]);
end;
for n = 1:h.nchannels,%h.nchannels
e.lab(1:10,n) = fread(fid,10,'char');
e.reference(1,n) = fread(fid,1,'char');
e.skip(1,n) = fread(fid,1,'char');
e.reject(1,n) = fread(fid,1,'char');
e.display(1,n) = fread(fid,1,'char');
e.bad(1,n) = fread(fid,1,'char');
e.n(1,n) = fread(fid,1,'ushort');
e.avg_reference(1,n) = fread(fid,1,'char');
e.clipadd(1,n) = fread(fid,1,'char');
e.x_coord(1,n) = fread(fid,1,'float');
e.y_coord(1,n) = fread(fid,1,'float');
e.veog_wt(1,n) = fread(fid,1,'float');
e.veog_std(1,n) = fread(fid,1,'float');
e.snr(1,n) = fread(fid,1,'float');
e.heog_wt(1,n) = fread(fid,1,'float');
e.heog_std(1,n) = fread(fid,1,'float');
e.baseline(1,n) = fread(fid,1,'short');
e.filtered(1,n) = fread(fid,1,'char');
e.fsp(1,n) = fread(fid,1,'char');
e.aux1_wt(1,n) = fread(fid,1,'float');
e.aux1_std(1,n) = fread(fid,1,'float');
e.sensitivity(1,n) = fread(fid,1,'float');
e.gain(1,n) = fread(fid,1,'char');
e.hipass(1,n) = fread(fid,1,'char');
e.lopass(1,n) = fread(fid,1,'char');
e.page(1,n) = fread(fid,1,'uchar');
e.size(1,n) = fread(fid,1,'uchar');
e.impedance(1,n) = fread(fid,1,'uchar');
e.physicalchnl(1,n) = fread(fid,1,'uchar');
e.rectify(1,n) = fread(fid,1,'char');
e.calib(1,n) = fread(fid,1,'float');
end
if ftell(fid)~=(900+h.nchannels*75),
% this check does not work in the currenct CVS-version of Octave
warning(['supicous Neuroscan file ',FILENAME]);
end;
end;
CNT.VERSION = str2double(char(h.rev(8:12)'));
CNT.CNT.type = h.type;
CNT.PID = h.id;
CNT.ID.Operator = char(h.oper'); %
CNT.ID.Doctor = char(h.doctor'); %
CNT.ID.referral = char(h.referral'); %
CNT.ID.Hospital = char(h.hospital'); %
CNT.Patient.Name= char(h.patient'); %
CNT.Patient.Age = h.age; %
CNT.Patient.Sex = char(h.sex'); %
CNT.Patient.Handedness=char(h.hand'); %
CNT.Patient.Medication=char(h.med'); %
CNT.Patient.Classification=char(h.category'); %
CNT.Patient.State=char(h.state'); %
CNT.Session.Label=char(h.label'); %
CNT.Date=char(h.date'); %
CNT.Time=char(h.time'); %
CNT.T0 = [str2double(CNT.Date(7:length(CNT.Date))),str2double(CNT.Date(1:2)),str2double(CNT.Date(4:5)),str2double(CNT.Time(1:2)),str2double(CNT.Time(4:5)),str2double(CNT.Time(7:8))];
if CNT.T0(1) > 99,
elseif CNT.T0(1) > 80, CNT.T0(1) = CNT.T0(1) + 1900;
else CNT.T0(1) = CNT.T0(1) + 2000;
end;
CNT.NS = h.nchannels; %
CNT.SampleRate=h.rate; % D-to-A rate
CNT.Scale=h.scale; % scale factor for calibration
CNT.Scale2=h.ampsensitivity;
CNT.ChanTyp=zeros(CNT.NS,1);
%CNT.ChanTyp(h.trigchnl)=
CNT.HeadLen = 900 + 75*CNT.NS;
CNT.PhysDim = '礦';
% Scan4.3->Edit->Overall Setup->Amplifier->Notch->Off/50Hz/60Hz
tmp = [0,50,60];
CNT.Filter.Notch = tmp(h.notchfilter+1);
% Scan4.3->Edit->Overall Setup->Amplifier->AC/DC
CNT.Filter.ACmode = h.acmode;
% Scan4.3->Edit->Overall Setup->Amplifier->DC Auto Correction
CNT.Filter.DCauto = h.autocorrectflag;
% Scan4.3->Edit->Overall Setup->Amplifier->Amplifier Settings->Low Pass
tmp = [30, 40, 50, 70, 100, 200, 500, 1000, 1500, 2000, 2500, 3000]; % LOWPASS
CNT.Filter.LowPass = tmp(e.lopass+1);
CNT.CNT.Filter.LowPass = tmp(h.lowpass+1); % ???
% Scan4.3->Edit->Overall Setup->Amplifier->Amplifier Settings->High Pass
tmp = [NaN, 0, .05, .1, .15, .3, 1, 5, 10, 30, 100, 150, 300]; %HIGHPASS
CNT.Filter.HighPass = tmp(e.hipass+1);
if h.acmode,
CNT.Filter.HighPass(e.hipass==0) = .05;
end;
CNT.CNT.Filter.HighPass = tmp(h.highpass+1); % ???
% ???
CNT.CNT.Filter.LowCutOff = h.lowcutoff;
CNT.CNT.Filter.HighCutOff = h.highcutoff;
CNT.CNT.Filter.NotchOn = h.filterflag;
CNT.CNT.Filter.ON = [e(:).filtered];
CNT.CNT.minor_revision = h.minor_rev;
CNT.CNT.EventTablePos = h.eventtablepos;
CNT.Label = setstr(e.lab');
if CHAN==0, CHAN=1:CNT.NS; end;
CNT.FILE.POS = 0;
if strcmp(upper(CNT.FILE.Ext),'AVG'),
if (h.type~=0),
fprintf(2,'Warning CNTOPEN: filetype %i does not match file extension (%s).\n',h.type,CNT.FILE.Ext);
end;
CNT.TYPE='AVG';
CNT.AS.endpos = 1;
CNT.NRec = 1;
CNT.SPR = h.pnts;
CNT.Cal = e.calib./e.n; % scaling
CNT.Calib = sparse(2:CNT.NS+1,1:CNT.NS,CNT.Cal);
CNT.AS.bpb = h.pnts*h.nchannels*4+5;
CNT.AS.spb = h.pnts*h.nchannels;
CNT.Dur = CNT.SPR/CNT.SampleRate;
elseif strcmp(upper(CNT.FILE.Ext),'COH')
warning('.COH data not supported yet')
CNT.COH.directory = fread(CNT.FILE.FID,[CNT.NS,CNT.NS],'int32');
CNT.SPR = h.pnts;
elseif strcmp(upper(CNT.FILE.Ext),'CSA')
warning('.CSA data not supported yet')
CNT.SPR = h.pnts;
CNT.NRec = h.compsweeps;
elseif strcmp(upper(CNT.FILE.Ext),'EEG'),
if (h.type~=1),
fprintf(2,'Warning CNTOPEN: filetype %i does not match file extension (%s).\n',h.type,CNT.FILE.Ext);
end;
CNT.TYPE = 'EEG';
CNT.SPR = h.pnts;
CNT.NRec = h.compsweeps;
CNT.AS.spb = CNT.NS*CNT.SPR; % Samples per Block
% Sometimes h.eventtablepos seems to need a correction, also I've not figured out why.
% The Manual SCAN 4.2 Vol II, Page Headers-7 refers to "286 SCAN manual". Maybe this could bring a clarification.
% Anyway, the following code deals with the problem.
CNT.AS.bpb = -1;
if CNT.CNT.minor_revision==12,
CNT.AS.bpb = 2*CNT.AS.spb+1+2+2+4+2+2;
CNT.GDFTYP = 3; %'int16';
% correct(?) eventtablepos
h.eventtablepos = CNT.HeadLen + CNT.NRec*CNT.AS.bpb;
else
if CNT.CNT.minor_revision~=16,
fprintf(CNT.FILE.stderr,'Warning CNTOPEN: EEG-Format Minor-Revision %i not tested.\n',CNT.CNT.minor_revision);
end;
tmp = (CNT.AS.spb*2+1+2+2+4+2+2);
if (h.eventtablepos-CNT.HeadLen)==(tmp*CNT.NRec),
CNT.AS.bpb = tmp;
CNT.GDFTYP = 3; %'int16';
end;
tmp = (CNT.AS.spb*4+1+2+2+4+2+2);
if (h.eventtablepos-CNT.HeadLen)==(tmp*CNT.NRec),
CNT.AS.bpb = tmp;
CNT.GDFTYP = 5; %'int32';
end;
end;
if CNT.AS.bpb < 0;
fprintf(CNT.FILE.stderr,'Error CNTOPEN: header information of file %s corrupted.\n',CNT.FileName);
fclose(CNT.FILE.FID);
CNT.FILE.FID = -1;
return;
end;
CNT.Calib = [-[e.baseline];eye(CNT.NS)]*diag([e.sensitivity].*[e.calib]/204.8);
CNT.AS.endpos = CNT.NRec;
CNT.FLAG.TRIGGERED = 1;
CNT.Dur = CNT.SPR/CNT.SampleRate;
elseif strcmp(upper(CNT.FILE.Ext),'CNT'),
CNT.TYPE = 'CNT';
%CNT.SPR = h.numsamples;
CNT.AS.bpb = CNT.NS*2; % Bytes per Block
CNT.AS.spb = CNT.NS; % Samples per Block
CNT.AS.EVENTTABLEPOS = h.eventtablepos;
CNT.SPR = (h.eventtablepos-CNT.HeadLen)/CNT.AS.bpb;
CNT.AS.endpos = CNT.SPR;
CNT.NRec = 1;
CNT.Calib = [-[e.baseline];eye(CNT.NS)]*diag([e.sensitivity].*[e.calib]/204.8);
CNT.FLAG.TRIGGERED = 0;
CNT.Dur = 1/CNT.SampleRate;
%%%%% read event table
CNT.EVENT.TYP = [];
CNT.EVENT.POS = [];
CNT.EVENT.N = h.numevents;
CNT.EVENT.TeegSize = 0;
status = fseek(CNT.FILE.FID,h.eventtablepos,'bof');
if ~status,
[CNT.EVENT.TeegType,c1] = fread(fid,1,'uchar');
[CNT.EVENT.TeegSize,c2] = fread(fid,1,'int32');
[CNT.EVENT.TeegOffset,c3] = fread(fid,1,'int32');
end;
k = 0;
K = 1;
TEEG = [];
while (K < CNT.EVENT.TeegSize),
k = k+1;
Teeg.Stimtype = fread(fid,1,'int16');
Teeg.Keyboard = fread(fid,1,'char');
tmp = fread(fid,1,'uint8');
Teeg.KeyPad = rem(tmp,16); %bitand(tmp,15);
Teeg.Accept = (fix(tmp/16)*16)==13; % (bitshift(tmp,-4)==13); % 0xd = accept, 0xc = reject
Teeg.Offset = fread(fid,1,'int32');
K = K + 8;
if CNT.EVENT.TeegType==2,
Teeg.Type = fread(fid,1,'int16');
Teeg.Code = fread(fid,1,'int16');
Teeg.Latency = fread(fid,1,'float32');
Teeg.EpochEvent = fread(fid,1,'char');
Teeg.Accept2 = fread(fid,1,'char');
Teeg.Accuracy = fread(fid,1,'char');
K = K + 11;
end;
if k==1,
TEEG = Teeg;
else
TEEG(k) = Teeg;
end;
end;
if length(TEEG) > 0,
CNT.EVENT.TYP = [TEEG(:).Stimtype]';
CNT.EVENT.POS = ([TEEG(:).Offset]' - CNT.HeadLen) ./ CNT.AS.bpb;
CNT.EVENT.N = length(CNT.EVENT.TYP);
end;
end;
% set file pointer to the beginning of the data block
status = fseek(CNT.FILE.FID, CNT.HeadLen, 'bof');
if status,
fprintf(CNT.FILE.stderr,'Warning CNTOPEN: I/O error in file %s\n',CNT.FileName);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -