📄 sopen.m
字号:
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-le'); % ### native should be fixed
if ~isempty(findstr(PERMISSION,'r')), %%%%% READ
% read header
fseek(HDR.FILE.FID,4,'bof'); % skip first 4 bytes, should contain 'DEMG'
HDR.VERSION = fread(HDR.FILE.FID,1,'uint16');
HDR.NS = fread(HDR.FILE.FID,1,'uint16');
HDR.SampleRate = fread(HDR.FILE.FID,1,'uint32');
HDR.SPR = fread(HDR.FILE.FID,1,'uint32');
HDR.NRec = 1;
HDR.bits = fread(HDR.FILE.FID,1,'uint8');
HDR.PhysMin = fread(HDR.FILE.FID,1,'int8');
HDR.PhysMax = fread(HDR.FILE.FID,1,'int8');
if HDR.VERSION==1,
HDR.GDFTYP = 16; % float
HDR.Cal = 1;
HDR.Off = 0;
HDR.AS.bpb = 4*HDR.NS;
elseif HDR.VERSION==2,
HDR.GDFTYP = 4; % uint16
HDR.Cal = (HDR.PhysMax-HDR.PhysMin)/(2^HDR.bits-1);
HDR.Off = HDR.PhysMin;
HDR.AS.bpb = 2*HDR.NS;
else
fprintf(2,'Error SOPEN DEMG: invalid version number.\n');
fclose(HDR.FILE.FID);
HDR.FILE.FID=-1;
return;
end;
HDR.Calib = sparse([ones(1,HDR.NS),2:HDR.NS+1],[1:HDR.NS,1:HDR.NS],ones(HDR.NS,1)*[HDR.Off,HDR.Cal],HDR.NS+1,HDR.NS);
HDR.HeadLen = ftell(HDR.FILE.FID);
HDR.FILE.POS = 0;
HDR.FILE.OPEN = 1;
HDR.AS.endpos = HDR.SPR;
%HDR.Filter.LowPass = 450; % default values
%HDR.Filter.HighPass = 20; % default values
else
fprintf(2,'Warning SOPEN DEMG: writing not implemented, yet.\n');
end;
elseif strcmp(HDR.TYPE,'ACQ'),
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-le');
%-------- Fixed Header
ItemHeaderLen = fread(HDR.FILE.FID,1,'uint16');
HDR.VERSION = fread(HDR.FILE.FID,1,'uint32');
HDR.ACQ.ExtItemHeaderLen = fread(HDR.FILE.FID,1,'uint32');
HDR.NS = fread(HDR.FILE.FID,1,'int16');
HDR.ACQ.HorizAxisType = fread(HDR.FILE.FID,1,'int16');
HDR.ACQ.CurChannel = fread(HDR.FILE.FID,1,'int16');
HDR.ACQ.SampleTime = fread(HDR.FILE.FID,1,'float64')/1000;
HDR.SampleRate = 1/HDR.ACQ.SampleTime;
HDR.TimeOffset = fread(HDR.FILE.FID,1,'float64')/1000;
HDR.TimeScale = fread(HDR.FILE.FID,1,'float64');
HDR.ACQ.TimeCursor1 = fread(HDR.FILE.FID,1,'float64');
HDR.ACQ.TimeCursor2 = fread(HDR.FILE.FID,1,'float64');
HDR.ACQ.rcWindow = fread(HDR.FILE.FID,1,'float64');
HDR.ACQ.MeasurementType = fread(HDR.FILE.FID,6,'int16');
HDR.ACQ.HiLite = fread(HDR.FILE.FID,2,'uint8');
HDR.FirstTimeOffset = fread(HDR.FILE.FID,1,'float64');
fseek(HDR.FILE.FID,HDR.ACQ.ExtItemHeaderLen,'bof');
% -------- Variable Header
% -------- Per Channel data section
HDR.Labels = char(zeros(HDR.NS,40));
HDR.Off = zeros(HDR.NS,1);
HDR.Cal = ones(HDR.NS,1);
HDR.ChanHeaderLen = zeros(HDR.NS,1);
HDR.PhysDim = char(zeros(HDR.NS,20));
offset = ftell(HDR.FILE.FID);
for k = 1:HDR.NS;
fseek(HDR.FILE.FID,offset+sum(HDR.ChanHeaderLen),'bof');
HDR.ChanHeaderLen(k) = fread(HDR.FILE.FID,1,'uint32');
HDR.ChanSel(k) = fread(HDR.FILE.FID,1,'int16');
HDR.Label(k,1:40) = fread(HDR.FILE.FID,[1,40],'char');
rgbColor = fread(HDR.FILE.FID,4,'int8');
DispChan = fread(HDR.FILE.FID,2,'int8');
HDR.Off(k) = fread(HDR.FILE.FID,1,'float64');
HDR.Cal(k) = fread(HDR.FILE.FID,1,'float64');
HDR.PhysDim(k,1:20) = fread(HDR.FILE.FID,[1,20],'char');
HDR.SPR(k) = fread(HDR.FILE.FID,1,'int32');
HDR.AmpGain(k) = fread(HDR.FILE.FID,1,'float64');
HDR.AmpOff(k) = fread(HDR.FILE.FID,1,'float64');
HDR.ACQ.ChanOrder = fread(HDR.FILE.FID,1,'int16');
HDR.ACQ.DispSize = fread(HDR.FILE.FID,1,'int16');
if HDR.VERSION >= 34,
fseek(HDR.FILE.FID,10,'cof');
end;
if HDR.VERSION >= 38,
HDR.Description(k,1:128) = fread(HDR.FILE.FID,[1,128],'char');
HDR.VarSampleDiv(k) = fread(HDR.FILE.FID,1,'uint16');
else
HDR.VarSampleDiv(k) = 1;
end;
end;
HDR.Label = char(HDR.Label);
HDR.PhysDim = char(HDR.PhysDim);
HDR.Calib = [HDR.Off(:).';diag(HDR.Cal)];
HDR.MAXSPR = HDR.VarSampleDiv(1);
for k = 2:length(HDR.VarSampleDiv);
HDR.MAXSPR = lcm(HDR.MAXSPR,HDR.VarSampleDiv(k));
end;
HDR.ACQ.SampleRate = 1./(HDR.VarSampleDiv*HDR.ACQ.SampleTime);
HDR.SampleRate = 1/HDR.ACQ.SampleTime;
HDR.Dur = HDR.MAXSPR*HDR.ACQ.SampleTime;
%-------- foreign data section
ForeignDataLength = fread(HDR.FILE.FID,1,'int16');
HDR.ACQ.ForeignDataID = fread(HDR.FILE.FID,1,'uint16');
HDR.ACQ.ForeignData = fread(HDR.FILE.FID,[1,ForeignDataLength-4],'char');
%fseek(HDR.FILE.FID,ForeignDataLength-2,'cof');
%-------- per channel data type section
offset3 = 0;
HDR.AS.bpb = 0;
HDR.AS.spb = 0;
for k = 1:HDR.NS,
sz = fread(HDR.FILE.FID,1,'uint16');
HDR.AS.bpb = HDR.AS.bpb + HDR.MAXSPR/HDR.VarSampleDiv(k)*sz;
HDR.AS.spb = HDR.AS.spb + HDR.MAXSPR/HDR.VarSampleDiv(k);
offset3 = offset3 + HDR.SPR(k) * sz;
typ = fread(HDR.FILE.FID,1,'uint16');
HDR.GDFTYP(k) = 31-typ*14; % 1 = int16; 2 = double
end;
HDR.HeadLen = HDR.ACQ.ExtItemHeaderLen + sum(HDR.ChanHeaderLen) + ForeignDataLength + 4*HDR.NS;
HDR.FILE.POS = 0;
HDR.FILE.OPEN = 1;
HDR.AS.endpos = HDR.HeadLen + offset3;
fseek(HDR.FILE.FID,HDR.AS.endpos,'bof');
%-------- Markers Header section
len = fread(HDR.FILE.FID,1,'uint32');
HDR.EVENT.N = fread(HDR.FILE.FID,1,'uint32');
HDR.EVENT.POS = repmat(nan,HDR.EVENT.N ,1);
HDR.EVENT.TYP = repmat(nan,HDR.EVENT.N ,1);
for k = 1:HDR.EVENT.N,
%HDR.Event(k).Sample = fread(HDR.FILE.FID,1,'int32');
HDR.EVENT.POS(k) = fread(HDR.FILE.FID,1,'int32');
tmp = fread(HDR.FILE.FID,4,'uint16');
HDR.Event(k).selected = tmp(1);
HDR.Event(k).TextLocked = tmp(2);
HDR.Event(k).PositionLocked = tmp(3);
textlen = tmp(4);
HDR.Event(k).Text = fread(HDR.FILE.FID,textlen,'char');
end;
fseek(HDR.FILE.FID,HDR.HeadLen,'bof');
elseif strcmp(HDR.TYPE,'AKO'),
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-le');
HDR.Header = fread(HDR.FILE.FID,[1,46],'char');
warning('support of AKO format not completed');
HDR.SampleRate = 136; % ???
HDR.NS = 1;
HDR.Calib = [-127;1];
elseif strcmp(HDR.TYPE,'SND'),
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,HDR.Endianity);
if HDR.FILE.FID < 0,
return;
end;
if ~isempty(findstr(PERMISSION,'r')), %%%%% READ
HDR.FILE.OPEN = 1;
fseek(HDR.FILE.FID,4,'bof');
HDR.HeadLen = fread(HDR.FILE.FID,1,'uint32');
datlen = fread(HDR.FILE.FID,1,'uint32');
HDR.FILE.TYPE = fread(HDR.FILE.FID,1,'uint32');
HDR.SampleRate = fread(HDR.FILE.FID,1,'uint32');
HDR.NS = fread(HDR.FILE.FID,1,'uint32');
[tmp,count] = fread(HDR.FILE.FID, [1,HDR.HeadLen-24],'char');
HDR.INFO = setstr(tmp);
elseif ~isempty(findstr(PERMISSION,'w')), %%%%% WRITE
HDR.FILE.OPEN = 2;
if ~isfield(HDR,'NS'),
HDR.NS = 0;
end;
if ~isfield(HDR,'SPR'),
HDR.SPR = 0;
end;
if ~isfinite(HDR.NS)
HDR.NS = 0;
end;
if ~isfinite(HDR.SPR)
HDR.SPR = 0;
end;
if any([HDR.SPR,HDR.NS] <= 0);
HDR.FILE.OPEN = 3;
end;
if ~isfield(HDR,'INFO')
HDR.INFO = HDR.FileName;
end;
len = length(HDR.INFO);
if len == 0;
HDR.INFO = 'INFO';
else
HDR.INFO = [HDR.INFO,repmat(' ',1,mod(4-len,4))];
end;
HDR.HeadLen = 24+length(HDR.INFO);
if ~isfield(HDR.FILE,'TYPE')
HDR.FILE.TYPE = 6; % default float32
end;
end;
if HDR.FILE.TYPE==1,
HDR.GDFTYP = 0;
HDR.bits = 8;
elseif HDR.FILE.TYPE==2,
HDR.GDFTYP = 1;
HDR.bits = 8;
elseif HDR.FILE.TYPE==3,
HDR.GDFTYP = 3;
HDR.bits = 16;
elseif HDR.FILE.TYPE==4,
HDR.GDFTYP = 255+24;
HDR.bits = 24;
elseif HDR.FILE.TYPE==5,
HDR.GDFTYP = 5;
HDR.bits = 32;
elseif HDR.FILE.TYPE==6,
HDR.GDFTYP = 16;
HDR.bits = 32;
elseif HDR.FILE.TYPE==7,
HDR.GDFTYP = 17;
HDR.bits = 64;
elseif HDR.FILE.TYPE==11,
HDR.GDFTYP = 2;
HDR.bits = 8;
elseif HDR.FILE.TYPE==12,
HDR.GDFTYP = 4;
HDR.bits = 16;
elseif HDR.FILE.TYPE==13,
HDR.GDFTYP = 511+24;
HDR.bits = 24;
elseif HDR.FILE.TYPE==14,
HDR.GDFTYP = 6;
HDR.bits = 32;
else
fprintf(2,'Error SOPEN SND-format: datatype %i not supported\n',HDR.FILE.TYPE);
return;
end;
HDR.AS.bpb = HDR.NS*HDR.bits/8;
% Calibration
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -