📄 sread.m
字号:
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate*NoS,size(HDR.data,1)-HDR.FILE.POS);
S = HDR.data(HDR.FILE.POS + (1:nr), HDR.InChanSelect);
HDR.FILE.POS = HDR.FILE.POS + nr;
elseif strcmp(HDR.TYPE,'SCP'),
if nargin>2,
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate * NoS, size(HDR.data,1) - HDR.FILE.POS);
S = HDR.data(HDR.FILE.POS + (1:nr), HDR.InChanSelect);
HDR.FILE.POS = HDR.FILE.POS + nr;
elseif strcmp(HDR.TYPE,'GTEC'),
if nargin>2,
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate * NoS, size(HDR.data,1) - HDR.FILE.POS);
S = HDR.data(HDR.FILE.POS + (1:nr), HDR.InChanSelect);
HDR.FILE.POS = HDR.FILE.POS + nr;
elseif strcmp(HDR.TYPE,'SIGIF'),
if nargin==3,
HDR.FILE.POS = StartPos;
end;
S = [];
for k = 1:min(NoS,HDR.NRec-HDR.FILE.POS),
HDR.FILE.POS = HDR.FILE.POS + 1;
fseek(HDR.FILE.FID, HDR.Block.Pos(HDR.FILE.POS), 'bof');
if HDR.FLAG.TimeStamp,
HDR.Frame(k).TimeStamp = fread(HDR.FILE.FID,[1,9],'char');
end;
if HDR.FLAG.SegmentLength,
HDR.Block.Length(k) = fread(HDR.FILE.FID,1,'uint16'); %#26
fseek(HDR.FILE.FID,HDR.Block.Length(k)*H1.Bytes_per_Sample,'cof');
else
tmp = HDR.Segment_separator-1;
[dat,c] = fread(HDR.FILE.FID,[HDR.NS,HDR.Block.Length/HDR.NS],HDR.GDFTYP);
[tmpsep,c] = fread(HDR.FILE.FID,1,HDR.GDFTYP);
if (tmpsep~=HDR.Segment_separator);
fprintf(HDR.FILE.stderr,'Error SREAD Type=SIGIF: blockseparator not found\n');
end;
end;
S = [S; dat(HDR.InChanSelect,:)'];
end;
elseif strcmp(HDR.TYPE,'CTF'),
if nargin>2,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.NS*HDR.SPR*4*StartPos,'bof');
HDR.FILE.POS = StartPos;
end;
nr = min(NoS, HDR.NRec - HDR.FILE.POS);
S = []; count = 0;
for k = 1:nr,
%[tmp,c] = fread(HDR.FILE.FID, 1, 'int32')
[s,c] = fread(HDR.FILE.FID, [HDR.SPR, HDR.NS], 'int32');
S = [S; s(:,HDR.InChanSelect)];
count = count + c;
end;
HDR.FILE.POS = HDR.FILE.POS + count/(HDR.SPR*HDR.NS);
elseif strcmp(HDR.TYPE,'EEProbe-CNT'),
if nargin>2,
fseek(HDR.FILE.FID,HDR.SampleRate*HDR.AS.bpb,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate*NoS, HDR.SPR-HDR.FILE.POS);
try
% it appears to be a EEProbe file with continuous EEG data
tmp = read_eep_cnt(HDR.FileName, HDR.FILE.POS+1, HDR.FILE.POS+nr);
HDR.FILE.POS = HDR.FILE.POS + nr;
S = tmp.data(HDR.InChanSelect,:)';
catch
fprintf(HDR.FILE.stderr,'ERROR SREAD (EEProbe): Cannot open EEProbe-file, because read_eep_cnt.mex not installed. \n');
fprintf(HDR.FILE.stderr,'ERROR SREAD (EEProbe): You can downlad it from http://www.smi.auc.dk/~roberto/eeprobe/\n');
end
elseif strcmp(HDR.TYPE,'EEProbe-AVR'),
if nargin>2,
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SPR-HDR.FILE.POS,NoS*HDR.SampleRate);
S = HDR.EEP.data(HDR.FILE.POS+(1:nr),:);
HDR.FILE.POS = HDR.FILE.POS + nr;
elseif strcmp(HDR.TYPE,'BVbinmul'), %Brainvision, binary, multiplexed
if nargin>2,
fseek(HDR.FILE.FID,HDR.SampleRate*HDR.AS.bpb,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate*NoS, HDR.AS.endpos-HDR.FILE.POS);
[dat, count] = fread(HDR.FILE.FID, [HDR.NS, nr], gdfdatatype(HDR.GDFTYP));
% rename and transpose the data
S = dat(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
elseif strcmp(HDR.TYPE,'BVbinvec'), %Brainvision, binary, vectorized
S = [];
nr = min(HDR.SampleRate*NoS, HDR.AS.endpos-HDR.FILE.POS);
for chan = 1:length(HDR.InChanSelect);
fseek(HDR.FILE.FID,HDR.HeadLen + HDR.FILE.POS + HDR.AS.bpb/HDR.NS * HDR.SPR,'bof');
[s,count] = fread(HDR.FILE.FID,[nr,1],gdfdatatype(HDR.GDFTYP));
if count~=nr,
fprintf(2,'ERROR READ BV-bin-vec: \n');
return;
end;
S(:,chan) = s;
end
HDR.FILE.POS = HDR.FILE.POS + count;
elseif strcmp(HDR.TYPE,'BVascii'), %Brainvision, ascii
if nargin>2,
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate*NoS, HDR.AS.endpos-HDR.FILE.POS);
S = HDR.BV.data(HDR.FILE.POS+(1:nr),HDR.InChanSelect);
elseif strcmp(HDR.TYPE,'BrainVision'), %Brainvision, unknown
error('SREAD (BrainVision): unsupported fileformat for data');
elseif strcmp(HDR.TYPE,'SierraECG'), %% SierraECG 1.03 *.open.xml from PHILIPS
if ~isfield(HDR,'data');
[HDR.data,status] = str2double(HDR.XML.waveforms.parsedwaveforms);
if any(status)
error('SREAD: compressed SierraECG (Philips) format not supported')
end;
HDR.data = reshape(HDR.data,length(HDR.data)/HDR.NS,HDR.NS);
HDR.SPR = size(HDR.data,1);
else
% base64 - decoding
base64 = ['A':'Z','a':'z','0':'9','+','/'];
decode64 = repmat(nan,256,1);
decode64(abs(base64)) = 0:63;
tmp = decode64(HDR.XML.waveforms.parsedwaveforms);
tmp(isnan(tmp)) = [];
n = length(tmp);
tmp = reshape([tmp;zeros(mod(n,4),1)], 4, ceil(n/4));
t1 = tmp(1,:)*4 + floor(tmp(2,:)/16);
t2 = mod(tmp(2,:),16)*16 + floor(tmp(3,:)/4);
t3 = mod(tmp(3,:),4)*64 + tmp(4,:);
tmp = reshape([t1,t2,t3], ceil(n/4)*3, 1);
end;
if nargin>2,
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate*NoS, HDR.SPR-HDR.FILE.POS);
S = HDR.data(HDR.FILE.POS+(1:nr),HDR.InChanSelect);
HDR.FILE.POS = HDR.FILE.POS + nr;
elseif strcmp(HDR.TYPE,'XML-FDA'), % FDA-XML Format
if ~isfield(HDR,'data');
tmp = HDR.XML.component.series.derivation;
if isfield(tmp,'Series');
tmp = tmp.Series.component.sequenceSet.component;
else % Dovermed.CO.IL version of format
tmp = tmp.derivedSeries.component.sequenceSet.component;
end;
for k = 1:length(HDR.InChanSelect);
HDR.data(:,k) = str2double(tmp{HDR.InChanSelect(k)+1}.sequence.value.digits)';
end;
HDR.SPR = size(HDR.data,1);
end;
if nargin>2,
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate*NoS, HDR.SPR-HDR.FILE.POS);
S = HDR.data(HDR.FILE.POS+(1:nr),:);
HDR.FILE.POS = HDR.FILE.POS + nr;
elseif strcmp(HDR.TYPE,'FIF'),
% some parts of this code are from Robert Oostenveld,
if ~(exist('rawdata')==3 & exist('channames')==3)
error('cannot find Neuromag import routines on your Matlab path (see http://boojum.hut.fi/~kuutela/meg-pd)');
end
if nargin<3,
StartPos = HDR.FILE.POS/HDR.SampleRate;
end
if nargin>2,
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
t1 = rawdata('goto', HDR.FILE.POS/HDR.SPR);
t2 = t1;
dat = [];
count = 0;
status = 'ok';
while (t2<(StartPos + NoS)) & ~strcmp(status,'eof'),
[buf, status] = rawdata('next');
if ~strcmp(status, 'ok')
error('error reading selected data from fif-file');
else
count = count + size(buf,2);
dat = [dat; buf(HDR.InChanSelect,:)'];
end
t2 = rawdata('t');
end
t = t1*HDR.SampleRate+1:t2*HDR.SampleRate;
ix = (t>StartPos*HDR.SampleRate) & (t<=(StartPos+NoS)*HDR.SampleRate);
S = dat(ix,HDR.InChanSelect);
HDR.FILE.POS = t2*HDR.SampleRate;
else
fprintf(2,'Error SREAD: %s-format not supported yet.\n', HDR.TYPE);
end;
if ~HDR.FLAG.UCAL,
% S = [ones(size(S,1),1),S]*HDR.Calib([1;1+HDR.InChanSelect],:);
% perform the previous function more efficiently and
% taking into account some specialities related to Octave sparse
% data.
if 1; %exist('OCTAVE_VERSION')
% force octave to do a sparse multiplication
% the difference is NaN*sparse(0) = 0 instead of NaN
% this is important for the automatic overflow detection
Calib = full(HDR.Calib); % Octave can not index structed sparse matrix
tmp = zeros(size(S,1),size(Calib,2)); % memory allocation
for k = 1:size(Calib,2),
chan = find(Calib(1+HDR.InChanSelect,k));
tmp(:,k) = S(:,chan) * Calib(1+HDR.InChanSelect(chan),k) + Calib(1,k);
end
S = tmp;
else
% S = [ones(size(S,1),1),S]*HDR.Calib([1;1+HDR.InChanSelect],:);
% the following is the same as above but needs less memory.
S = S * HDR.Calib(1+HDR.InChanSelect,:);
for k = 1:size(HDR.Calib,2),
S(:,k) = S(:,k) + HDR.Calib(1,k);
end;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -