read_erpss.m
来自「含有多种ICA算法的eeglab工具箱」· M 代码 · 共 212 行
M
212 行
% read_erpss() - read an compressed and uncompressed ERPSS file formats % (.RAW or .RDF) % % Usage: % >> [data,events,header] = read_erpss(filename);% Inputs:% filename - Name of uncompressed ERPSS data file (including extension) %% Outputs:% data - Data array [nchans samples]% events - Event information structure:% events.sample_offset[]: Event offsets in samples% from the first sample (0)% events.event_code[] Event codes (integers: 1-128)% header - header information structure:% header.nchans Number of channels% header.nframes Number of data frames (i.e., samples, timepoints)%% Notes: ERPSS format was developed by Jonathan Hansen at the Hillyard lab % at UCSD (http://sdepl.ucsd.edu/erpss/).%% Authors: Jeng-Ren Duann & Arnaud Delorme, CNL/Salk & INC/UCSD, 2002-12-12% with help from Andrey Vankov% $Log: read_erpss.m,v $% Revision 1.20 2003/12/10 17:00:03 arno% comment%% Revision 1.19 2003/11/19 03:05:22 arno% debuging calibration%% Revision 1.18 2003/06/28 00:28:38 arno% (implmenting new header info% and rescaling to mircouV%function [eeg,ev,header] = read_erpss(filename) eeg = []; ev = []; header = []; tmptag = hex2dec('f0aa55'); fp = fopen(filename,'rb','ieee-le'); if fp == -1, error('read_erpss(): Cannot open data file...!'); else disp('File opened:'); end fseek(fp,4,-1); compressed = fread(fp,1,'uint16'); if compressed, disp('Reading compressed data: if an error occurs while calling the MEX'); disp('function, try recompiling it for your platform "mex decompresserpss.cc"'); complendian = 0; switch computer case {'MAC2','SUN4','SOL2','SGI','SGI64'}, complendian = 1; case {'PCWIN','LNX86','GLNX86'}, complendian = 0; otherwise disp('Disp: endian of computer not known, set to PC (windows/linux) by default'); end; end; fseek(fp,6,-1); header.nchans = fread(fp,1,'uint16'); cnt = 0; ev_cnt = 0; firstpass = 1; % first pass, scan data totalsize = 0; totblocks = 0; disp('finding total number of blocks ...'); while(~feof(fp)), tag = fread(fp,1,'uint32'); if length(tag) == 0, break; end if tag == tmptag, cnt = cnt + 1; % Read nchans and block length fseek(fp,2,0); nchans = fread(fp,1,'uint16'); fread(fp,1,'uint16'); block_size = fread(fp,1,'uint16'); % Read events if ~firstpass if compressed fseek(fp,10,0); block_size_compress = fread(fp,1,'uint16'); fseek(fp,48+110*4+block_size_compress*2,0); else fseek(fp,60+110*4+nchans*block_size*2,0); end; else if compressed fseek(fp,10,0); block_size_compress = double(fread(fp,1,'uint16')); header.amplif = double(fread(fp,1,'uint32')); header.clock_freq = double(fread(fp,1,'uint32')); header.divider = double(fread(fp,1,'uint32')); header.ad_range_mv = double(fread(fp,1,'uint32')); header.ad_bits = double(fread(fp,1,'uint32')); header.nsteps = double(fread(fp,1,'uint32')); fseek(fp,24+110*4+block_size_compress*2,0); else fseek(fp,12,0); header.amplif = double(fread(fp,1,'uint32')); header.clock_freq = double(fread(fp,1,'uint32')); header.divider = double(fread(fp,1,'uint32')); header.ad_range_mv = double(fread(fp,1,'uint32')); header.ad_bits = double(fread(fp,1,'uint32')); header.nsteps = double(fread(fp,1,'uint32')); fseek(fp,24+110*4+nchans*block_size*2,0); end; if header.divider & header.clock_freq header.srate = header.clock_freq/header.divider/header.nsteps; header.rescaleuv = header.ad_range_mv*1000 / header.amplif / pow2(header.ad_bits); fprintf('Sampling rate is %4.4f\n', header.srate); end; firstpass = 0; end; totalsize = totalsize + block_size; %else % fprintf('.'); end totblocks = totblocks+1; end eeg = zeros(header.nchans, totalsize); % second pass, read data disp(['Reading blocks (out of ' num2str(cnt) '):']); cnt = 0; totalsize = 0; fclose(fp); fp = fopen(filename,'rb','ieee-le'); fseek(fp,552,-1); temp = fread(fp,1,'uint16'); if ~isfield(header, 'srate') header.srate = 1000000.0/temp; end; fseek(fp,6,-1); header.nchans = fread(fp,1,'uint16'); while(~feof(fp)), tag = fread(fp,1,'uint32'); if length(tag) == 0, break; end if tag == tmptag, cnt = cnt + 1; if ~mod(cnt,100) fprintf('%d ', cnt); end; if ~mod(cnt,1000) fprintf('\n'); end; % Read nchans and block length fseek(fp,2,0); nchans = fread(fp,1,'uint16'); fread(fp,1,'uint16'); block_size = fread(fp,1,'uint16'); ndupsamp = fread(fp,1,'uint16'); nrun = fread(fp,1,'uint16'); err_detect = fread(fp,1,'uint16'); nlost = fread(fp,1,'uint16'); nevents = fread(fp,1,'uint16'); block_size_compress = fread(fp,1,'uint16'); %if cnt == 3, return; end; % Read events tmppos = ftell(fp); fseek(fp,48,0); for i=1:nevents, samp_off = fread(fp,1,'uint8'); cond_code = fread(fp,1,'uint8'); ev_code = fread(fp,1,'uint16'); ev_cnt = ev_cnt + 1; ev(ev_cnt).sample_offset = samp_off + (cnt-1)*block_size+1; %+1 for Matlab ev(ev_cnt).event_code = ev_code; end fseek(fp,4*(110-nevents),0); if compressed data = uint8(fread(fp,2*block_size_compress,'uchar')); data = decompresserpss(data, nchans, block_size, complendian); else data = fread(fp,nchans*block_size,'int16'); end; try, eeg(:,totalsize+1:totalsize+length(data)/nchans) = reshape(data,nchans,length(data)/nchans); % concatenate data blocks totalsize = totalsize + length(data)/nchans; catch, fprintf('\nWarning: block %d truncated, skipped\n', cnt); end; end end fprintf('\n'); % rescale to uv % -------------- if isfield(header, 'rescaleuv') & header.rescaleuv ~= 0 disp('Rescaling data to microVolt'); eeg = eeg*header.rescaleuv; end; fclose(fp); header.nframes = size(eeg,2);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?