Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/openbdf.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/openbdf.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,192 @@ +function [DAT,H1]=openbdf(FILENAME) +% EDF=openedf(FILENAME) +% Opens an EDF File (European Data Format for Biosignals) in MATLAB (R) +% <A HREF="http://www.medfac.leidenuniv.nl/neurology/knf/kemp/edf.htm">About EDF</A> + +% Copyright (C) 1997-1998 by Alois Schloegl +% a.schloegl@ieee.org +% Ver 2.20 18.Aug.1998 +% Ver 2.21 10.Oct.1998 +% Ver 2.30 5.Nov.1998 +% +% For use under Octave define the following function +% function s=upper(s); s=toupper(s); end; + +% V2.12 Warning for missing Header information +% V2.20 EDF.AS.* changed +% V2.30 EDF.T0 made Y2K compatible until Year 2090 + +% 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. +% Name changed Sept 6,2002 T.S. Lorig + +SLASH='/'; % defines Seperator for Subdirectories +BSLASH=setstr(92); + +cname=computer; +if cname(1:2)=='PC' SLASH=BSLASH; end; + +fid=fopen(FILENAME,'r','ieee-le'); +if fid<0 + % fprintf(2,['Error LOADEDF: File ' FILENAME ' not found\n']); + % Warning desactivated in MIRtoolbox + return; +end; + +EDF.FILE.FID=fid; +EDF.FILE.OPEN = 1; +EDF.FileName = FILENAME; + +PPos=min([max(find(FILENAME=='.')) length(FILENAME)+1]); +SPos=max([0 find((FILENAME=='/') | (FILENAME==BSLASH))]); +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 SLASH EDF.FILE.Name '.' EDF.FILE.Ext]; + +H1=setstr(fread(EDF.FILE.FID,256,'char')'); % +EDF.VERSION=H1(1:8); % 8 Byte Versionsnummer +%if 0 fprintf(2,'LOADEDF: WARNING Version EDF Format %i',ver); end; +EDF.PID = deblank(H1(9:88)); % 80 Byte local patient identification +EDF.RID = deblank(H1(89:168)); % 80 Byte local recording identification +%EDF.H.StartDate = H1(169:176); % 8 Byte +%EDF.H.StartTime = H1(177:184); % 8 Byte +EDF.T0=[str2num(H1(168+[7 8])) str2num(H1(168+[4 5])) str2num(H1(168+[1 2])) str2num(H1(168+[9 10])) str2num(H1(168+[12 13])) str2num(H1(168+[15 16])) ]; + +% Y2K compatibility until year 2090 +if EDF.VERSION(1)=='0' + if EDF.T0(1) < 91 + EDF.T0(1)=2000+EDF.T0(1); + else + EDF.T0(1)=1900+EDF.T0(1); + end; +else ; + % in a future version, this is hopefully not needed +end; + +EDF.HeadLen = str2num(H1(185:192)); % 8 Byte Length of Header +% reserved = H1(193:236); % 44 Byte +EDF.NRec = str2num(H1(237:244)); % 8 Byte # of data records +EDF.Dur = str2num(H1(245:252)); % 8 Byte # duration of data record in sec +EDF.NS = str2num(H1(253:256)); % 8 Byte # of signals + +EDF.Label = setstr(fread(EDF.FILE.FID,[16,EDF.NS],'char')'); +EDF.Transducer = setstr(fread(EDF.FILE.FID,[80,EDF.NS],'char')'); +EDF.PhysDim = setstr(fread(EDF.FILE.FID,[8,EDF.NS],'char')'); + +EDF.PhysMin= str2num(setstr(fread(EDF.FILE.FID,[8,EDF.NS],'char')')); +EDF.PhysMax= str2num(setstr(fread(EDF.FILE.FID,[8,EDF.NS],'char')')); +EDF.DigMin = str2num(setstr(fread(EDF.FILE.FID,[8,EDF.NS],'char')')); % +EDF.DigMax = str2num(setstr(fread(EDF.FILE.FID,[8,EDF.NS],'char')')); % + +% check validity of DigMin and DigMax +if (length(EDF.DigMin) ~= EDF.NS) + fprintf(2,'Warning OPENEDF: Failing Digital Minimum\n'); + EDF.DigMin = -(2^15)*ones(EDF.NS,1); +end +if (length(EDF.DigMax) ~= EDF.NS) + fprintf(2,'Warning OPENEDF: Failing Digital Maximum\n'); + EDF.DigMax = (2^15-1)*ones(EDF.NS,1); +end +if (any(EDF.DigMin >= EDF.DigMax)) + fprintf(2,'Warning OPENEDF: Digital Minimum larger than Maximum\n'); +end +% check validity of PhysMin and PhysMax +if (length(EDF.PhysMin) ~= EDF.NS) + fprintf(2,'Warning OPENEDF: Failing Physical Minimum\n'); + EDF.PhysMin = EDF.DigMin; +end +if (length(EDF.PhysMax) ~= EDF.NS) + fprintf(2,'Warning OPENEDF: Failing Physical Maximum\n'); + EDF.PhysMax = EDF.DigMax; +end +if (any(EDF.PhysMin >= EDF.PhysMax)) + fprintf(2,'Warning OPENEDF: Physical Minimum larger than Maximum\n'); + EDF.PhysMin = EDF.DigMin; + EDF.PhysMax = EDF.DigMax; +end +EDF.PreFilt= setstr(fread(EDF.FILE.FID,[80,EDF.NS],'char')'); % +tmp = fread(EDF.FILE.FID,[8,EDF.NS],'char')'; % samples per data record +EDF.SPR = str2num(setstr(tmp)); % samples per data record + +fseek(EDF.FILE.FID,32*EDF.NS,0); + +EDF.Cal = (EDF.PhysMax-EDF.PhysMin)./ ... + (EDF.DigMax-EDF.DigMin); +EDF.Off = EDF.PhysMin - EDF.Cal .* EDF.DigMin; +tmp = find(EDF.Cal < 0); +EDF.Cal(tmp) = ones(size(tmp)); +EDF.Off(tmp) = zeros(size(tmp)); + +EDF.Calib=[EDF.Off';(diag(EDF.Cal))]; +%EDF.Calib=sparse(diag([1; EDF.Cal])); +%EDF.Calib(1,2:EDF.NS+1)=EDF.Off'; + +EDF.SampleRate = EDF.SPR / EDF.Dur; + +EDF.FILE.POS = ftell(EDF.FILE.FID); +if EDF.NRec == -1 % unknown record size, determine correct NRec + fseek(EDF.FILE.FID, 0, 'eof'); + endpos = ftell(EDF.FILE.FID); + EDF.NRec = floor((endpos - EDF.FILE.POS) / (sum(EDF.SPR) * 2)); + fseek(EDF.FILE.FID, EDF.FILE.POS, 'bof'); + H1(237:244)=sprintf('%-8i',EDF.NRec); % write number of records +end; + +EDF.Chan_Select=(EDF.SPR==max(EDF.SPR)); +for k=1:EDF.NS + if EDF.Chan_Select(k) + EDF.ChanTyp(k)='N'; + else + EDF.ChanTyp(k)=' '; + end; + if findstr(upper(EDF.Label(k,:)),'ECG') + EDF.ChanTyp(k)='C'; + elseif findstr(upper(EDF.Label(k,:)),'EKG') + EDF.ChanTyp(k)='C'; + elseif findstr(upper(EDF.Label(k,:)),'EEG') + EDF.ChanTyp(k)='E'; + elseif findstr(upper(EDF.Label(k,:)),'EOG') + EDF.ChanTyp(k)='O'; + elseif findstr(upper(EDF.Label(k,:)),'EMG') + EDF.ChanTyp(k)='M'; + end; +end; + +EDF.AS.spb = sum(EDF.SPR); % Samples per Block +bi=[0;cumsum(EDF.SPR)]; + +idx=[];idx2=[]; +for k=1:EDF.NS, + idx2=[idx2, (k-1)*max(EDF.SPR)+(1:EDF.SPR(k))]; +end; +maxspr=max(EDF.SPR); +idx3=zeros(EDF.NS*maxspr,1); +for k=1:EDF.NS, idx3(maxspr*(k-1)+(1:maxspr))=bi(k)+ceil((1:maxspr)'/maxspr*EDF.SPR(k));end; + +%EDF.AS.bi=bi; +EDF.AS.IDX2=idx2; +%EDF.AS.IDX3=idx3; + + +DAT.Head=EDF; +DAT.MX.ReRef=1; + +%DAT.MX=feval('loadxcm',EDF); + +return;