?? sopen.m
字號:
function [HDR,H1,h2] = sopen(arg1,PERMISSION,CHAN,MODE,arg5,arg6)
% SOPEN opens signal files for reading and writing and returns
% the header information.
% Many different data formats are supported.
%
% HDR = sopen(Filename, PERMISSION, [, CHAN [, MODE]]);
% [S,HDR] = sread(HDR, NoR, StartPos);
% HDR = sclose(HDR);
%
% PERMISSION is one of the following strings
% 'r' read header
% 'w' write header
%
% CHAN defines a list of selected Channels
% Alternative CHAN can be also a Re-Referencing Matrix ReRefMx
% (i.e. a spatial filter).
% E.g. the following command returns the difference and
% the mean of the first two channels.
% HDR = sopen(Filename, 'r', [[1;-1],[.5,5]]);
% [S,HDR] = sread(HDR, NoR, StartPos);
% HDR = sclose(HDR);
%
% HDR contains the Headerinformation and internal data
% S returns the signal data
%
% see also: SOPEN, SREAD, SSEEK, STELL, SCLOSE, SWRITE, SEOF
% 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.
% $Revision: 1.65 $
% $Id: sopen.m,v 1.65 2004/09/13 17:27:26 schloegl Exp $
% (C) 1997-2004 by Alois Schloegl <a.schloegl@ieee.org>
% This is part of the BIOSIG-toolbox http://biosig.sf.net/
if isnan(str2double('1, 3'));
fprintf(2,'Warning BIOSIG: incorrect version of STR2DOUBLE.\n');
fprintf(2,'- Its recommended to update STR2DOUBLE. Contact Alois!\n');
end;
if nargin<2,
PERMISSION='rb';
elseif ~any(PERMISSION=='b');
PERMISSION = [PERMISSION,'b']; % force binary open. Needed for Octave
end;
if nargin<3, CHAN = 0; end;
if all(size(CHAN)>1) | any(floor(CHAN)~=CHAN) | (any(CHAN<0) & prod(size(CHAN))>1),
ReRefMx = CHAN;
CHAN = find(any(CHAN,2));
end
if nargin<4, MODE = ''; end;
if ~isstruct(arg1),
HDR.FileName = arg1;
else
HDR = arg1;
end;
if isempty(MODE), MODE=' '; end; % Make sure MODE is not empty -> FINDSTR
[pfad,file,FileExt] = fileparts(HDR.FileName);
HDR.FILE.Name = file;
HDR.FILE.Path = pfad;
HDR.FILE.Ext = FileExt(2:length(FileExt));
HDR.FILE.OPEN = 0;
HDR.FILE.FID = -1;
if ~isfield(HDR.FILE,'stderr'),
HDR.FILE.stderr = 2;
end;
if ~isfield(HDR.FILE,'stdout'),
HDR.FILE.stdout = 1;
end;
% test for type of file
if any(PERMISSION=='r'),
HDR = getfiletype(HDR);
end;
%% Initialization
if ~isfield(HDR,'NS');
HDR.NS = NaN;
end;
if ~isfield(HDR,'SampleRate');
HDR.SampleRate = NaN;
end;
if ~isfield(HDR,'Label');
HDR.Label = [];
end;
if ~isfield(HDR,'PhysDim');
HDR.PhysDim = '';
end;
if ~isfield(HDR,'T0');
HDR.T0 = repmat(nan,1,6);
end;
if ~isfield(HDR,'Filter');
HDR.Filter.LowPass = NaN;
HDR.Filter.HighPass = NaN;
end;
if ~isfield(HDR,'FLAG');
HDR.FLAG.UCAL = ~isempty(findstr(MODE,'UCAL')); % FLAG for UN-CALIBRATING
HDR.FLAG.FILT = 0; % FLAG if any filter is applied;
HDR.FLAG.TRIGGERED = 0; % the data is untriggered by default
end;
if ~isfield(HDR,'EVENT');
HDR.EVENT.N = 0;
HDR.EVENT.TYP = [];
HDR.EVENT.POS = [];
end;
if strcmp(HDR.TYPE,'EDF') | strcmp(HDR.TYPE,'GDF') | strcmp(HDR.TYPE,'BDF'),
if any(PERMISSION=='w');
HDR = eegchkhdr(HDR);
end;
if nargin<4,
HDR = sdfopen(HDR,PERMISSION,CHAN);
else
HDR = sdfopen(HDR,PERMISSION,CHAN,MODE);
end;
elseif strcmp(HDR.TYPE,'BKR'),
HDR = bkropen(HDR,PERMISSION,CHAN);
elseif strmatch(HDR.TYPE,['CNT';'AVG';'EEG']),
if any(PERMISSION=='r');
[HDR,H1,h2] = cntopen(HDR,PERMISSION,CHAN);
elseif any(PERMISSION=='w');
% check header information
if ~isfield(HDR,'NS'),
HDR.NS = 0;
end;
if ~isfinite(HDR.NS) | (HDR.NS<0)
fprintf(2,'Error SOPEN CNT-Write: HDR.NS not defined\n');
return;
end;
if ~isfield(HDR,'SPR'),
HDR.SPR = 0;
end;
if ~isfinite(HDR.SPR)
HDR.SPR = 0;
end;
type = 2;
if strmatch(HDR.TYPE,'EEG'), type = 1;
elseif strmatch(HDR.TYPE,'AVG'), type = 0;
end;
if ~isfield(HDR,'PID')
HDR.PID = char(repmat(32,1,20));
elseif prod(size(HDR.PID))>20,
HDR.PID = HDR.PID(1:20);
else
HDR.PID = [HDR.PID(:)',repmat(32,1,20-length(HDR.PID(:)))];
%HDR.PID = [HDR.PID,repmat(32,1,20-length(HDR.PID))];
end;
if ~isfield(HDR,'Label')
HDR.Label = int2str((1:HDR.NS)');
elseif iscell(HDR.Label),
HDR.Label = cat(1,HDR.Label);
end;
if size(HDR.Label,2)>10,
HDR.Label = HDR.Label(:,1:10);
elseif size(HDR.Label,2)<10,
HDR.Label = [HDR.Label,repmat(32,HDR.NS,10-size(HDR.Label,2))];
end;
if ~isfield(HDR,'Calib')
HDR.Cal = ones(HDR.NS,1);
e.sensitivity = ones(HDR.NS,1)*204.8;
HDR.Off = zeros(HDR.NS,1);
else
HDR.Cal = diag(HDR.Calib(2:end,:));
e.sensitivity = ones(HDR.NS,1)*204.8;
HDR.Off = round(HDR.Calib(1,:)'./HDR.Cal);
end;
% open file
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-le');
if HDR.FILE.FID < 0,
return;
end;
HDR.FILE.OPEN = 2;
if any([HDR.SPR] <= 0);
HDR.FILE.OPEN = 3;
end;
% write fixed header
fwrite(HDR.FILE.FID,'Version 3.0','char');
fwrite(HDR.FILE.FID,zeros(2,1),'uint32');
fwrite(HDR.FILE.FID,type,'uchar');
fwrite(HDR.FILE.FID,HDR.PID,'uchar');
fwrite(HDR.FILE.FID,repmat(0,1,900-ftell(HDR.FILE.FID)),'uchar')
% write variable header
for k = 1:HDR.NS,
count = fwrite(HDR.FILE.FID,HDR.Label(k,:),'uchar');
count = fwrite(HDR.FILE.FID,zeros(5,1),'uchar');
count = fwrite(HDR.FILE.FID, 0, 'ushort');
count = fwrite(HDR.FILE.FID,zeros(2,1),'uchar');
count = fwrite(HDR.FILE.FID,zeros(7,1),'float');
count = fwrite(HDR.FILE.FID,HDR.Off(k),'short');
count = fwrite(HDR.FILE.FID,zeros(2,1),'uchar');
count = fwrite(HDR.FILE.FID,[zeros(2,1),e.sensitivity(k)],'float');
count = fwrite(HDR.FILE.FID,zeros(3,1),'char');
count = fwrite(HDR.FILE.FID,zeros(4,1),'uchar');
count = fwrite(HDR.FILE.FID,zeros(1,1),'char');
count = fwrite(HDR.FILE.FID,HDR.Cal(k),'short');
end;
HDR.HeadLen = ftell(HDR.FILE.FID);
if HDR.HeadLen ~= (900+75*HDR.NS),
fprintf(2,'Error SOPEN CNT-Write: Headersize does not fit\n');
end;
end;
elseif strcmp(HDR.TYPE,'FEF'), % FEF/Vital format included
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,HDR.Endianity);
fseek(HDR.FILE.FID,32,'bof'); % skip preamble
if exist('fefopen','file'),
HDR = fefopen(HDR);
end;
fprintf(2,'Warning SOPEN: Implementing Vital/FEF format not completed yet. Contact <a.schloegl@ieee.org> if you are interested in this feature.\n');
HDR.FILE.FID = -1;
return;
elseif strcmp(HDR.TYPE,'SCP'), %
HDR = scpopen(HDR,PERMISSION);
HDR.Calib = sparse(2:HDR.NS+1,1:HDR.NS,1);
elseif strcmp(HDR.TYPE,'EBS'),
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-be');
fprintf(2,'Warning SOPEN: Implementing EBS format not completed yet. Contact <a.schloegl@ieee.org> if you are interested in this feature.\n');
%%%%% (1) Fixed Header (32 bytes) %%%%%
HDR.VERSION = fread(HDR.FILE.FID,[1,8],'char'); %
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -