📄 sread.m
字号:
function [S,HDR] = sread(HDR,NoS,StartPos)
% SREAD loads selected seconds of a signal file
%
% [S,HDR] = sread(HDR [,NoS [,StartPos]] )
% NoS Number of seconds, default = 1 (second)
% StartPos Starting position, if not provided the following data is read continously from the EDF file.
% no reposition of file pointer is performed
%
% HDR=sopen(Filename,'r',CHAN);
% [S,HDR] = sread(HDR, NoS, StartPos)
% reads NoS seconds beginning at StartPos
%
% [S,HDR] = sread(HDR, inf)
% reads til the end starting at the current position
%
% [S,HDR] = sread(HDR, N*HDR.Dur)
% reads N trials of an BKR file
%
%
% See also: fread, SREAD, SWRITE, SCLOSE, SSEEK, SREWIND, STELL, SEOF
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or (at your option) any later version.
%
% 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. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
% $Revision: 1.26 $
% $Id: sread.m,v 1.26 2004/09/09 15:21:37 schloegl Exp $
% (C) 1997-2004 by Alois Schloegl <a.schloegl@ieee.org>
% This is part of the BIOSIG-toolbox http://biosig.sf.net/
S = [];
if nargin<2, NoS = inf; end;
if NoS<0,
fprintf(HDR.FILE.stderr,'Error SREAD: NoS must be non-negative\n');
return;
end;
if (nargin==3)
if (StartPos<0),
fprintf(HDR.FILE.stderr,'Error SREAD: StartPos must be non-negative\n');
return;
end;
end;
if strcmp(HDR.TYPE,'EDF') | strcmp(HDR.TYPE,'BDF') | strcmp(HDR.TYPE,'GDF') ,
if nargin<3,
[S,HDR] = sdfread(HDR, NoS );
else
[S,HDR] = sdfread(HDR, NoS ,StartPos);
end;
if strcmp(HDR.TYPE,'GDF'), % overflow detection
for k = 1:length(HDR.InChanSelect),
ix = (S(:,k)>=HDR.DigMax(HDR.InChanSelect(k))) | (S(:,k)<=HDR.DigMin(HDR.InChanSelect(k)));
S(ix,k) = NaN;
end;
end;
elseif strmatch(HDR.TYPE,{'BKR'}),
if nargin==3,
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,HDR.SampleRate*NoS],'int16');
if count,
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
S(S==HDR.SIE.THRESHOLD(1)) = NaN; % Overflow detection
end;
elseif strmatch(HDR.TYPE,{'ISHNE','RG64'}),
if nargin==3,
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,HDR.SampleRate*NoS],'int16');
if count,
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
end;
elseif strcmp(HDR.TYPE,'SMA'),
if nargin==3,
fseek(HDR.FILE.FID,HDR.HeadLen+HDR.SampleRate*HDR.AS.bpb*StartPos,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
tmp = min(NoS*HDR.SampleRate,(HDR.AS.endpos-HDR.FILE.POS));
[S,count] = fread(HDR.FILE.FID,[HDR.NS,tmp],'float32'); % read data frame
tmp = HDR.NS*tmp;
if count < tmp,
fprintf(HDR.FILE.stderr,'Warning SREAD SMA: only %i out of %i samples read\n',count/HDR.NS,tmp/HDR.NS);
end;
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
HDR.SMA.events = diff(sign([HDR.Filter.T0',S(HDR.SMA.EVENT_CHANNEL,:)]-HDR.SMA.EVENT_THRESH))>0;
HDR.EVENT.POS = find(HDR.SMA.events);
HDR.EVENT.TYP = HDR.SMA.events(HDR.EVENT.POS);
HDR.EVENT.N = length(HDR.EVENT.POS);
if size(S,2) > 0,
HDR.Filter.T0 = S(HDR.SMA.EVENT_CHANNEL,size(S,2))';
end;
elseif strcmp(HDR.TYPE,'RDF'),
S = [];
if nargin>2,
HDR.FILE.POS = StartPos;
end;
POS = HDR.FILE.POS;
NoSeg = min(NoS,length(HDR.Block.Pos)-HDR.FILE.POS);
count = 0;
S = zeros(NoSeg*HDR.SPR, length(HDR.InChanSelect));
for k = 1:NoSeg,
fseek(HDR.FILE.FID,HDR.Block.Pos(POS+k),-1);
% Read nchans and block length
tmp = fread(HDR.FILE.FID,34+220,'uint16');
%fseek(HDR.FILE.FID,2,0);
nchans = tmp(2); %fread(HDR.FILE.FID,1,'uint16');
%fread(HDR.FILE.FID,1,'uint16');
block_size = tmp(4); %fread(HDR.FILE.FID,1,'uint16');
%ndupsamp = fread(HDR.FILE.FID,1,'uint16');
%nrun = fread(HDR.FILE.FID,1,'uint16');
%err_detect = fread(HDR.FILE.FID,1,'uint16');
%nlost = fread(HDR.FILE.FID,1,'uint16');
nevents = tmp(9); %fread(HDR.FILE.FID,1,'uint16');
%fseek(HDR.FILE.FID,50,0);
[data,c] = fread(HDR.FILE.FID,[nchans,block_size],'int16');
%S = [S; data(HDR.InChanSelect,:)']; % concatenate data blocks
S((k-1)*HDR.SPR+(1:c/nchans),:) = data(HDR.InChanSelect,:)';
count = count + c;
end;
HDR.FILE.POS = HDR.FILE.POS + NoSeg;
elseif strcmp(HDR.TYPE,'LABVIEW'),
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],'int32');
if count,
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
end;
elseif strcmp(HDR.TYPE,'alpha'),
if nargin==3,
POS = HDR.SampleRate*HDR.AS.bpb*StartPos;
if POS~=ceil(POS),
fprintf(HDR.FILE.stderr,'Error SREAD (alpha): starting position is non-integer\n');
return;
end
fseek(HDR.FILE.FID,HDR.HeadLen + POS,'bof');
HDR.FILE.POS = HDR.SampleRate*StartPos;
end;
nr = min(HDR.SampleRate*NoS, HDR.SPR-HDR.FILE.POS)*HDR.AS.bpb;
if (nr - round(nr)) < .01,
nr = round(nr);
else
fprintf(HDR.FILE.stderr,'Error SREAD (alpha): can not deal with odd number of samples \n');
return;
end
if HDR.bits==12,
[s,count] = fread(HDR.FILE.FID,[3,nr/3],'uint8');
s(1,:) = s(1,:)*16 + floor(s(2,:)/16);
s(3,:) = s(3,:)+ mod(s(2,:),16)*256;
s = reshape(s([1,3],:),2*size(s,2),1);
s = s - (s>=2^11)*2^12;
nr = floor(length(s)/HDR.NS);
S = reshape(s(1:nr*HDR.NS),HDR.NS,nr);
count = count*2/3;
elseif HDR.bits==16,
[S,count] = fread(HDR.FILE.FID,[HDR.NS,nr],'int16');
elseif HDR.bits==32,
[S,count] = fread(HDR.FILE.FID,[HDR.NS,nr],'int32');
end;
if count,
S = S(HDR.InChanSelect,:)';
HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;
end;
elseif strcmp(HDR.TYPE,'MIT'),
if nargin==3,
fseek(HDR.FILE.FID,HDR.SampleRate*HDR.AS.bpb*StartPos,'bof');
tmp = HDR.SampleRate*StartPos;
if HDR.FILE.POS~=tmp,
HDR.mode8.accu = zeros(1,HDR.NS);
HDR.mode8.valid= 0;
end;
end;
if HDR.FILE.POS==0,
HDR.mode8.accu = zeros(1,HDR.NS);
HDR.mode8.valid= 1;
end;
DataLen = NoS*HDR.SampleRate;
if HDR.VERSION == 212,
[A,count] = fread(HDR.FILE.FID, [HDR.AS.bpb, DataLen], 'uint8'); % matrix with 3 rows, each 8 bits long, = 2*12bit
A = A'; DataLen = count/HDR.AS.bpb;
for k = 1:ceil(HDR.NS/2),
S(:,2*k-1) = mod(A(:,3*k+[-2:-1])*(2.^[0;8]),2^12);
S(:,2*k) = mod(floor(A(:,3*k-1)/16),16)*256+A(:,3*k);
S = S(:,1:HDR.NS);
S = S - 2^12*(S>=2^11); % 2-th complement
end
elseif HDR.VERSION == 310,
[A,count] = fread(HDR.FILE.FID, [HDR.AS.bpb/2, DataLen], 'uint16'); % matrix with 3 rows, each 8 bits long, = 2*12bit
A = A'; DataLen = count/HDR.AS.bpb*2;
for k = 1:ceil(HDR.NS/3),
k1=3*k-2; k2=3*k-1; k3=3*k;
S(:,3*k-2) = floor(mod(A(:,k*2-1),2^12)/2);
S(:,3*k-1) = floor(mod(A(:,k*2),2^12)/2);
S(:,3*k ) = floor(A(:,k*2-1)*(2^-11)) + floor(A(:,k*2)*(2^-11))*2^5;
S = S(:,1:HDR.NS);
S = S - 2^10*(S>=2^9); % 2-th complement
end;
elseif HDR.VERSION == 311,
[A,count] = fread(HDR.FILE.FID, [HDR.AS.bpb/4, DataLen], 'uint32'); % matrix with 3 rows, each 8 bits long, = 2*12bit
A = A'; DataLen = count/HDR.AS.bpb*4;
for k = 1:ceil(HDR.NS/3),
S(:,3*k-2) = mod(A(:,k),2^11);
S(:,3*k-1) = mod(floor(A(:,k)*2^(-11)),2^11);
S(:,3*k) = mod(floor(A(:,k)*2^(-22)),2^11);
S = S(:,1:HDR.NS);
S = S - 2^10*(S>=2^9); % 2-th complement
end;
elseif HDR.VERSION == 8,
[S,count] = fread(HDR.FILE.FID, [HDR.NS,DataLen], 'int8');
S = S'; DataLen = count/HDR.NS;
if HDR.FILE.POS==0,
HDR.mode8.accu = zeros(1,HDR.NS);
HDR.mode8.valid= 1;
end;
if ~HDR.mode8.valid;
fprintf(2,'Warning EDFREAD: unknown offset (TYPE=MIT, mode=8) \n');
else
S(1,:) = S(1,:) + HDR.mode8.accu;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -