ldcntb.m

来自「klhklhlk lknm shfsd sdf dsfsskbn smndns」· M 代码 · 共 262 行

M
262
字号
% ldcnt() - Load a Neuroscan continuous signal file.%% Usage:%   >> cnt = ldcnt(file, varargin) %% Inputs:%   filename - name of the file with extension%% Optional inputs:%  't1'         - start at time t1, default 0%  'sample1'    - start at sample1, default 0, overrides t1%  'lddur'      - duration of segment to load, default = whole file%  'ldnsamples' - number of samples to load, default = whole file, %                 overrides lddur%  'blockread'  - size of the blocks to read %% Outputs:%  cnt          - structure with the continuous data and other informations%% Bugs: %   Initially I couldn't get the continuous data as they would appear % using CNTTOASC or CNTTOBIN (www.neuro.com/neuroscan/download.html). % We don't have the code for these functions, so we don't really know how% the raw data is read. After extensive searches, I realized that for% my continuous CNT files, data was stored in blocks of 40 unsigned short % integers for each channel. I couldn't find where this parameter was % specified in the header, so I added the option 'blockread' and input % the number 40 by hand { cnt = ldcnt('file.cnt', 'blockread', 40) }.%   By default the size of the block is 1 and this work for most CNT% files.     %123456789012345678901234567890123456789012345678901234567890123456789012% This program is free software; you can redistribute it and/or% modify it.  % This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.% (C) a.c.james 2000-2001% 'blockread' by arno@salk.edu, Arnaud Delorme, CNL / Salk Institute, 2001function r=ldcnt(file, varargin)if nargin < 1	help ldcnt;	return;end;	% defaults[datdir,name,ext]=fileparts(file);if ~isempty(varargin)	r=struct(varargin{:});end;% add defaultswarning off;try, r.t1; catch, r.t1=0; endwarning on;try, r.avrefchan; catch, r.avrefchan=[]; endtry, r.blockread; catch, r.blockread=1; endif ~any(file=='.'), file=[file '.cnt']; enddisp(['Loading file ' file ' ...'])f=fopen(file, 'rb');if f==-1, error([file ' not found']), endr.filename=file;r.rev=freadat(f, 0, 20, 'text');i=find(r.rev==0); try, r.rev(i(1):end)=''; endr.nchannels=freadat(f, 370, 1, 'ushort');numsamples=freadat(f, 864, 1, 'long');  % not accurate, see calculation belowsamplespos=900 + 75*r.nchannels;event.tablepos=freadat(f, 886, 1, 'long');r.nsamples=(event.tablepos - samplespos)/(2*r.nchannels);r.rate=freadat(f, 376, 1, 'ushort');r.channeloffset=freadat(f, 932, 1, 'long');r.dt=1/r.rate;r.scale=freadat(f, 378, 1, 'double');r.ampsensitivity=freadat(f, 438, 1, 'float');r.refelectrode=freadat(f, 540, 10, 'text');if all(r.refelectrode==0),    %%disp('No reference electrode set in file, setting to CZ')   r.refelectrode(1:2)='CZ'; end% reading all parameters% ----------------------%a = freadat(f, 0, 1, 'short');%for i=1:470%	a = freadat(f, [], 1, 'short');%	fprintf('offset %3d value %3d\n', i*2, a);%	%if mod(i, 10) == 0, fprintf('\n'); end;  	%end;	% channel parameterschandat=freadat(f, 900, [75 r.nchannels], 'char');r.chan.names=setstr(chandat(1:9,:))';r.chan.reference=chandat(11,:);r.chan.gain=chandat(1+63,:);r.chan.baseline=freadat(f, 900+47, [1 r.nchannels], 'short', 75);r.chan.sensitivity=freadat(f, 900+59, [1 r.nchannels], 'float', 75);r.chan.calib=freadat(f, 900+71, [1 r.nchannels], 'float', 75);r.microvoltscalar=r.chan.sensitivity.*r.chan.calib/204.8;r.nevent=0;fseek(f, event.tablepos, 'bof');r.event.type=fread(f, 1, 'char');event.size=fread(f, 1, 'long');%event.offset=fread(f, 1, 'long')if r.event.type==1   event.bytes=8;elseif r.event.type==2   event.bytes=19;endr.nevent=event.size/event.bytes;r.event.stimtype=freadat(f, event.tablepos+9, r.nevent, 'short', event.bytes);  % stimtyper.event.keyboard=freadat(f, event.tablepos+9+2, r.nevent, 'uchar', event.bytes);  % keyboardr.event.keypadaccept=freadat(f, event.tablepos+9+3, r.nevent, 'uchar', event.bytes);  % keypadacceptoffset=freadat(f, event.tablepos+9+4, r.nevent, 'long', event.bytes);   % offsetr.event.frame=(offset-samplespos)/(r.nchannels*2);  % samplenumberr.event.time=r.event.frame/r.rate;try,   if r.ldheaderonly==1      return   endendtry,   sample1=r.sample1;   r.t1=r.sample1*r.dt;catch,   try       startstim=r.startstim;   % startstim = [stimtype occurrence]      j=find(r.event.stimtype==startstim(1));       if length(startstim)>1         j=j(startstim(2));       else         j=j(1);       end      r.t1=r.event.time(j);    end   sample1=round(r.t1/r.dt);   % first sample to read, zero-basedendstartpos=samplespos+sample1*2*r.nchannels;try, ldnsamples=r.ldnsamples; catch, try, ldnsamples=round(r.lddur/r.dt); catch, ldnsamples=r.nsamples; end, endtry, ldchan=r.ldchan; catch, ldchan=[1:r.nchannels]; endif ~isempty(ldchan) & ldchan==-1, ldchan=[1:r.nchannels]; endr.ldchan=ldchan;% clip events to read windowi=~(sample1<=r.event.frame & r.event.frame<sample1+ldnsamples);r.nevent=sum(~i);r.event.stimtype(i)=[];r.event.keyboard(i)=[];r.event.keypadaccept(i)=[];r.event.frame(i)=[];r.event.time(i)=[];try, ldraw=r.ldraw; catch, ldraw=0; end;if ~isempty(ldchan)   if length(ldchan)==r.nchannels      % all channels	  if r.blockread == 1	      	  dat=freadat(f, startpos, [r.nchannels ldnsamples], 'short'); 	  else     	  dat=zeros( length(ldchan), ldnsamples);      	  dat(:, 1:r.blockread)=freadat(f, startpos, [r.blockread r.nchannels], 'short')';		  counter = 1;	 		  while counter*r.blockread < ldnsamples	      	dat(:, counter*r.blockread+1:counter*r.blockread+r.blockread) = freadat(f, [], [40 r.nchannels], 'short')';			counter = counter + 1;		  end;	  end;	      r.dat=zeros( size(dat,2), length(ldchan));      if ldraw         r.dat=int16(dat)';      else         for j=1:length(ldchan)            baseline=r.chan.baseline(ldchan(j));            if baseline==0               r.dat(:,j)=r.microvoltscalar(ldchan(j))*dat(j,:)';            else               r.dat(:,j)=r.microvoltscalar(ldchan(j))*(dat(j,:)-baseline)';            end         end      end                  if ~isempty(r.avrefchan)         avref=0;         for j=1:length(r.avrefchan)            avref=avref + r.dat(:, r.avrefchan(j));         end         avref=1/length(r.avrefchan)*avref;                  for j=1:length(r.chan)            r.dat(:,j)=r.dat(:,j)-avref;         end      end         else      r.dat=zeros(ldnsamples, length(ldchan));      for j=1:length(ldchan)         dat=freadat(f, startpos+(ldchan(j)-1)*2, ldnsamples, 'short', (r.nchannels-1)*2);         r.dat(:,j)=r.microvoltscalar(ldchan(j))*(dat'-r.chan.baseline(ldchan(j)));      end   endendfclose(f);disp donefunction y=freadat(f, byte, siz, prec, offset)if nargin<5,    skip=0; else   switch prec   case 'double', s=8;   case 'float', s=4;   case 'long', s=4;   case 'ulong', s=4;   case 'int16', s=2;   case 'short', s=2;   case 'ushort', s=2;   case 'uchar', s=1;   case 'char', s=1;   case 'text', s=1;   case 'schar', s=1;   end   skip=offset-s;endif ~isempty(byte)	fseek(f, byte, 'bof');end;if ~strcmp(prec, 'text')   y=fread(f, siz, prec, skip);   %y1=fread(f, siz, 'uint8', skip);   %y2=fread(f, siz, 'uint8', skip);   %y = y1 + 256*y2;else   y=setstr(fread(f, siz, 'char', skip)');end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?