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

📄 gdfopen.m

📁 matlab下实现
💻 M
📖 第 1 页 / 共 2 页
字号:
        EDF.Dur     = str2num(H1(245:252));     % 8 Byte  # duration of data record in sec        EDF.NS      = str2num(H1(253:256));     % 4 Byte  # of signals	EDF.AS.H1   = H1;	                     % for debugging the EDF Headerend;if EDF.T0(1)>EDF.AS.Date(1)        EDF.ERROR=[EDF.ERROR 'E03: Incorrect date information\n'];        EDF.ErrNo = EDF.ErrNo + 4;end;%%% Read variable Header %%%if ~GDF        idx1=cumsum([0 H2idx]);        idx2=EDF.NS*idx1;        h2=zeros(EDF.NS,256);        [H2,count]=fread(EDF.FILE.FID,EDF.NS*256,'uchar');        if count < EDF.NS*256                 EDF.ERROR=sprintf('unable to read variable Header of %s \n', FILENAME);                EDF.ErrNo = EDF.ErrNo + 8;                fprintf(2,'Warning GDFOPEN: unable to read header\n');                 return;         end;                        tmp=(find(H2==0));         if ~isempty(tmp) %%%%% not EDF because filled out with ASCII(0) - should be spaces                H2(tmp)=32;         end;                for k=1:length(H2idx);                %disp([k size(H2) idx2(k) idx2(k+1) H2idx(k)]);                h2(:,idx1(k)+1:idx1(k+1))=reshape(H2(idx2(k)+1:idx2(k+1)),H2idx(k),EDF.NS)';        end;        h2=setstr(h2);        EDF.Label      =         h2(:,idx1(1)+1:idx1(2));        EDF.Transducer =         h2(:,idx1(2)+1:idx1(3));        EDF.PhysDim    =         h2(:,idx1(3)+1:idx1(4));        EDF.PhysMin    = str2num(h2(:,idx1(4)+1:idx1(5)));        EDF.PhysMax    = str2num(h2(:,idx1(5)+1:idx1(6)));        EDF.DigMin     = str2num(h2(:,idx1(6)+1:idx1(7)));        EDF.DigMax     = str2num(h2(:,idx1(7)+1:idx1(8)));        EDF.PreFilt    =         h2(:,idx1(8)+1:idx1(9));        EDF.SPR        = str2num(h2(:,idx1(9)+1:idx1(10)));        %EDF.reserved  =       h2(:,idx1(10)+1:idx1(11));        EDF.GDFTYP     = 3*ones(1,EDF.NS);	%	datatypeelse        fseek(EDF.FILE.FID,256,'bof');        EDF.Label      =  setstr(fread(EDF.FILE.FID,[16,EDF.NS],'uchar')');		        EDF.Transducer =  setstr(fread(EDF.FILE.FID,[80,EDF.NS],'uchar')');	        EDF.PhysDim    =  setstr(fread(EDF.FILE.FID,[8,EDF.NS],'uchar')');%       EDF.AS.GDF.TEXT = EDF.GDFTYP.TEXT;        EDF.PhysMin    =         fread(EDF.FILE.FID,[EDF.NS,1],'float64');	        EDF.PhysMax    =         fread(EDF.FILE.FID,[EDF.NS,1],'float64');	        EDF.DigMin     =         fread(EDF.FILE.FID,[EDF.NS,1],'int64');	        EDF.DigMax     =         fread(EDF.FILE.FID,[EDF.NS,1],'int64');	                EDF.PreFilt    =  setstr(fread(EDF.FILE.FID,[80,EDF.NS],'uchar')');	%	        EDF.SPR        =         fread(EDF.FILE.FID,[1,EDF.NS],'uint32')';	%	samples per data record        EDF.GDFTYP     =         fread(EDF.FILE.FID,[1,EDF.NS],'uint32');	%	datatype        %                        fread(EDF.FILE.FID,[32,EDF.NS],'uchar')';	%	datatypeend;%		EDF=gdfcheck(EDF,1);EDF.Cal = (EDF.PhysMax-EDF.PhysMin)./(EDF.DigMax-EDF.DigMin);EDF.Off = EDF.PhysMin - EDF.Cal .* EDF.DigMin;EDF.Calib=[EDF.Off';(diag(EDF.Cal))];EDF.SampleRate = EDF.SPR / EDF.Dur;EDF.AS.spb = sum(EDF.SPR);	% Samples per BlockEDF.AS.bi = [0;cumsum(EDF.SPR)]; EDF.AS.BPR  = ceil(EDF.SPR.*GDFTYP_BYTE(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 = ftell(EDF.FILE.FID);status = fseek(EDF.FILE.FID, 0, 'eof');endpos = ftell(EDF.FILE.FID);fseek(EDF.FILE.FID, EDF.HeadLen, 'bof');if EDF.NRec == -1   % unknown record size, determine correct NRec        EDF.NRec = floor((endpos - EDF.HeadLen) / EDF.AS.bpb);elseif  EDF.NRec ~= ((endpos - EDF.HeadLen) / EDF.AS.bpb);        fprintf(2,'Warning GDFOPEN: Incorrect HeaderInformation does not fit to filesize\n');        EDF.ErrNo = EDF.ErrNo + 16;end; %%%%%%% ============= WRITE ===========%%%%%%%%%%%%        elseif arg2=='w'%        fprintf(2,'error EDFOPEN: write mode not possible.\n');         H1=[]; H2=[];%        return;        if ~isstruct(arg1)         fprintf(2,'error EDFOPEN: arg1 must be defined as EDF-struct\n'); return;else        FILENAME=EDF.FileName;        [fid,MESSAGE]=fopen(FILENAME,'w','ieee-le');                  EDF.FILE.FID = fid;        if fid<0                 %fprintf(2,'Error EDFOPEN: %s\n',MESSAGE);                  H1=MESSAGE;H2=[];	        EDF.ErrNo = EDF.ErrNo + 32;                return;        end;end;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];EDF.NRec=-1;EDF=gdfcheck(EDF,1);EDF.AS.startrec=0;EDF.AS.numrec=0;GDF=strcmp(EDF.VERSION(1:3),'GDF');if ~GDF        EDF.VERSION = '0       ';        fprintf(2,'\nWARNING: It is not recommended to use this funtion because You try to store Matlab data (floating point numbers) within integer16 number.\n Overflow and round off errors can damage your data.\n We recommend to set arg.VERSION=''GDF 0.12'' \n');  else        EDF.VERSION = 'GDF 0.12';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 GDF        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'); % T_ID=ones(8,1)*32;        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('%-2i.%-2i.%-2i%-2i:%-2i:%-2i',rem(EDF.T0([3 2 1 4 5 6]),100));        H1(185:192)=sprintf('%-8i',EDF.HeadLen);        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 ~GDF;         EDF.sPhysMin=reshape(sprintf('%-8.1f',EDF.PhysMin)',8,EDF.NS)';        EDF.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));        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))=EDF.sPhysMin;        h2(:,idx1(5)+1:idx1(6))=EDF.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,'edfopen in write mode: incorrect header length %i bytes\n',tmp);%else   fprintf(1,'edfopen in write mode: header info stored correctly\n');end;        end;        %%%%%%% ENDE %%%%%%%%%

⌨️ 快捷键说明

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