📄 sread.m
字号:
S = cumsum(S);
HDR.mode8.accu = S(size(S,1),:);
elseif HDR.VERSION == 80,
[S,count] = fread(HDR.FILE.FID, [HDR.NS,DataLen], 'uint8');
S = S'-128; DataLen = count/HDR.NS;
elseif HDR.VERSION == 160,
[S,count] = fread(HDR.FILE.FID, [HDR.NS,DataLen], 'uint16');
S = S'-2^15; DataLen = count/HDR.NS;
elseif HDR.VERSION == 16,
[S,count] = fread(HDR.FILE.FID, [HDR.NS,DataLen], 'int16');
S = S'; DataLen = count/HDR.NS;
elseif HDR.VERSION == 61,
[S,count] = fread(HDR.FILE.FID, [HDR.NS,DataLen], 'int16');
S = S'; DataLen = count/HDR.NS;
else
fprintf(2, 'ERROR MIT-ECG: format %i not supported.\n',HDR.VERSION);
end;
HDR.FILE.POS = HDR.FILE.POS + DataLen;
S = S(:,HDR.InChanSelect);
elseif strcmp(HDR.TYPE,'TMS32'),
tmp = NoS*HDR.SampleRate/HDR.SPR;
if tmp~=round(tmp)
fprintf(2,'ERROR: NoS %f is not multiple of TMS32-blocksize %f. This is not supported yet.\n',NoS,HDR.SPR/HDR.SampleRate);
return;
end;
NoBlks = min(tmp,HDR.NRec-HDR.FILE.POS);
if nargin==3,
tmp = StartPos*HDR.SampleRate/HDR.SPR;
if tmp~=round(tmp)
fprintf(2,'ERROR: StartPos %f is not multiple of TMS32-blocksize %f. This is not supported yet.\n',StartPos,HDR.SPR/HDR.SampleRate);
return;
end;
fseek(HDR.FILE.FID,HDR.HeadLen+StartPos*HDR.SampleRate/HDR.SPR*(HDR.AS.bpb+86),'bof');
HDR.FILE.POS = HDR.SampleRate/HDR.SPR*StartPos;
end;
S = [];
for k = 1:NoBlks,
if all(HDR.GDFTYP==HDR.GDFTYP(1))
hdr = fread(HDR.FILE.FID,86,'char');
[s,c] = fread(HDR.FILE.FID,[HDR.NS,HDR.SPR],gdfdatatype(HDR.GDFTYP(1)));
S = [S;s'];
HDR.FILE.POS = HDR.FILE.POS + 1;
else
hdr = fread(HDR.FILE.FID,86,'char');
s = zeros(HDR.SPR,HDR.NS);
for k1 = 1: HDR.SPR,
for k2 = 1: HDR.NS,
[s(k1,k2),count] = fread(HDR.FILE.FID,1,gdfdatatype(HDR.GDFTYP(k2)));
end;
end;
S = [S;s'];
HDR.FILE.POS = HDR.FILE.POS + 1;
end;
end;
S = S(:,HDR.InChanSelect);
elseif strcmp(HDR.TYPE,'DEMG'),
if nargin==3,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.SampleRate*HDR.AS.bpb*StartPos,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
[S,count] = fread(HDR.FILE.FID,[HDR.NS,HDR.SampleRate*NoS],gdfdatatype(HDR.GDFTYP));
if count,
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
end;
elseif strcmp(HDR.TYPE,'ACQ'),
if nargin==3,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.SampleRate*HDR.AS.bpb*StartPos,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
count = 0;
if all(HDR.GDFTYP==HDR.GDFTYP(1)) & all(HDR.SPR==HDR.SPR(1))
[S,count] = fread(HDR.FILE.FID,[HDR.NS,HDR.SampleRate*NoS],gdfdatatype(HDR.GDFTYP(1)));
else
fprintf(HDR.FILE.FID,'Warning SREAD (ACQ): interleaved format not supported (yet).');
end;
if count,
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.AS.spb;
end;
elseif strcmp(HDR.TYPE,'CFWB'),
if nargin==3,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.SampleRate*HDR.AS.bpb*StartPos,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
[S,count] = fread(HDR.FILE.FID,[HDR.NS,HDR.SampleRate*NoS],gdfdatatype(HDR.GDFTYP));
if count,
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
end;
elseif strcmp(HDR.TYPE,'AIF') | strcmp(HDR.TYPE,'SND') | strcmp(HDR.TYPE,'WAV'),
if nargin==3,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.SampleRate*HDR.AS.bpb*StartPos,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
maxsamples = min(HDR.SPR,HDR.SampleRate*NoS)-HDR.FILE.POS;
if maxsamples>0,
[S,count] = fread(HDR.FILE.FID,[HDR.NS,maxsamples],gdfdatatype(HDR.GDFTYP));
else
S = []; count = 0;
end;
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
if ~HDR.FLAG.UCAL,
if isfield(HDR.FILE,'TYPE')
if HDR.FILE.TYPE==1,
S = mu2lin(S);
end;
end;
end;
elseif strcmp(HDR.TYPE,'EGI'),
if nargin==3,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.AS.bpb*StartPos,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
if HDR.FLAG.TRIGGERED,
NoS = min(NoS,(HDR.NRec-HDR.FILE.POS));
S = zeros(NoS*HDR.SPR,length(HDR.InChanSelect))+NaN;
for i = (1:NoS),
SegmentCatIndex(HDR.FILE.POS+i) = fread(HDR.FILE.FID,1,'uint16');
SegmentStartTime(HDR.FILE.POS+i) = fread(HDR.FILE.FID,1,'uint32');
[s,count] = fread(HDR.FILE.FID, [HDR.NS + HDR.EVENT.N, HDR.SPR], HDR.datatype);
tmp = (HDR.NS + HDR.EVENT.N) * HDR.SPR;
if count < tmp,
fprintf(HDR.FILE.stderr,'Warning SREAD EGI: only %i out of %i samples read\n',count,tmp);
end;
HDR.FILE.POS = HDR.FILE.POS + count/tmp;
if (HDR.EVENT.N > 0),
[HDR.EVENT.POS,HDR.EVENT.CHN,HDR.EVENT.TYP] = find(s(HDR.NS+1:size(s,1),:)');
HDR.EVENT.N = length(HDR.EVENT.POS);
end
S((i-1)*HDR.SPR + (1:size(s,2)),:) = s(HDR.InChanSelect,:)';
end;
else
[S,count] = fread(HDR.FILE.FID,[HDR.NS + HDR.EVENT.N, HDR.SampleRate*NoS],HDR.datatype);
tmp = (HDR.NS + HDR.EVENT.N) * HDR.SampleRate * NoS;
if count < tmp,
fprintf(HDR.FILE.stderr,'Warning SREAD EGI: only %i out of %i samples read\n',count,tmp);
end;
HDR.FILE.POS = HDR.FILE.POS + round(count/(HDR.NS + HDR.EVENT.N));
if (HDR.EVENT.N > 0),
[HDR.EVENT.POS,HDR.EVENT.CHN,HDR.EVENT.TYP] = find(S(HDR.NS+1:size(S,1),:)');
HDR.EVENT.N = length(HDR.EVENT.POS);
end
S = S(HDR.InChanSelect,:)';
end;
elseif strcmp(HDR.TYPE,'AVG'),
S = repmat(nan,HDR.SPR,HDR.NS);
count = 0;
for i = 1:HDR.NS,
[tmp,c] = fread(HDR.FILE.FID,5,'char'); % no longer used
count = count + c;
[S(:,i), c] = fread(HDR.FILE.FID,HDR.SPR,'float');
count = count + c*4;
end
S = S(:,HDR.InChanSelect);
HDR.FILE.POS = HDR.FILE.POS + count/HDR.AS.bpb;
elseif strcmp(HDR.TYPE,'COH'),
warning('.COH data not tested yet')
if prod(size(NoS))==1 & nargin>2,
rows = NoS; cols = StartPos;
elseif prod(size(NoS))==2
rows = NoS(1); cols = NoS(2);
else
fprintf(HDR.FILE.stderr,'Error SREAD mode=COH: invalid arguments.\n');
end;
fseek(HDR.FILE.FID,HDR.COH.directory(rows,cols)+8,'bof'); % skip over a small unused header of 8 bytes
sr = fread(HDR.FILE.FID, HDR.SPR, 'float32'); % read real part of coherence
si = fread(HDR.FILE.FID, HDR.SPR, 'float32'); % read imag part of coherence
S = sr + i * si;
elseif strcmp(HDR.TYPE,'CSA'),
warning('.CSA data not tested yet')
S = fread(HDR.FILE.FID, [HDR.NRec*(HDR.SPR+6)*HDR.NS], 'float32');
elseif strcmp(HDR.TYPE,'EEG'),
if nargin>2,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.AS.bpb*StartPos,'bof');
end;
NoS = min(NoS, HDR.NRec-HDR.FILE.POS);
S = zeros(NoS*HDR.SPR, length(HDR.InChanSelect));
count = 0;
for i = 1:NoS, %h.compsweeps,
h.sweep(i).accept = fread(HDR.FILE.FID,1,'uchar');
tmp = fread(HDR.FILE.FID,2,'ushort');
h.sweep(i).ttype = tmp(1);
h.sweep(i).correct = tmp(2);
h.sweep(i).rt = fread(HDR.FILE.FID,1,'float32');
tmp = fread(HDR.FILE.FID,2,'ushort');
h.sweep(i).response = tmp(1);
h.sweep(i).reserved = tmp(2);
[signal,c] = fread(HDR.FILE.FID, [HDR.NS,HDR.SPR], gdfdatatype(HDR.GDFTYP));
S(i*HDR.SPR+(1-HDR.SPR:0),:) = signal(HDR.InChanSelect,:)';
count = count + c;
end;
HDR.FILE.POS = HDR.FILE.POS + count/HDR.AS.spb;
elseif strcmp(HDR.TYPE,'CNT'),
if nargin>2,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.SampleRate*HDR.NS*StartPos*2,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
[S,count] = fread(HDR.FILE.FID, [HDR.NS, min(HDR.SampleRate*NoS, HDR.AS.endpos-HDR.FILE.POS)], 'int16');
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
elseif strcmp(HDR.TYPE,'MFER'),
if (HDR.FRAME.N ~= 1),
fprintf(2,'Warning MWFOPEN: files with more than one frame not implemented, yet.\n');
return;
end
N = 1;
if ~isfield(HDR,'data'),
fseek(HDR.FILE.FID,HDR.FRAME.POS(N),'bof');
[tmp,count] = fread(HDR.FILE.FID,HDR.FRAME.sz(N,1:2),gdfdatatype(HDR.FRAME.TYP(N)));
if isnan(HDR.NRec),
HDR.NRec = count/(HDR.SPR*HDR.NS);
end;
if count==(HDR.SPR*HDR.NS), %% alternate mode format
tmp = reshape(tmp,[HDR.SPR,HDR.NS]);
else
tmp = reshape(tmp,[HDR.SPR,HDR.NS,HDR.NRec]); % convert into 3-Dim
tmp = permute(tmp,[1,3,2]); % re-order dimensions
tmp = reshape(tmp,[HDR.SPR*HDR.NRec,HDR.NS]); % make 2-Dim
end;
HDR.data = tmp;
end;
if nargin>2,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -