⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdfread.m

📁 matlab数字信号处理工具箱
💻 M
📖 第 1 页 / 共 2 页
字号:
        		%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 + -