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

📄 sdfopen.m

📁 含有多种ICA算法的eeglab工具箱
💻 M
📖 第 1 页 / 共 4 页
字号:
        EDF.SIE.RAW = 0;if ~isstruct(arg1)  % if arg1 is the filename         EDF.FileName=arg1;        if nargin<3                tmp=input('SDFOPEN: list of samplerates for each channel? ');                 EDF.SampleRate = tmp(:);        else                EDF.SampleRate=arg3;        end;        EDF.NS=length(EDF.SampleRate);        if nargin<4                tmp=input('SDFOPEN: Duration of one block in seconds: ');                 EDF.Dur = tmp;                EDF.SPR=EDF.Dur*EDF.SampleRate;        else                if ~isempty(findstr(upper(arg4),'RAW'))                        EDF.SIE.RAW = 1;                else                        EDF.Dur = arg4;                        EDF.SPR=EDF.Dur*EDF.SampleRate;                end;        end;end;FILENAME=EDF.FileName;if (arg2=='w')         [fid,MESSAGE]=fopen(FILENAME,'w','ieee-le');          elseif (arg2=='w+')  % may be called only by SDFCLOSE        if EDF.FILE.OPEN==2                 [fid,MESSAGE]=fopen(FILENAME,'r+','ieee-le');                  else                fprintf(EDF.FILE.stderr,'Error SDFOPEN-W+: Cannot open %s for write access\n',FILENAME);                return;        end;end;if fid<0         %fprintf(EDF.FILE.stderr,'Error EDFOPEN: %s\n',MESSAGE);          H1=MESSAGE;H2=[];        EDF.ErrNo = EDF.ErrNo + 32;        fprintf(EDF.FILE.stderr,'Error SDFOPEN-W: Could not open %s \n',FILENAME);        return;end;EDF.FILE.FID = fid;EDF.FILE.OPEN = 2;%%%% generate optional parametersPPos=min([max(find(FILENAME=='.')) length(FILENAME)+1]);SPos=max([0 find(FILENAME==filesep)]);EDF.FILE.Ext = FILENAME(PPos+1:length(FILENAME));EDF.FILE.Name = FILENAME(SPos+1:PPos-1);if SPos==0	EDF.FILE.Path = pwd;else	EDF.FILE.Path = FILENAME(1:SPos-1);end;EDF.FileName = [EDF.FILE.Path filesep EDF.FILE.Name '.' EDF.FILE.Ext];% Check all fields of Header1if ~isfield(EDF,'VERSION')        fprintf('Warning SDFOPEN-W: EDF.VERSION not defined; default=EDF assumed\n');        EDF.VERSION='0       '; % default EDF-format        %EDF.ErrNo = EDF.ErrNo + 128;        %fclose(EDF.FILE.FID); return;end;IsGDF=strcmp(upper(EDF.VERSION(1:3)),'GDF');if ~IsGDF        EDF.VERSION = '0       ';        fprintf(EDF.FILE.stderr,'\nData are stored with integer16.\nMeasures for minimizing round-off errors have been taken.\nDespite, overflow and round off errors may occur.\n');                  if sum(EDF.SPR)>61440/2;                fprintf(EDF.FILE.stderr,'\nWarning SDFOPEN: One block exceeds 61440 bytes.\n')        end;else        EDF.VERSION = 'GDF 0.12';end;if ~isfield(EDF,'PID')        fprintf(EDF.FILE.stderr,'Warning SDFOPEN-W: EDF.PID not defined\n');        EDF.PID=setstr(32+zeros(1,80));end;if ~isfield(EDF,'RID')        fprintf(EDF.FILE.stderr,'Warning SDFOPEN-W: EDF.RID not defined\n');        EDF.RID=setstr(32+zeros(1,80));end;if ~isfield(EDF,'T0')        EDF.T0=zeros(1,6);        fprintf(EDF.FILE.stderr,'Warning SDFOPEN-W: EDF.T0 not defined\n');end;if ~isfield(EDF,'reserved1')        EDF.reserved1=char(ones(1,44)*32);else        tmp=min(8,size(EDF.reserved1,2));        EDF.reserved1=[EDF.reserved1(1,1:tmp) 32+zeros(1,44-tmp)];end;if ~isfield(EDF,'NRec')        EDF.NRec=-1;end;if ~isfield(EDF,'Dur')        fprintf('Warning SDFOPEN-W: EDF.Dur not defined\n');        EDF.Dur=NaN;        EDF.ErrNo = EDF.ErrNo + 128;        fclose(EDF.FILE.FID); return;end;if ~isfield(EDF,'NS')        EDF.ERROR = sprintf('Error SDFOPEN-W: EDF.NS not defined\n');        EDF.ErrNo = EDF.ErrNo + 128;        fclose(EDF.FILE.FID); return;end;% Check all fields of Header2if ~isfield(EDF,'Label')        EDF.Label=setstr(32+zeros(EDF.NS,16));        fprintf(EDF.FILE.stderr,'Warning SDFOPEN-W: EDF.Label not defined\n');else        tmp=min(16,size(EDF.Label,2));        EDF.Label=[EDF.Label(1:EDF.NS,1:tmp) 32+zeros(EDF.NS,16-tmp)];end;if ~isfield(EDF,'Transducer')        EDF.Transducer=setstr(32+zeros(EDF.NS,80));else        tmp=min(80,size(EDF.Transducer,2));        EDF.Transducer=[EDF.Transducer(1:EDF.NS,1:tmp) 32+zeros(EDF.NS,80-tmp)];end;if ~isfield(EDF,'PreFilt')        EDF.PreFilt=setstr(32+zeros(EDF.NS,80));else        tmp=min(80,size(EDF.PreFilt,2));        EDF.PreFilt=[EDF.PreFilt(1:EDF.NS,1:tmp) 32+zeros(EDF.NS,80-tmp)];end;if ~isfield(EDF,'PhysDim')        EDF.PhysDim=setstr(32+zeros(EDF.NS,8));        fprintf(EDF.FILE.stderr,'Warning SDFOPEN-W: EDF.PhysDim not defined\n');else        tmp=min(8,size(EDF.PhysDim,2));        EDF.PhysDim=[EDF.PhysDim(1:EDF.NS,1:tmp) 32+zeros(EDF.NS,8-tmp)];end;if ~isfield(EDF,'PhysMin')        fprintf(EDF.FILE.stderr,'Warning SDFOPEN-W: EDF.PhysMin not defined\n');        EDF.PhysMin=repmat(nan,EDF.NS,1);        %EDF.ERROR = sprintf('Error SDFOPEN-W: EDF.PhysMax not defined\n');        %EDF.ErrNo = EDF.ErrNo + 128;        %fclose(EDF.FILE.FID); return;else        EDF.PhysMin=EDF.PhysMin(1:EDF.NS);end;if ~isfield(EDF,'PhysMax')        fprintf('Warning SDFOPEN-W: EDF.PhysMax not defined\n');        EDF.PhysMax=repmat(nan,EDF.NS,1);        %EDF.ERROR = sprintf('Error SDFOPEN-W: EDF.PhysMax not defined\n');        %EDF.ErrNo = EDF.ErrNo + 128;        %fclose(EDF.FILE.FID); return;else        EDF.PhysMax=EDF.PhysMax(1:EDF.NS);end;if ~isfield(EDF,'DigMin')        fprintf(EDF.FILE.stderr,'Warning SDFOPEN-W: EDF.DigMin not defined\n');        EDF.DigMin=repmat(nan,EDF.NS,1);        %EDF.ERROR = sprintf('Error SDFOPEN-W: EDF.DigMax not defined\n');        %EDF.ErrNo = EDF.ErrNo + 128;        %fclose(EDF.FILE.FID); return;else        EDF.DigMin=EDF.DigMin(1:EDF.NS);end;if ~isfield(EDF,'DigMax')        fprintf('Warning SDFOPEN-W: EDF.DigMax not defined\n');        EDF.DigMax=repmat(nan,EDF.NS,1);        %EDF.ERROR = sprintf('Error SDFOPEN-W: EDF.DigMax not defined\n');        %EDF.ErrNo = EDF.ErrNo + 128;        %fclose(EDF.FILE.FID); return;else        EDF.DigMax=EDF.DigMax(1:EDF.NS);end;if ~isfield(EDF,'SPR')        fprintf('Warning SDFOPEN-W: EDF.SPR not defined\n');        EDF.SPR=repmat(nan,EDF.NS,1);        EDF.ERROR = sprintf('Error SDFOPEN-W: EDF.SPR not defined\n');        EDF.ErrNo = EDF.ErrNo + 128;        fclose(EDF.FILE.FID); return;else        EDF.SPR=reshape(EDF.SPR(1:EDF.NS),EDF.NS,1);end;if IsGDF        if ~isfield(EDF,'GDFTPY')                EDF.ERROR = sprintf('Error SDFOPEN-W: EDF.GDFTYP not defined\n');                EDF.ErrNo = EDF.ErrNo + 128;                fclose(EDF.FILE.FID); return;        else                EDF.GDFTYP=EDF.GDFTYP(1:EDF.NS);        end;else        EDF.GDFTYP=3+zeros(1,EDF.NS);end;%%%%%% generate Header 1, first 256 bytes EDF.HeadLen=(EDF.NS+1)*256;H1=setstr(32*ones(1,256));H1(1:8)=EDF.VERSION; %sprintf('%08i',EDF.VERSION);     % 8 Byte  Versionsnummer H1( 8+(1:length(EDF.PID)))=EDF.PID;       H1(88+(1:length(EDF.RID)))=EDF.RID;%H1(185:192)=sprintf('%-8i',EDF.HeadLen);if IsGDF        H1(168+(1:16))=sprintf('%04i%02i%02i%02i%02i%02i%02i',floor(EDF.T0),rem(EDF.T0(6),1));        fwrite(fid,H1(1:184),'uchar');        fwrite(fid,EDF.HeadLen,'int64');        fwrite(fid,ones(8,1)*32,'byte'); % EP_ID=ones(8,1)*32;        fwrite(fid,ones(8,1)*32,'byte'); % Lab_ID=ones(8,1)*32;        fwrite(fid,ones(8,1)*32,'byte'); % T_ID=ones(8,1)*32;        fwrite(fid,ones(20,1)*32,'byte'); %         fwrite(fid,EDF.NRec,'int64');        %fwrite(fid,EDF.Dur,'float64');        [n,d]=rat(EDF.Dur); fwrite(fid,[n d], 'uint32');        fwrite(fid,EDF.NS,'uint32');else        H1(168+(1:16))=sprintf('%02i.%02i.%02i%02i:%02i:%02i',rem(EDF.T0([3 2 1 4 5 6]),100));        H1(185:192)=sprintf('%-8i',EDF.HeadLen);        H1(193:236)=EDF.reserved1;        H1(237:244)=sprintf('%-8i',EDF.NRec);        H1(245:252)=sprintf('%-8i',EDF.Dur);        H1(253:256)=sprintf('%-4i',EDF.NS);        H1(find(H1==0))=32;        fwrite(fid,H1,'uchar');end;        %%%%%% generate Header 2,  NS*256 bytes if ~IsGDF;        sPhysMin=32+zeros(EDF.NS,8);        sPhysMax=32+zeros(EDF.NS,8);        for k=1:EDF.NS,                tmp=sprintf('%-8g',EDF.PhysMin(k));                lt=length(tmp);                if lt<9                        sPhysMin(k,1:lt)=tmp;                else                        if any(upper(tmp)=='E') | find(tmp=='.')>8,                                fprintf(EDF.FILE.stderr,'Error SDFOPEN-W: PhysMin(%i) does not fit into header\n', k);                        else                                sPhysMin(k,:)=tmp(1:8);                        end;                end;                tmp=sprintf('%-8g',EDF.PhysMax(k));                lt=length(tmp);                if lt<9                        sPhysMax(k,1:lt)=tmp;                else                        if any(upper(tmp)=='E') | find(tmp=='.')>8,                                fprintf(EDF.FILE.stderr,'Error SDFOPEN-W: PhysMin(%i) does not fit into header\n', k);                        else                                sPhysMax(k,:)=tmp(1:8);                        end;                end;        end;        sPhysMin=reshape(sprintf('%-8.1f',EDF.PhysMin)',8,EDF.NS)';        sPhysMax=reshape(sprintf('%-8.1f',EDF.PhysMax)',8,EDF.NS)';                idx1=cumsum([0 H2idx]);        idx2=EDF.NS*idx1;        h2=setstr(32*ones(EDF.NS,256));        size(h2);        h2(:,idx1(1)+1:idx1(2))=EDF.Label;        h2(:,idx1(2)+1:idx1(3))=EDF.Transducer;        h2(:,idx1(3)+1:idx1(4))=EDF.PhysDim;        %h2(:,idx1(4)+1:idx1(5))=sPhysMin;        %h2(:,idx1(5)+1:idx1(6))=sPhysMax;        h2(:,idx1(4)+1:idx1(5))=sPhysMin;        h2(:,idx1(5)+1:idx1(6))=sPhysMax;        h2(:,idx1(6)+1:idx1(7))=reshape(sprintf('%-8i',EDF.DigMin)',8,EDF.NS)';        h2(:,idx1(7)+1:idx1(8))=reshape(sprintf('%-8i',EDF.DigMax)',8,EDF.NS)';        h2(:,idx1(8)+1:idx1(9))=EDF.PreFilt;        h2(:,idx1(9)+1:idx1(10))=reshape(sprintf('%-8i',EDF.SPR)',8,EDF.NS)';        h2(h2==0)=32;        for k=1:length(H2idx);                fwrite(fid,h2(:,idx1(k)+1:idx1(k+1))','uchar');        end;else        fwrite(fid, EDF.Label','16*uchar');        fwrite(fid, EDF.Transducer','80*uchar');        fwrite(fid, EDF.PhysDim','8*uchar');        fwrite(fid, EDF.PhysMin,'float64');        fwrite(fid, EDF.PhysMax,'float64');        fwrite(fid, EDF.DigMin,'int64');        fwrite(fid, EDF.DigMax,'int64');        fwrite(fid, EDF.PreFilt','80*uchar');        fwrite(fid, EDF.SPR,'uint32');        fwrite(fid, EDF.GDFTYP,'uint32');        fprintf(fid,'%c',32*ones(32,EDF.NS));end;tmp = ftell(EDF.FILE.FID);if tmp ~= (256 * (EDF.NS+1))         fprintf(1,'Warning %s-WRITE: incorrect header length %i bytes\n',upper(EDF.AS.Method),tmp);%else   fprintf(1,'sdfopen in write mode: header info stored correctly\n');end;        EDF.AS.spb = sum(EDF.SPR);	% Samples per Block11,EDF.AS.bi = [0;cumsum(EDF.SPR)]; EDF.AS.BPR  = ceil(EDF.SPR.*GDFTYP_BYTE(EDF.GDFTYP+1)'); EDF.AS.SAMECHANTYP = all(EDF.AS.BPR == (EDF.SPR.*GDFTYP_BYTE(EDF.GDFTYP+1)')) & all(EDF.GDFTYP(:)~=EDF.GDFTYP(1));%EDF.AS.GDFbi= [0;cumsum(EDF.AS.BPR)];EDF.AS.GDFbi = [0;cumsum(ceil(EDF.SPR.*GDFTYP_BYTE(EDF.GDFTYP+1)'))]; EDF.AS.bpb = sum(ceil(EDF.SPR.*GDFTYP_BYTE(EDF.GDFTYP+1)'));	% Bytes per BlockEDF.AS.startrec = 0;EDF.AS.numrec = 0;EDF.FILE.POS = 0;else % if arg2 is not 'r' or 'w'        fprintf(EDF.FILE.stderr,'Warning %s: Incorrect 2nd argument. Argument2 must be ''r'' or ''w''\n',upper(EDF.AS.Method));end;        if EDF.ErrNo>0        fprintf(EDF.FILE.stderr,'ERROR %i SDFOPEN\n',EDF.ErrNo);end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -