Detect the muscle activity in an EMG channel and use that as trial definition

This page describes a FieldTrip trialfunction that detects muscle activity in an EMG channel and that defines variable length trials from the EMG onset up to the EMG offset.

You would use this function as follows

 cfg           = [];   
 cfg.dataset   = string, containing filename or directory
 cfg.trialfun  = 'trialfun_emgdetect';
 cfg           = ft_definetrial(cfg);
 data          = ft_preprocessing(cfg);

Note that there are some parameters, like the EMG channel name and the processing that is done on the EMG channel data, which are hardcoded in this trial function. You should change these parameters if neccessary.

function [trl] = trialfun_emgdetect(cfg);
 
% read the header and determine the channel number corresponding with the EMG
hdr         = ft_read_header(cfg.headerfile);
chanindx    = strmatch('EMGlft', hdr.label);
 
if length(chanindx)>1
  error('only one EMG channel supported');
end
 
% read all data of the EMG channel, assume continuous file format
emg = ft_read_data(cfg.datafile, 'header', hdr, ...
                'begsample', 1, 'endsample', hdr.nSamples*hdr.nTrials, ...
                'chanindx', chanindx, 'checkboundary', false);
 
% apply filtering, hilbert transformation and boxcar convolution (for smoothing)
emgflt      = ft_preproc_highpassfilter(emg, hdr.Fs, 10); % highpassfilter
emghlb      = abs(hilbert(emgflt')');                     % hilbert transform
emgcnv      = conv2([1], ones(1,hdr.Fs), emghlb, 'same'); % smooth using convolution
emgstd      = ft_preproc_standardize(emgcnv, 2);          % z-transform, i.e. mean=0 and stdev=1
emgtrl      = emgstd>0;                                   % detect the muscle activity
emgtrl      = diff(emgtrl, [], 2);
 
emgon       = find(emgtrl(:)== 1);
emgoff      = find(emgtrl(:)==-1);
 
trl(:,1) = emgon (:) + hdr.Fs*0.5;  % as a consequence of the convolution with a one-second boxcar
trl(:,2) = emgoff(:) - hdr.Fs*0.5;  % as a consequence of the convolution with a one-second boxcar
trl(:,3) = 0;