⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cntopen.m

📁 matlab数字信号处理工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
        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 + -