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

📄 rmart.m

📁 含有多种ICA算法的eeglab工具箱
💻 M
字号:
% rmart() - Remove eye artifacts from EEG data using regression with %           multiple time lags. Each channel is first made mean-zero. %           After JL Kenemans et al., Psychophysiology 28:114-21, 1991.%%   Usage: >> rmart('datafile','outfile',nchans,chanlist,eogchan,[threshold])% Example: >> rmart('noisy.floats','clean.floats',31,[2:31],7)%%   Input:   datafile - input float data file, multiplexed by channel%            outfile  - name of output float data file%            nchans   - number of channels in datafile%            chanlist - indices of EEG channel(s) to process (1,...,nchans)%            eogchan  - regressing channel indices(s) (1,...,nchans)%            threshold- abs threshold value to trigger regression {def|0 -> 80}%% Output: Writes [length(chanlist),size(data,2)] floats to 'outfile'%% Note: Regression epoch length and number of lags are set in the script.  %       Some machines may require a new byte_order value in the script. %       note that runica() -> icaproj() should give better results! See%       Jung et al., Psychophysiology 111:1745-58, 2000.%% Author: Tzyy-Ping Jung, SCCN/INC/UCSD, La Jolla, 1997 % Copyright (C) 1997 Tzyy-Ping Jung, SCCN/INC/UCSD, scott@sccn.ucsd.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: rmart.m,v $% Revision 1.1  2002/04/05 17:36:45  jorn% Initial revision%% 2-22-97  Tzyy-Ping Jung  CNL/Salk Institute, La Jolla, CA% 2-24-97  Formatted for ICA package release -Scott Makeig% 12-10-97 Changed name from rmartifact to rmart for toolbox inclusion -sm% 12-11-97 Adapted to read/write a float matrix -sm & sw% 09-14-00 Added comments and help -sm% 01-25-02 reformated help & license -ad   function rmart(datafile,outfile,nchans,chanlist,eogchan,threshold)if nargin < 5   help rmart   returnend%% The following parameters may be fine-tuned for a data set%DEF_THRESHOLD = 80; % trigger regression on blocks exceeding this (default)epoch         = 80; % remove artifacts in successive blocks of this lengthnlags         = 40; % perform multiple regression filtering of this lengthbyte_order    = 'b';% (machine-dependent) byte order code for fopen();MAKE_MEAN_ZERO = 1  % 1/0 flag removing mean offset from each channelfprintf('Performing artifact regression on data in %s.\n',datafile);if nargin<6    threshold = 0;endif threshold == 0,   threshold = DEF_THRESHOLD;endfprintf('Regression threshold %g.\n',threshold);%% Read the input data%[fid,msg]=fopen(datafile,'r',byte_order); % open datafileif fid < 3,   fprintf('rmart() - could not open data file: %s\n',msg);  exit 1enddata=(fread(fid,'float'))';status=fclose('all');if ~isint(length(data)/nchans) % check length   fprintf(''rmart() - data length not divisible by %d chans.\n',nchans);    returnenddata = reshape(data,nchans,length(data)/nchans);[chans,frames] = size(data);fprintf('Data of size [%d,%d] read.\n',chans,frames);eog = data(eogchan,:);data = data(chanlist,:);procchans = length(chanlist);fprintf('Regression epoch length %d frames.\n',epoch);fprintf('Using %d regression lags.\n',nlags);if length(eogchan)> 1  fprintf('Processing %d of %d channels using %d EOG channels.\n',...                        procchans,chans,length(eogchan));else  fprintf('Processing %d of %d channels using EOG channel %d.\n',...                        procchans,chans,eogchan);end%% Process the data%for i=1:procchans  chan = chanlist(i);  idx=[];  frame=1+epoch/2+nlags/2;  if MAKE_MEAN_ZERO    data(chan,:) = data(chan,:) - mean(data(chan,:)); % make mean-zero  end  % Search the EOG & EEG records for values above threshold,   % Selected frame numbers are registered in the variable "idx".   % The entries in "idx" are at least epoch apart to avoid double   % compensation (regression) on the same portion of the EEG data.  while frame <= length(eog)-epoch/2-nlags/2,  % foreach epoch in channel    stop = min(frame+epoch-1,eogframes);    tmp= ...        find( abs(eog(frame:stop)) >= threshold ...             | abs(data(chan,frame:stop)) >= threshold);                                           % find beyond-threshold values    if length(tmp) ~= 0      mark = tmp(1)+frame-1;      if  length(idx) ~= 0        if mark-idx(length(idx))  < epoch,           idx=[idx idx(length(idx))+epoch]; % To guarantee idx(i) & idx(i-1)                                             % are at least EPOCH points apart           frame = idx(length(idx))+epoch/2;        else           idx=[idx mark];           frame = mark + epoch/2;        end      else        idx=[idx mark];        frame = mark + epoch/2;      end     else      frame=frame+epoch;    end  end % while  % For each registered frame, take "epoch" points  % surrounding it from the EEG, and "epoch + lag" points  % from the EOG channel. Then perform multivariate   % linear regression on EEG channel.  for j=1:length(idx);     art=ones(1,epoch);     eogtmp=eog(idx(j)-epoch/2-nlags/2:idx(j)+epoch/2-1+nlags/2);     % Collect EOG data from lag/2 points before to lag/2 points      % after the regression window.     for J=nlags:-1:1,       art=[art ; eogtmp(J:J+epoch-1)];     end     eegtmp=data(chan,idx(j)-epoch/2:idx(j)+epoch/2-1);     eegeog=eegtmp*art';        % perform the regression here     eogeog=art*art';     b=eegeog/eogeog;     eegtmp=eegtmp-b*art;     data(chan,idx(j)-epoch/2:idx(j)+epoch/2-1)=eegtmp;   end % jend % i%% Write output file%[fid,msg]=fopen(outfile,'w',byte_order);if fid < 3  fprintf('rmart() - could not open output file: %s\n',msg);  returnendcount = fwrite(fid,data,'float');if count == procchans*frames,  fprintf('Output file "%s" written, size = [%d,%d] \n\n',...             outfile,procchans,frames);else  fprintf('rmart(): Output file "%s" written, SIZE ONLY [%d,%g]\n',..             outfile,procchans,count/procchans);endfclose('all');

⌨️ 快捷键说明

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