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

📄 sread.m

📁 matlab数字信号处理工具箱
💻 M
📖 第 1 页 / 共 3 页
字号:
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;
        
        nr = min(HDR.SampleRate*NoS,size(HDR.data,1)-HDR.FILE.POS);
	S  = HDR.data(HDR.FILE.POS + (1:nr), HDR.InChanSelect);
        HDR.FILE.POS = HDR.FILE.POS + nr;
	
        
elseif strcmp(HDR.TYPE,'SCP'),
	if nargin>2,
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;

	nr = min(HDR.SampleRate * NoS, size(HDR.data,1) - HDR.FILE.POS);
        
        S  = HDR.data(HDR.FILE.POS + (1:nr), HDR.InChanSelect);
        
        HDR.FILE.POS = HDR.FILE.POS + nr;
	
        
elseif strcmp(HDR.TYPE,'GTEC'),
	if nargin>2,
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;

	nr = min(HDR.SampleRate * NoS, size(HDR.data,1) - HDR.FILE.POS);
        
        S  = HDR.data(HDR.FILE.POS + (1:nr), HDR.InChanSelect);
        
        HDR.FILE.POS = HDR.FILE.POS + nr;
	
        
elseif strcmp(HDR.TYPE,'SIGIF'),
        if nargin==3,
                HDR.FILE.POS = StartPos;
        end;
        
        S = [];
        for k = 1:min(NoS,HDR.NRec-HDR.FILE.POS),
                HDR.FILE.POS = HDR.FILE.POS + 1;
                fseek(HDR.FILE.FID, HDR.Block.Pos(HDR.FILE.POS), 'bof');
                if HDR.FLAG.TimeStamp,
                        HDR.Frame(k).TimeStamp = fread(HDR.FILE.FID,[1,9],'char');
                end;
                
                if HDR.FLAG.SegmentLength,
                        HDR.Block.Length(k) = fread(HDR.FILE.FID,1,'uint16');  %#26
                        fseek(HDR.FILE.FID,HDR.Block.Length(k)*H1.Bytes_per_Sample,'cof');
                else
                        tmp = HDR.Segment_separator-1;
                        [dat,c] = fread(HDR.FILE.FID,[HDR.NS,HDR.Block.Length/HDR.NS],HDR.GDFTYP);
                        [tmpsep,c] = fread(HDR.FILE.FID,1,HDR.GDFTYP);
                        
                        if  (tmpsep~=HDR.Segment_separator);
                                fprintf(HDR.FILE.stderr,'Error SREAD Type=SIGIF: blockseparator not found\n');
                        end;
                end;
                S = [S; dat(HDR.InChanSelect,:)'];
        end;
        
        
elseif strcmp(HDR.TYPE,'CTF'),
        if nargin>2,
                fseek(HDR.FILE.FID,HDR.HeadLen+HDR.NS*HDR.SPR*4*StartPos,'bof');        
                HDR.FILE.POS = StartPos;
        end;
	
	nr = min(NoS, HDR.NRec - HDR.FILE.POS);
	
        S = []; count = 0; 
	for k = 1:nr,
	        %[tmp,c] = fread(HDR.FILE.FID, 1, 'int32')
	        [s,c] = fread(HDR.FILE.FID, [HDR.SPR, HDR.NS], 'int32');
		S = [S; s(:,HDR.InChanSelect)];
		count = count + c;
	end;
	
        HDR.FILE.POS = HDR.FILE.POS + count/(HDR.SPR*HDR.NS);
        
        
elseif strcmp(HDR.TYPE,'EEProbe-CNT'),
        if nargin>2,
                fseek(HDR.FILE.FID,HDR.SampleRate*HDR.AS.bpb,'bof');        
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;
        
        nr = min(HDR.SampleRate*NoS, HDR.SPR-HDR.FILE.POS);
        try
                % it appears to be a EEProbe file with continuous EEG data
                tmp = read_eep_cnt(HDR.FileName, HDR.FILE.POS+1, HDR.FILE.POS+nr);
                HDR.FILE.POS = HDR.FILE.POS + nr;
                S = tmp.data(HDR.InChanSelect,:)';
        catch
                fprintf(HDR.FILE.stderr,'ERROR SREAD (EEProbe): Cannot open EEProbe-file, because read_eep_cnt.mex not installed. \n');
                fprintf(HDR.FILE.stderr,'ERROR SREAD (EEProbe): You can downlad it from http://www.smi.auc.dk/~roberto/eeprobe/\n');
        end

        
elseif strcmp(HDR.TYPE,'EEProbe-AVR'),
        if nargin>2,
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;

        nr = min(HDR.SPR-HDR.FILE.POS,NoS*HDR.SampleRate);

        S = HDR.EEP.data(HDR.FILE.POS+(1:nr),:);
        HDR.FILE.POS = HDR.FILE.POS + nr;

        
elseif strcmp(HDR.TYPE,'BVbinmul'), %Brainvision, binary, multiplexed
        if nargin>2,
                fseek(HDR.FILE.FID,HDR.SampleRate*HDR.AS.bpb,'bof');        
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;
        
        nr = min(HDR.SampleRate*NoS, HDR.AS.endpos-HDR.FILE.POS);
        [dat, count] = fread(HDR.FILE.FID, [HDR.NS, nr], gdfdatatype(HDR.GDFTYP));
        
        % rename and transpose the data
        S = dat(HDR.InChanSelect,:)';
        HDR.FILE.POS = HDR.FILE.POS + count/HDR.NS;

        
elseif strcmp(HDR.TYPE,'BVbinvec'), %Brainvision, binary, vectorized
        S = [];
        
        nr = min(HDR.SampleRate*NoS, HDR.AS.endpos-HDR.FILE.POS);

        for chan = 1:length(HDR.InChanSelect);
                fseek(HDR.FILE.FID,HDR.HeadLen + HDR.FILE.POS + HDR.AS.bpb/HDR.NS * HDR.SPR,'bof');
                [s,count] = fread(HDR.FILE.FID,[nr,1],gdfdatatype(HDR.GDFTYP));
                if count~=nr,
                        fprintf(2,'ERROR READ BV-bin-vec: \n');
                        return;
                end;    
                S(:,chan) = s;        
        end
        HDR.FILE.POS = HDR.FILE.POS + count; 

        
elseif strcmp(HDR.TYPE,'BVascii'), %Brainvision, ascii
        if nargin>2,
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;
        nr = min(HDR.SampleRate*NoS, HDR.AS.endpos-HDR.FILE.POS);
        S  = HDR.BV.data(HDR.FILE.POS+(1:nr),HDR.InChanSelect);
        
        
elseif strcmp(HDR.TYPE,'BrainVision'),   %Brainvision, unknown
        error('SREAD (BrainVision): unsupported fileformat for data');
        
        
elseif strcmp(HDR.TYPE,'SierraECG'),   %% SierraECG  1.03  *.open.xml from PHILIPS
        if ~isfield(HDR,'data');
                [HDR.data,status] = str2double(HDR.XML.waveforms.parsedwaveforms);
                if any(status)
                        error('SREAD: compressed SierraECG (Philips) format not supported')
                end;
                HDR.data = reshape(HDR.data,length(HDR.data)/HDR.NS,HDR.NS);
                HDR.SPR = size(HDR.data,1);
        else
                % base64 - decoding 
                base64 = ['A':'Z','a':'z','0':'9','+','/'];
                decode64 = repmat(nan,256,1);
                decode64(abs(base64)) = 0:63;
                tmp = decode64(HDR.XML.waveforms.parsedwaveforms);
                tmp(isnan(tmp)) = [];
                n   = length(tmp);
                tmp = reshape([tmp;zeros(mod(n,4),1)], 4, ceil(n/4));
                t1  = tmp(1,:)*4 + floor(tmp(2,:)/16);
                t2  = mod(tmp(2,:),16)*16 + floor(tmp(3,:)/4);
                t3  = mod(tmp(3,:),4)*64 + tmp(4,:);
                tmp = reshape([t1,t2,t3], ceil(n/4)*3, 1);
        end;
        if nargin>2,
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;
        nr = min(HDR.SampleRate*NoS, HDR.SPR-HDR.FILE.POS);
        S  = HDR.data(HDR.FILE.POS+(1:nr),HDR.InChanSelect);
        HDR.FILE.POS = HDR.FILE.POS + nr;

        
elseif strcmp(HDR.TYPE,'XML-FDA'),   % FDA-XML Format
        if ~isfield(HDR,'data');
                tmp   = HDR.XML.component.series.derivation;
                if isfield(tmp,'Series');
                        tmp = tmp.Series.component.sequenceSet.component;
                else    % Dovermed.CO.IL version of format
                        tmp = tmp.derivedSeries.component.sequenceSet.component;
                end;
                for k = 1:length(HDR.InChanSelect);
                        HDR.data(:,k) = str2double(tmp{HDR.InChanSelect(k)+1}.sequence.value.digits)';
                end;
                HDR.SPR = size(HDR.data,1);
        end;
        if nargin>2,
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;
        nr = min(HDR.SampleRate*NoS, HDR.SPR-HDR.FILE.POS);
        S  = HDR.data(HDR.FILE.POS+(1:nr),:);
        HDR.FILE.POS = HDR.FILE.POS + nr;

        
elseif strcmp(HDR.TYPE,'FIF'),
        % some parts of this code are from Robert Oostenveld, 
        if ~(exist('rawdata')==3 & exist('channames')==3)
                error('cannot find Neuromag import routines on your Matlab path (see http://boojum.hut.fi/~kuutela/meg-pd)');
        end
        if nargin<3, 
                StartPos = HDR.FILE.POS/HDR.SampleRate;
        end
        if nargin>2,
                HDR.FILE.POS = HDR.SampleRate*StartPos;
        end;

        t1 = rawdata('goto', HDR.FILE.POS/HDR.SPR);
        t2 = t1;
        dat = [];
        count = 0;
        status = 'ok';
        
        while (t2<(StartPos + NoS)) & ~strcmp(status,'eof'),
                [buf, status] = rawdata('next'); 
                if ~strcmp(status, 'ok')
                        error('error reading selected data from fif-file');
                else
                        count = count + size(buf,2);
                        dat = [dat; buf(HDR.InChanSelect,:)'];
                end
                t2 = rawdata('t');
        end

        t = t1*HDR.SampleRate+1:t2*HDR.SampleRate;
        ix = (t>StartPos*HDR.SampleRate) & (t<=(StartPos+NoS)*HDR.SampleRate);
        S = dat(ix,HDR.InChanSelect);
        HDR.FILE.POS = t2*HDR.SampleRate;        
        
else
        fprintf(2,'Error SREAD: %s-format not supported yet.\n', HDR.TYPE);        
end;


if ~HDR.FLAG.UCAL,
        % S = [ones(size(S,1),1),S]*HDR.Calib([1;1+HDR.InChanSelect],:); 
        % perform the previous function more efficiently and
        % taking into account some specialities related to Octave sparse
        % data. 

        if 1; %exist('OCTAVE_VERSION')
                % force octave to do a sparse multiplication
                % the difference is NaN*sparse(0) = 0 instead of NaN
                % this is important for the automatic overflow detection

		Calib = full(HDR.Calib);   % Octave can not index structed sparse matrix 
                tmp = zeros(size(S,1),size(Calib,2));   % memory allocation
                for k = 1:size(Calib,2),
                        chan = find(Calib(1+HDR.InChanSelect,k));
                        tmp(:,k) = S(:,chan) * Calib(1+HDR.InChanSelect(chan),k) + Calib(1,k);
                end
                S = tmp; 
        else
                % S = [ones(size(S,1),1),S]*HDR.Calib([1;1+HDR.InChanSelect],:); 
                % the following is the same as above but needs less memory. 
                S = S * HDR.Calib(1+HDR.InChanSelect,:);
                for k = 1:size(HDR.Calib,2),
                        S(:,k) = S(:,k) + HDR.Calib(1,k);
                end;
        end;
end;

⌨️ 快捷键说明

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