📄 sdfread.m
字号:
%y3=y3>0.094*(EDF.SPR(k)/EDF.Dur);
tmp(y3>0.094 | y2>0.079) = NaN;
S(bi(k)+1:bi(k+1),:) = tmp;
end;
elseif EDF.SIE.TH,
for k=1:length(InChanSelect),K=InChanSelect(k);
tmp = S(bi(k)+1:bi(k+1),:);
tmp(tmp <= EDF.SIE.THRESHOLD(K,1) | tmp>= EDF.SIE.THRESHOLD(K,2)) = NaN;
S(bi(k)+1:bi(k+1),:) = tmp;
end;
end;
if isfield(EDF.SIE,'RAW'),
if EDF.SIE.RAW,
fprintf(2,'Warning SDFREAD: ReReferenzing "R" is not possible in combination with RAW "W"\n');
end;
end;
else
if all(EDF.SPR(InChanSelect)==EDF.AS.MAXSPR)
if ~OptiMEM % but OptiSPEED
[s, count]=fread(EDF.FILE.FID,[EDF.AS.spb,Records],datatyp);
count = (count/EDF.AS.spb);
S = zeros(maxspr*count,length(InChanSelect)); %%%
for k=1:length(InChanSelect), K=InChanSelect(k);
S(:,k)=reshape(s(bi(K)+1:bi(K+1),:),maxspr*count,1); %RS%
end;
else %OptiMEM % but ~OptiSPEED
S = zeros(maxspr*Records,length(InChanSelect));%%%
idx0=0; count=0;
for l=1:ceil(Records/MAX_BLOCK_NUMBER),
tmp_norr=min(MAX_BLOCK_NUMBER,Records-count); % 16 = # of blocks read
[s, C]=fread(EDF.FILE.FID,[EDF.AS.spb,tmp_norr],datatyp);
C = C/EDF.AS.spb;
for k=1:length(InChanSelect), K=InChanSelect(k);
S(idx0+(1:maxspr*C),k) = reshape(s(bi(K)+1:bi(K+1),:),maxspr*C,1); %RS%
end;
idx0 = idx0 + maxspr*C;
count=count+C;
end;
S=S(1:idx0,:);
end;
%AFIR%
if EDF.SIE.AFIR
EDF.AFIR.xin=S(:,EDF.AFIR.channel1);
end;
% Overflow Check for EDF-all same sampling rate
if EDF.SIE.TH > 1,
for k=1:length(InChanSelect),K=InChanSelect(k);
tmp = S(:,k);
[y1,EDF.Block.z1{k}]=filter([1 -1],1,tmp,EDF.Block.z1{k});
[y2,EDF.Block.z2{k}]=filter(ones(1,EDF.SPR(K)/EDF.Dur)/(EDF.SPR(K)/EDF.Dur),1,y1==0,EDF.Block.z2{k});
%y2=y2>0.079*(EDF.SPR(k)/EDF.Dur);
[y3,EDF.Block.z3{k}]=filter(ones(1,EDF.SPR(K)/EDF.Dur)/(EDF.SPR(K)/EDF.Dur),1,(tmp>=EDF.SIE.THRESHOLD(K,2)) | (tmp<=EDF.SIE.THRESHOLD(K,1)),EDF.Block.z3{k});
%y3=y3>0.094*(EDF.SPR(k)/EDF.Dur);
%OFCHK(bi(k)+1:bi(k+1),:) = (y3>0.094) | (y2>0.079);
%OFCHK(:,K) = (y3>0.094) | (y2>0.079);
S(y3>0.094 | y2>0.079, k) = NaN;
end;
elseif EDF.SIE.TH,
for k=1:length(InChanSelect),K=InChanSelect(k);
%OFCHK(:,k)=(S(:,k) <= EDF.SIE.THRESHOLD(K,1)) | (S(:,K)>= EDF.SIE.THRESHOLD(K,2));
S(S(:,k) <= EDF.SIE.THRESHOLD(K,1) | S(:,k)>= EDF.SIE.THRESHOLD(K,2),k) = NaN;
end;
%OFCHK = OFCHK*abs(EDF.Calib([InChanSelect+1],:)~=0); %RS%
end;
else
if ~OptiMEM % but OptiSPEED
[s, count]=fread(EDF.FILE.FID,[EDF.AS.spb,Records],datatyp);
count = (count/EDF.AS.spb);
S = zeros(maxspr*count,length(InChanSelect));
for k=1:length(InChanSelect), K=InChanSelect(k);
tmp=reshape(s(bi(K)+1:bi(K+1),:),EDF.SPR(K)*count,1);
if EDF.SPR(K) == maxspr
S(:,k)=tmp;%reshape(tmp(:,ones(1,maxspr/EDF.SPR(K)))',maxspr*Records,1); %RS%
elseif EDF.SPR(K) > maxspr
if rem(EDF.SPR(K)/maxspr,1)==0
S(:,k)=rs(tmp,EDF.SPR(K),maxspr);
else
S(:,k)=rs(tmp,EDF.SIE.T); %(:,ones(1,maxspr/EDF.SPR(K)))',maxspr*Records,1); %RS%
end;
elseif EDF.SPR(K) < maxspr
S(:,k)=reshape(tmp(:,ones(1,maxspr/EDF.SPR(K)))',maxspr*count,1); %RS%
end;
end;
else %OptiMEM % but ~OptiSPEED
S = zeros(maxspr*Records,length(InChanSelect));
idx0=0; count=0;
for l=1:ceil(Records/MAX_BLOCK_NUMBER),
%while count < Records
tmp_norr = min(MAX_BLOCK_NUMBER,Records-count); % 16 = # of blocks read
[s, C]=fread(EDF.FILE.FID,[EDF.AS.spb,tmp_norr],datatyp);
C = C/EDF.AS.spb;
for k=1:length(InChanSelect), K=InChanSelect(k);
tmp0=reshape(s(bi(K)+1:bi(K+1),:),EDF.SPR(K)*C,1);
if EDF.SPR(K)==maxspr
S(idx0+(1:maxspr*C),k)=tmp0;%reshape(tmp(:,ones(1,maxspr/EDF.SPR(K)))',maxspr*Records,1); %RS%
elseif EDF.SPR(K)>maxspr
if rem(EDF.SPR(K)/maxspr,1)==0
S(idx0+(1:maxspr*C),k)=rs(tmp0,EDF.SPR(K),maxspr);
else
S(idx0+(1:maxspr*C),k)=rs(tmp0,EDF.SIE.T); %(:,ones(1,maxspr/EDF.SPR(K)))',maxspr*Records,1); %RS%
end;
elseif EDF.SPR(K)<maxspr
S(idx0+(1:maxspr*C),k)=reshape(tmp0(:,ones(1,maxspr/EDF.SPR(K)))',maxspr*C,1); %RS%
end;
end;
idx0 = idx0 + maxspr*C;
count= count+C;
end;
S=S(1:idx0,:);
end;
%AFIR%
if EDF.SIE.AFIR
%EDF.AFIR.xin=S(:,find(EDF.AFIR.channel1==InChanSelect));
EDF.AFIR.xin=S(:,EDF.AFIR.channel1);
end;
% Overflow Check for EDF with different sampling rates
if EDF.SIE.TH > 1,
fprintf(1,'Warning: this mode (FED) is not tested\n');
for k=1:length(InChanSelect),K=InChanSelect(k);
tmp = S(:,k);
[y1,EDF.Block.z1{k}]=filter([1 -1],1,tmp,EDF.Block.z1{k});
[y2,EDF.Block.z2{k}]=filter(ones(1,EDF.SPR(K)/EDF.Dur)/(EDF.SPR(K)/EDF.Dur),1,y1==0,EDF.Block.z2{k});
%y2=y2>0.079*(EDF.SPR(k)/EDF.Dur);
[y3,EDF.Block.z3{k}]=filter(ones(1,EDF.SPR(K)/EDF.Dur)/(EDF.SPR(K)/EDF.Dur),1,(tmp>=EDF.SIE.THRESHOLD(K,2)) | (tmp<=EDF.SIE.THRESHOLD(K,1)),EDF.Block.z3{k});
%y3=y3>0.094*(EDF.SPR(k)/EDF.Dur);
%OFCHK(bi(k)+1:bi(k+1),:) = (y3>0.094) | (y2>0.079);
%OFCHK(:,K) = (y3>0.094) | (y2>0.079);
S((y3>0.094) | (y2>0.079),k) = NaN;
end;
elseif EDF.SIE.TH,
for k=1:length(InChanSelect), K=InChanSelect(k);
%OFCHK(:,k)=(S(:,k) < EDF.SIE.THRESHOLD(K,1)) + (S(:,K)>= EDF.SIE.THRESHOLD(K,2));
S(S(:,k) < EDF.SIE.THRESHOLD(K,1) | S(:,k)>= EDF.SIE.THRESHOLD(K,2),k) = NaN;
end;
end;
end;
end;
end; % SDF
EDF.AS.numrec=count;
EDF.FILE.POS = EDF.AS.startrec + EDF.AS.numrec;
if EDF.AS.numrec~=Records,
fprintf(2,'Warning %s: %s only %i blocks instead of %i read\n',mfilename,EDF.FILE.Name,EDF.AS.numrec,Records);
end;
%%%%% Calibration of the signal
if Mode_RAW
if ~EDF.FLAG.UCAL, % Autocalib for RAW mode,
for k=1:EDF.NS,
S(bi(k)+1:bi(k+1),:)=S(bi(k)+1:bi(k+1),:)*EDF.Cal(k)+EDF.Off(k);
end;
end;
% else % calibration is done in SREAD.M
end;
%%%%% Removing ECG Templates
if EDF.SIE.TECG,
if (EDF.AS.startrec+EDF.AS.numrec)~=(ftell(EDF.FILE.FID)-EDF.HeadLen)/EDF.AS.bpb;
fprintf(2,'ERROR SDFREAD: Mode TECG requires update of EDF [S,EDF]=sdfread(EDF,...)\n');
EDF=sdftell(EDF);
end;
pulse = zeros(EDF.AS.numrec*EDF.SPR(12),1);
Index=[];
while EDF.TECG.idx(EDF.TECG.idxidx) <= EDF.FILE.POS*EDF.SPR(12)
Index=[Index EDF.TECG.idx(EDF.TECG.idxidx)-EDF.AS.startrec*EDF.SPR(12)];
EDF.TECG.idxidx=EDF.TECG.idxidx+1;
end;
if ~isempty(Index)
pulse(Index) = 1;
end;
%tmp=find(EDF.TECG.idx > EDF.AS.startrec*EDF.SPR(12) & EDF.TECG.idx <= EDF.FILE.POS*EDF.SPR(12));
%if ~isempty(tmp)
% pulse(EDF.TECG.idx(tmp)-EDF.AS.startrec*EDF.AS.MAXSPR) = 1;
%end;
for i=1:size(S,2),
[tmp,EDF.TECG.Z(:,i)] = filter(EDF.TECG.QRStemp(:,i),1,pulse,EDF.TECG.Z(:,i));
S(:,i)=S(:,i)-tmp; % corrects the signal
end;
end;
%%%%% Filtering
if EDF.SIE.FILT
for k=1:size(S,2);
[S(:,k),EDF.Filter.Z(:,k)]=filter(EDF.Filter.B,EDF.Filter.A,S(:,k),EDF.Filter.Z(:,k));
end;
end;
%AFIR%
% Implements Adaptive FIR filtering for ECG removal in EDF/SDF-tb.
% based on the Algorithm of Mikko Koivuluoma <k7320@cs.tut.fi>
if EDF.SIE.AFIR
e=zeros(size(S,1),length(EDF.AFIR.channel2));
xinre2 = [EDF.AFIR.x EDF.AFIR.xin'];
ddin=[EDF.AFIR.d; S]; %(:,EDF.AFIR.channel2)];
for n=1:size(EDF.AFIR.xin,1),
EDF.AFIR.x = xinre2(n + (EDF.AFIR.nord:-1:1)); % x(1:EDF.AFIR.nord-1)];
y = EDF.AFIR.w * EDF.AFIR.x';
en = EDF.AFIR.x * EDF.AFIR.x' + EDF.AFIR.gamma;
e(n,:) = ddin(n,:) - y';
EDF.AFIR.w = EDF.AFIR.w + (EDF.AFIR.alfa/en) * e(n,:)' * EDF.AFIR.x;
end;
EDF.AFIR.d = ddin(size(ddin,1)+(1-EDF.AFIR.delay:0),:);
S=e; %output
%S(:,EDF.AFIR.channel2) = e; %OUTPUT
end;
%%%%% select the correct seconds
if ~EDF.SIE.RAW & EDF.SIE.TimeUnits_Seconds
if NoR>0
%EDF.Block,
%[StartPos,StartPos+NoS,EDF.AS.startrec*EDF.Dur]
if (StartPos < EDF.AS.startrec*EDF.AS.MAXSPR)
tmp = S(size(S,1)+(1-EDF.AS.MAXSPR:0),:);
EDF.Block.number(3) = StartPos;
EDF.Block.number(4) = (StartPos+NoS);
if ~isempty(EDF.Block.data);
S = [EDF.Block.data(floor(EDF.Block.number(3)-EDF.Block.number(1))+1:EDF.AS.MAXSPR,:); S(1:floor(EDF.Block.number(4)-EDF.AS.startrec*EDF.AS.MAXSPR),:)];
else
% S = [S(1:floor(EDF.Block.number(4)-EDF.AS.startrec*EDF.AS.MAXSPR),:)];
end;
EDF.Block.number(1:2)=(EDF.FILE.POS+[-1 0])*EDF.AS.MAXSPR;
EDF.Block.data = tmp;
else
EDF.Block.number(3) = StartPos;
EDF.Block.number(4) = (StartPos+NoS);
EDF.Block.number(1:2)=(EDF.FILE.POS+[-1 0])*EDF.AS.MAXSPR;
EDF.Block.data = S(size(S,1)+(1-EDF.AS.MAXSPR:0),:);
%[floor(EDF.Block.number(3)-EDF.AS.startrec*EDF.AS.MAXSPR)+ 1,floor(EDF.Block.number(4)-EDF.AS.startrec*EDF.AS.MAXSPR)],
S = S(floor(EDF.Block.number(3)-EDF.AS.startrec*EDF.AS.MAXSPR)+ 1:floor(EDF.Block.number(4)-EDF.AS.startrec*EDF.AS.MAXSPR),:);
%S = S(EDF.AS.MAXSPR/EDF.Dur*(rem(StartPos,EDF.Dur))+(1:NoR*EDF.AS.MAXSPR),:);
end;
else
EDF.Block.number(3) = StartPos;
EDF.Block.number(4) = (StartPos+NoS);
EDF.Block.number(1:2)=(EDF.FILE.POS+[-1 0])*EDF.AS.MAXSPR;
S = [EDF.Block.data(floor(EDF.Block.number(3)-EDF.Block.number(1))+1:floor(EDF.Block.number(4)-EDF.Block.number(1)),:)];
%S = EDF.Block.data(floor(StartPos*EDF.AS.MAXSPR/EDF.Dur+1:floor((StartPos+NoS)*EDF.AS.MAXSPR/EDF.Dur),:)];
end;
end;
%end;
%%%%% Resampling
if Mode_RS100 & ~Mode_RAW
S=rs(S,EDF.SIE.T); %RS%
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -