pop_resample.m

来自「含有多种ICA算法的eeglab工具箱」· M 代码 · 共 215 行

M
215
字号
% pop_resample() - resample dataset (pop up window).%% Usage:%   >> [OUTEEG] = pop_resample( INEEG ); % pop up interactive window%   >> [OUTEEG] = pop_resample( INEEG, freq);%% Graphical interface:%   The edit box entitled "New sampling rate" contains the frequency in%   Hz for resampling the data. Entering a value in this box  is the same %   as providing it in the 'freq' input from the command line.%% Inputs:%   INEEG      - input dataset%   freq       - frequency to resample (Hz)  %% Outputs:%   OUTEEG     - output dataset%% Author: Arnaud Delorme, CNL / Salk Institute, 2001%% Note: uses the resample() function from the signal processing toolbox%       if present. Otherwise use griddata interpolation method (it should be%       reprogrammed using spline interpolation for speed up).%% See also: resample(), eeglab()%123456789012345678901234567890123456789012345678901234567890123456789012% Copyright (C) 2001 Arnaud Delorme, Salk Institute, arno@salk.edu%% 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% $Log: pop_resample.m,v $% Revision 1.11  2004/06/03 19:18:18  arno% taking into account boundaries for resampling%% Revision 1.10  2003/12/04 23:03:34  arno% detect resample%% Revision 1.9  2003/12/03 03:28:34  arno% message%% Revision 1.8  2003/12/03 03:19:23  arno% allow to use interpolation% instead of resample%% Revision 1.7  2003/09/29 23:45:07  arno% reinitializing urevent if crash%% Revision 1.6  2003/06/28 02:28:05  arno% fixing slight inacuracy in sampling rate%% Revision 1.5  2003/06/28 02:26:45  arno% fixing slight inacuracy in new sampling rate%% Revision 1.4  2003/06/13 15:07:00  arno% adding urevent compatiblity%% Revision 1.3  2003/02/16 22:59:40  arno% adding text for GUI in header%% Revision 1.2  2002/08/12 02:30:30  arno% [6~[6~inputdlg2%% Revision 1.1  2002/04/05 17:32:13  jorn% Initial revision%% 01-25-02 reformated help & license -ad % 03-08-02 remove ica activity resampling (now set to []) -ad% 03-08-02 debug call to function help -ad% 04-05-02 recompute event latencies -adfunction [EEG, command] = pop_resample( EEG, freq); command = '';if nargin < 1    help pop_resample;    return;end;     if isempty(EEG.data)    disp('Pop_resample error: cannot resample empty dataset'); return;end;    if nargin < 2 	% popup window parameters	% -----------------------	promptstr    = {['New sampling rate']};	inistr       = { num2str(EEG.srate) };	result       = inputdlg2( promptstr, 'Resample current dataset -- pop_resample()', 1,  inistr, 'pop_resample');	if length(result) == 0 return; end;	freq         = eval( result{1} );end;% finding the best ratio[p,q] = rat(freq/EEG.srate, 0.0001); % not used right now % set variable% ------------EEG.data = reshape(EEG.data, EEG.nbchan, EEG.pnts, EEG.trials);oldpnts   = EEG.pnts;% resample for multiple channels% -------------------------if isfield(EEG, 'event') & isfield(EEG.event, 'type') & isstr(EEG.event(1).type)    bounds = strmatch('boundary', { EEG.event.type });    if ~isempty(bounds),        if exist('resample') == 2            disp('Data break detected and taken into account for resampling');        end;        bounds = cell2mat({ EEG.event(bounds).latency });        if bounds(1) < 0, bounds(1) = []; end; % remove initial boundary if any    end;    bounds = [1 round(bounds-0.5)+1 size(EEG.data,2)+1];else     bounds = [1 size(EEG.data,2)];end;if exist('resample') == 2    fprintf('resampling data %3.4f Hz\n', EEG.srate*p/q);    for index1 = 1:size(EEG.data,1)        fprintf('%d ', index1);	        sigtmp = squeeze (EEG.data(index1,:, :));                if index1 == 1            tmpres = [];            indices = [1];            for ind = 1:length(bounds)-1                tmpres  = [ tmpres resample( sigtmp(bounds(ind):bounds(ind+1)-1), p, q ) ];                indices = [ indices length(tmpres)+1 ];            end;            if size(tmpres,1) == 1, EEG.pnts  = size(tmpres,2);            else                    EEG.pnts  = size(tmpres,1);            end;            tmpeeglab = zeros(EEG.nbchan, EEG.pnts, EEG.trials);        else            for ind = 1:length(bounds)-1                tmpres(indices(ind):indices(ind+1)-1) = resample( sigtmp(bounds(ind):bounds(ind+1)-1), p, q );            end;        end;                tmpeeglab(index1,:, :) = tmpres;    end;    fprintf('\n');	    EEG.srate   = EEG.srate*p/q;else    disp('This method of resampling uses the griddata function and is extremelly slow');    disp('To speed it up, use the signal processing toolbox (automatically detected)');    disp('or reprogram this function using spline interpolation (see >> help spline)');    disp('This method also ignores data breaks if any');    EEG.srate   = (round(EEG.pnts*p/q)-1)/(EEG.xmax-EEG.xmin);    fprintf('resampling data %3.4f Hz\n', EEG.srate);    tmpeeglab = myresample(EEG.data, EEG.pnts, round(EEG.pnts*p/q));end;EEG.data = tmpeeglab;% recompute all event latencies% -----------------------------if isfield(EEG.event, 'latency')    fprintf('resampling event latencies...\n');    for index1 = 1:length(EEG.event)        EEG.event(index1).latency = EEG.event(index1).latency * EEG.pnts /oldpnts;    end;    if isfield(EEG, 'urevent') & isfield(EEG.urevent, 'latency')        try,            for index1 = 1:length(EEG.event)                EEG.urevent(index1).latency = EEG.urevent(index1).latency * EEG.pnts /oldpnts;            end;        catch,             disp('pop_resample warning: ''urevent'' problem, reinitializing urevents');            EEG = rmfield(EEG, 'urevent');        end;    end;end;% resample for multiple channels icaEEG.icaact = [];% store datasetfprintf('resampling finished\n');EEG.setname = [EEG.setname ' resampled'];command = sprintf('EEG = pop_resample( %s, %d);', inputname(1), freq);return;% resample if resample is not present% -----------------------------------function tmpeeglab = myresample(data, pnts, new_pnts);    Y  = [1 2];	for index1 = 1:size(data,1)		fprintf('Channel %d\n', index1);			for index3 = 1:size(data,3)			X = [1:pnts];			XX = linspace( 1, pnts, new_pnts);			tmpsig = [ squeeze(data(index1, :, index3))' squeeze(data(index1, :, index3))'];   			[Xi,Yi,Zi] = griddata(Y,X', tmpsig , Y, XX', 'invdist');   % interpolate data			tmpeeglab(index1,:, index3) = Zi(:,1);			fprintf('.');		end;		fprintf('\n');		end;

⌨️ 快捷键说明

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