TEAP (Toolbox for Emotion Analysis using Physiological Signals) doc
mwfopen.m
Go to the documentation of this file.
1 function [HDR]=mwfopen(HDR,PERMISSION,arg3,arg4,arg5,arg6)
2 % MWFOPEN reads MFER files
3 %
4 % HDR = mwfopen(Filename,PERMISSION);
5 %
6 % HDR contains the Headerinformation and internal data
7 %
8 % see also: SOPEN, SREAD, SSEEK, STELL, SCLOSE, SWRITE, SEOF
9 
10 
11 % This program is free software; you can redistribute it and/or
12 % modify it under the terms of the GNU General Public License
13 % as published by the Free Software Foundation; either version 3
14 % of the License, or (at your option) any later version.
15 
16 % $Id: mwfopen.m 2205 2009-10-27 12:18:15Z schloegl $
17 % (C) 2004,2007,2008 by Alois Schloegl <a.schloegl@ieee.orgA
18 % This is part of the BIOSIG-toolbox http://biosig.sf.net/
19 
20 
21 HDR.FILE.OPEN= 0;
22 
23 if nargin<1, PERMISSION='rb'; end;
24 if ischar(HDR)
25  tmp=HDR;
26  HDR=[];
27  HDR.FileName=tmp;
28 end;
29 
30 VER = version;
31 
32 HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-be');
33 HDR.Endianity= 'ieee-be';
34 
35 %%% Default values %%%
36 HDR.SampleRate = 1000;
37 HDR.GDFTYP = 3;
38 HDR.AS.bps = 2;
39 HDR.SPR = NaN;
40 HDR.NS = 1;
41 HDR.NRec = NaN;
42 HDR.Off = 0;
43 HDR.Cal = NaN;
44 
45 fprintf(2,'Warning MWFOPEN: support of MFER format not complete, but in testing state\n');
46 %% default values
47 % standard 12 leads ECG codes
48 ECG12LeadsCodes(1:9)={'I';'II';'V1';'V2';'V3';'V4';'V5';'V6';'V1'};
49 ECG12LeadsCodes(11:15)={'V3R';'V4R';'V5R';'V6R';'V7R'};
50 ECG12LeadsCodes(61:64)={'III';'aVR';'aVL';'aVF'};
51 ECG12LeadsCodes(66:69)={'V8';'V9';'V8R';'V9R'};
52 
53 if ~isempty(findstr(PERMISSION,'r')), %%%%% READ
54  HDR.FILE.OPEN = 1;
55  HDR.FRAME.N = 0;
56  count = 1;
57  %while count>0, %~feof(HDR.FILE.FID)
58  tag = fread(HDR.FILE.FID,1,'uchar');
59  while ~feof(HDR.FILE.FID)
60  len = fread(HDR.FILE.FID,1,'uint8');
61  %fprintf(1,'[%i] Tag %i: (%i)\n',ftell(HDR.FILE.FID),tag,len);
62 
63  if (len < 0) | (len > 127),
64  l = mod(len,128);
65  len = fread(HDR.FILE.FID,[l,1],'uchar');
66  %len = 256.^[0:l-1]*len;
67  len = 256.^[l-1:-1:0]*len;
68  end;
69  % tmp = fread(HDR.FILE.FID,[1,len],'uint8');
70  % fprintf(1,'[%i] Tag %i: (%i)\n',ftell(HDR.FILE.FID),tag,len);
71 
72  if 0,
73  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
74 
75  elseif tag==0;
76  [tmp,count] = fread(HDR.FILE.FID,[1,1],'uint8');
77 
78  elseif tag==1;
79  [tmp,count] = fread(HDR.FILE.FID,[1,1],'uint8');
80  if 0,
81  elseif (tmp==0) & strcmp(HDR.Endianity,'ieee-le'),
82  tmp = ftell(HDR.FILE.FID);
83  HDR.Endianity='ieee-be';
84  fclose(HDR.FILE.FID);
85  HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,HDR.Endianity);
86  fseek(HDR.FILE.FID,tmp,'bof');
87  elseif (tmp==1) & strcmp(HDR.Endianity,'ieee-be'),
88  tmp = ftell(HDR.FILE.FID);
89  HDR.Endianity='ieee-le';
90  fclose(HDR.FILE.FID);
91  HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,HDR.Endianity);
92  fseek(HDR.FILE.FID,tmp,'bof');
93  else
94  end;
95 
96  elseif tag==2;
97  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
98  HDR.Version = tmp;
99 
100  elseif tag==3;
101  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
102  HDR.tag03 = tmp;
103 
104  elseif tag==4; % channel number
105  if len == 0;
106  tmp = NaN;
107  elseif len == 1;
108  [tmp,count] = fread(HDR.FILE.FID,1,'uint8');
109  elseif len == 2;
110  [tmp,count] = fread(HDR.FILE.FID,1,'int16');
111  elseif len == 3;
112  [tmp,count] = fread(HDR.FILE.FID,1,'bit24');
113  %[tmp,count] = fread(HDR.FILE.FID,3,'uint8');
114  %tmp = (2.^[16,8,0])*tmp;
115  elseif len == 4;
116  [tmp,count] = fread(HDR.FILE.FID,1,'int32');
117  else
118  fprintf(2,'Error MWFOPEN: len=%i exceeds max length (4) in tag 04h\n',len);
119  end;
120  %[HDR.SPR,count] = fread(HDR.FILE.FID,[1,len],'uchar');
121  HDR.SPR = tmp;
122 
123  elseif tag==5;
124 % [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
125  if len == 0;
126  tmp = 1;
127  elseif len == 1;
128  [tmp,count] = fread(HDR.FILE.FID,1,'int8');
129  elseif len == 2;
130  [tmp,count] = fread(HDR.FILE.FID,1,'int16');
131  elseif len == 3;
132  [tmp,count] = fread(HDR.FILE.FID,1,'bit24');
133  %tmp = (2.^[16,8,0])*tmp;
134  %tmp = (2.^[0:8:16])*tmp;
135  elseif len == 4;
136  [tmp,count] = fread(HDR.FILE.FID,1,'int32');
137  else
138  fprintf(2,'Error MWFOPEN: max length exceeded in tag 05h\n');
139  end;
140  HDR.NS = tmp; %*256.^[len-1:-1:0]';
141 
142  elseif tag==6;
143  if len==0; tmp = NaN;
144  elseif len==1; [tmp,count] = fread(HDR.FILE.FID,1,'int8');
145  elseif len==2; [tmp,count] = fread(HDR.FILE.FID,1,'int16');
146  elseif len==3; [tmp,count] = fread(HDR.FILE.FID,1,'bit24')
147  % tmp = (2.^[16,8,0])*tmp;
148  elseif len==4; [tmp,count] = fread(HDR.FILE.FID,1,'int32');
149  else fprintf(2,'Error MWFOPEN: max length exceeded in tag 06h\n');
150  end;
151  HDR.NRec = tmp;
152 
153  elseif tag==7;
154  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
155  HDR.Pointer = tmp*256.^[0:len-1]';
156 
157  elseif tag==8;
158  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
159  if tmp==0, HDR.MFER.WaveFormType = 'undefined';
160  elseif tmp==1, HDR.MFER.WaveFormType = 'ECG_STD12';
161  elseif tmp==2, HDR.MFER.WaveFormType = 'ECG_LTERM';
162  elseif tmp==3, HDR.MFER.WaveFormType = 'Vectorcardiogram';
163  elseif tmp==4, HDR.MFER.WaveFormType = 'Stress_ECG';
164  elseif tmp==5, HDR.MFER.WaveFormType = 'ECG_LTERM';
165  else HDR.MFER.WaveFormType = tmp;
166  end
167 
168  elseif tag==9;
169  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
170  HDR.Label = char(tmp);
171 
172  elseif tag==10;
173  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
174  if tmp==0; % int16, default
175  HDR.GDFTYP = 3;
176  HDR.AS.bps = 2;
177  elseif tmp==1; % uint16
178  HDR.GDFTYP = 4;
179  HDR.AS.bps = 2;
180  elseif tmp==2; % int32
181  HDR.GDFTYP = 5;
182  HDR.AS.bps = 4;
183  elseif tmp==3; % uint8
184  HDR.GDFTYP = 2;
185  HDR.AS.bps = 1;
186  elseif tmp==4; % 16bit status
187  HDR.GDFTYP = 4;
188  HDR.AS.bps = 2;
189  elseif tmp==5; % int8
190  HDR.GDFTYP = 1;
191  HDR.AS.bps = 1;
192  elseif tmp==6; % uint32
193  HDR.GDFTYP = 6;
194  HDR.AS.bps = 4;
195  elseif tmp==7; % float32
196  HDR.GDFTYP = 16;
197  HDR.AS.bps = 4;
198  elseif tmp==8; % float64
199  HDR.GDFTYP = 17;
200  HDR.AS.bps = 8;
201  elseif tmp==9; % 8 bit AHA compression
202  HDR.GDFTYP = 4;
203  HDR.AS.bps = NaN;
204  fprintf(2,'Error MWFOPEN: compression not supported, yet.\n');
205  end;
206 
207  elseif tag==11;
208  [tmp1,count] = fread(HDR.FILE.FID,2,'int8');
209  len = len - 2;
210  if len == 1; [tmp,count] = fread(HDR.FILE.FID,1,'int8');
211  elseif len == 2; [tmp,count] = fread(HDR.FILE.FID,1,'int16');
212  elseif len == 3; [tmp,count] = fread(HDR.FILE.FID,1,'bit24');
213  elseif len == 4; [tmp,count] = fread(HDR.FILE.FID,1,'int32');
214  end;
215  e = 10^tmp1(2);
216  if tmp1(1)==0,
217  HDR.Xphysdim = 'Hz';
218  HDR.SampleRate=tmp*e;
219  elseif tmp1(1)==1,
220  HDR.Xphysdim = 's';
221  HDR.SampleRate= 1/(tmp*e);
222  elseif tmp1(1)==2,
223  HDR.Xphysdim = 'm';
224  HDR.SampleRate=tmp*e;
225  end;
226 
227  elseif tag==12; % sensitivity, resolution, gain, calibration,
228  [tmp,count] = fread(HDR.FILE.FID,2,'int8');
229  if tmp(1)== 0, HDR.PhysDimCode = 4256; %% V
230  elseif tmp(1)== 1, HDR.PhysDimCode = 3872; %% mmHg
231  elseif tmp(1)== 2, HDR.PhysDimCode = 3840; %% Pa
232  elseif tmp(1)== 3, HDR.PhysDimCode = 3904; %% cmH2O
233  elseif tmp(1)== 4, HDR.PhysDim = 'mmHg/S';
234  elseif tmp(1)== 5, HDR.PhysDimCode = 3808; %% dyne
235  elseif tmp(1)== 6, HDR.PhysDimCode = 3776; %% N
236  elseif tmp(1)== 7, HDR.PhysDimCode = 544; %% '%'
237  elseif tmp(1)== 8, HDR.PhysDimCode = 6048; %% °C
238  elseif tmp(1)== 9, HDR.PhysDimCode = 2528; %% 1/min
239  elseif tmp(1)==10, HDR.PhysDimCode = 4264; %% 1/s
240  elseif tmp(1)==11, HDR.PhysDimCode = 4288; %% Ohm
241  elseif tmp(1)==12, HDR.PhysDimCode = 4160; %% A
242  elseif tmp(1)==13, HDR.PhysDimCode = 65376; %% r.p.m.
243  elseif tmp(1)==14, HDR.PhysDimCode = 4032; %% W
244  elseif tmp(1)==15, HDR.PhysDimCode = 6448; %% dB
245  elseif tmp(1)==16, HDR.PhysDimCode = 1731; %% kg';
246  elseif tmp(1)==17, HDR.PhysDimCode = 3968; %% J';
247  elseif tmp(1)==18, HDR.PhysDimCode = 6016; %% dyne s m-2 cm-5';
248  elseif tmp(1)==19, HDR.PhysDim = 'k';
249  elseif tmp(1)==20, HDR.PhysDimCode = 3040; %% L/s';
250  elseif tmp(1)==21, HDR.PhysDimCode = 3072; %% L/m';
251  elseif tmp(1)==22, HDR.PhysDimCode = 4480; %% cd';
252  elseif tmp(1)==23, HDR.PhysDim = '';
253  elseif tmp(1)==24, HDR.PhysDim = '';
254  elseif tmp(1)==25, HDR.PhysDim = '';
255  end;
256  e = 10^tmp(2);
257  len = len - 2;
258  if len == 1; [tmp,count] = fread(HDR.FILE.FID,1,'int8');
259  elseif len == 2; [tmp,count] = fread(HDR.FILE.FID,1,'int16');
260  elseif len == 3; [tmp,count] = fread(HDR.FILE.FID,1,'bit24');
261  elseif len == 4; [tmp,count] = fread(HDR.FILE.FID,1,'int32');
262  end;
263  HDR.Cal = tmp*e;
264 
265  elseif tag==13; % offset
266  [tmp,count] = fread(HDR.FILE.FID,1,gdfdatatype(HDR.GDFTYP));
267  HDR.Off=tmp;
268 
269  elseif tag==14; % compression
270  %[tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar')
271  [HDR.MFER.CompressionCode,count] = fread(HDR.FILE.FID,1,'uint16');
272  [HDR.MFER.DataLength1,count] = fread(HDR.FILE.FID,1,'uint32');
273  [HDR.MFER.DataLength2,count] = fread(HDR.FILE.FID,1,'uint32');
274  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
275  HDR.tag14=char(tmp);
276  HDR.FLAG.Compresssion=tmp;
277 
278  elseif tag==17;
279  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
280  HDR.tag17 = tmp;
281 
282  elseif tag==18; % null value
283  [tmp,count] = fread(HDR.FILE.FID,1,gdfdatatype(HDR.GDFTYP));
284  HDR.MFER.NullValue = tmp;
285 
286  elseif tag==21; %
287  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
288  HDR.tag21=char(tmp);
289 
290  elseif tag==22; %
291  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
292  HDR.comment=char(tmp);
293 
294  elseif tag==23; %
295  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uchar');
296  HDR.tag23 = char(tmp);
297 
298  elseif tag==30; %
299  if isfield(HDR,'MFER');
300  if isfield(HDR.MFER,'SPR');
301  HDR.AS.spb = sum(HDR.MFER.SPR);
302  else
303  HDR.AS.spb = HDR.SPR*HDR.NS;
304  HDR.MFER.SPR = HDR.SPR(ones(1,HDR.NS));
305  end;
306  end;
307 
308  HDR.SPR = HDR.MFER.SPR(1);
309  for k=2:HDR.NS,
310  HDR.SPR = lcm(HDR.SPR,HDR.MFER.SPR(k));
311  end;
312 
313  HDR.FRAME.N = HDR.FRAME.N + 1;
314  HDR.FRAME.POS(HDR.FRAME.N) = ftell(HDR.FILE.FID);
315  HDR.FRAME.TYP(HDR.FRAME.N) = HDR.GDFTYP;
316  nos = len/(HDR.AS.bps*HDR.AS.spb);
317  HDR.FRAME.sz(HDR.FRAME.N,1:5) = [HDR.AS.spb,nos,HDR.NRec,HDR.NS,len];
318  HDR.FRAME.Fs(HDR.FRAME.N) = HDR.SampleRate;
319 
320  fseek(HDR.FILE.FID,len,'cof');
321 
322 
323  elseif tag==63;
324  chansel = mod(len,128)+1;
325  k = 1;
326  while len > 127,
327  [len, count] = fread(HDR.FILE.FID,1,'uchar');
328  k = k + 1;
329  chansel(k) = mod(len,128)+1;
330  end
331 
332  [len, count] = fread(HDR.FILE.FID,1,'uchar');
333  if 0,
334  elseif len<128,
335  while len,
336  tag2 = fread(HDR.FILE.FID,1,'uchar');
337  len2 = fread(HDR.FILE.FID,1,'uint8');
338  len = len - 2 - len2;
339  if 0,
340  elseif (tag2 == 4),
341  if len == 0;
342  tmp = NaN;
343  elseif len == 1;
344  [tmp,count] = fread(HDR.FILE.FID,1,'int8');
345  elseif len == 2;
346  [tmp,count] = fread(HDR.FILE.FID,1,'int16');
347  elseif len == 3;
348  [tmp,count] = fread(HDR.FILE.FID,1,'bit24');
349  elseif len == 4;
350  [tmp,count] = fread(HDR.FILE.FID,1,'int32');
351  else
352  fprintf(2,'Error MWFOPEN: len=%i exceeds max length (4) in tag 04h\n',len);
353  end;
354  %[HDR.SPR,count] = fread(HDR.FILE.FID,[1,len],'uchar');
355  HDR.MFER.SPR(chansel) = tmp;
356  HDR.SPR = lcm(tmp,HDR.SPR);
357 
358  elseif (tag2 == 12),
359  [tmp, count] = fread(HDR.FILE.FID,1,gdfdatatype(HDR.GDFTYP));
360  HDR.Cal(chansel) = tmp;
361  elseif (tag2 == 13),
362  [tmp, count] = fread(HDR.FILE.FID,1,gdfdatatype(HDR.GDFTYP));
363  HDR.Off(chansel) = tmp;
364  elseif (tag2 == 9),
365  [tmp, count] = fread(HDR.FILE.FID,[1,len2],'uchar');
366  if ~isfield(HDR,'Label')
367  HDR.Label(chansel,:) = ECG12LeadsCodes{tmp};
368  else
369  HDR.Label(chansel,1:length(ECG12LeadsCodes{tmp})) = ECG12LeadsCodes{tmp};
370  end;
371  else % if (tag2 == 10),
372  fprintf(2,'Error MWFOPEN: Tag %i in channel-specific section not supported \n',tag2);
373  fclose(HDR.FILE.FID);
374  HDR.FILE.OPEN=0;
375  return;
376  end;
377  %fprintf(1,'\t%i',chansel);
378  %fprintf(1,'> [%i] Tag %i = %i: (%i) \n',ftell(HDR.FILE.FID),tag2,tmp,len2);
379  end;
380  else
381  tag2 = 1; len2=1;
382  while (tag2 | len2),
383  tag2 = fread(HDR.FILE.FID,1,'uchar');
384  len2 = fread(HDR.FILE.FID,1,'uint8');
385  %% this part is not tested yet
386  fprintf(1,'\t%i',chansel);
387  fprintf(1,'> [%i] Tag %i: (%i)\n',ftell(HDR.FILE.FID),tag2,len2);
388 
389  if (len2 < 0) | (len2 > 127),
390  l = mod(len2,128);
391  len2 = fread(HDR.FILE.FID,[l,1],'uchar');
392  %len = 256.^[0:l-1]*len;
393  len2 = 256.^[l-1:-1:0]*len2;
394  end;
395  [tmp, count] = fread(HDR.FILE.FID,[1,len],'uchar');
396  end;
397  end;
398  if isfield(HDR,'Label')
399  HDR.Label = char(HDR.Label);
400  end;
401 
402  elseif tag==64; % Preamble
403  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
404  HDR.TYPE='MFER';
405 
406  elseif tag==65; % Events
407  N = HDR.EVENT.N + 1;
408  HDR.EVENT.N = N;
409  for k=1:N,
410  [HDR.EVENT.TYP(k),count] = fread(HDR.FILE.FID,1,'uint16');
411  if len>5,
412  [HDR.EVENT.POS(k),count] = fread(HDR.FILE.FID,1,'uint32');
413  end;
414  if len>9,
415  [HDR.EVENT.DUR(k),count] = fread(HDR.FILE.FID,1,'uint32');
416  end;
417  if len>10,
418  [HDR.EVENT.Desc{k},count] = fread(HDR.FILE.FID,len-10,'uint8');
419  end;
420  end;
421 
422  elseif tag==67; % Sample Skew
423  [tmp,count] = fread(HDR.FILE.FID,1,'int16');
424  HDR.SampleSkew = tmp;
425 
426  elseif tag==129; % Patient Name
427  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
428  HDR.Patient.Name = char(tmp);
429 
430  elseif tag==130; % Patient Id
431  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
432  HDR.PID = char(tmp);
433 
434  elseif tag==131; % Patient Age
435  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
436  HDR.Patient.Age = char(tmp);
437 
438  elseif tag==132; % Patient Age
439  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
440  HDR.Patient.Sex = char(tmp);
441 
442  elseif tag==133; % recording time
443  [HDR.T0(1),count] = fread(HDR.FILE.FID,1,'int16');
444  [HDR.T0(2:6),count] = fread(HDR.FILE.FID,[1,5],'uint8');
445  [tmp,count] = fread(HDR.FILE.FID,[1,2],'int16');
446  HDR.T0(6) = HDR.T0(6) + tmp(1)*1e-3 + tmp(2)+1e-6;
447 
448  else
449  [tmp,count] = fread(HDR.FILE.FID,[1,len],'uint8');
450  %fprintf(1,'[%i %i] Tag %i: (%i) %s\n',ftell(HDR.FILE.FID),count,tag,len,char(tmp));
451  end;
452  % fprintf(1,'[%i %i] Tag %i: (%i)\n',ftell(HDR.FILE.FID),count,tag,len);
453  % count = 1;
454  % pause
455  tag = fread(HDR.FILE.FID,1,'uchar');
456  end;
457 
458  HDR.HeadLen = ftell(HDR.FILE.FID);
459  HDR.FILE.POS = 0;
460  HDR.Calib = sparse([HDR.Off(ones(1,HDR.NS/length(HDR.Off)));eye(HDR.NS)]);
461  HDR.Calib = HDR.Calib * sparse(1:HDR.NS,1:HDR.NS,HDR.Cal);
462 end;
463 
gdfdatatype
function gdfdatatype(in GDFTYP)
mwfopen
function mwfopen(in HDR, in PERMISSION, in arg3, in arg4, in arg5, in arg6)