DICS, complex filter coeffcients and Virtual Electrodes

jan-mathijs schoffelen j.schoffelen at PSY.GLA.AC.UK
Mon Feb 23 13:16:21 CET 2009

Dear Michael,

On Feb 23, 2009, at 11:45 AM, Michael Wibral wrote:

> Dear Fieldtrippers,
> I was wondering about the correct way to get SAM-like virtual
> electrodes using DICS. I naively tried to compute some virtual
> electrodes using the DICS filter coeffcients on the raw
> timecourses, but that obviously doesn't work because DICS filter
> coefficients are complex (at least in Fieldtrip 20081208 ?).

Yes, by default the filter-coefficients are complex-valued, when
using cfg.method = 'dics'. There's an option for sourceanalysis,
cfg.realfilter which can be set to 'yes'. When cfg.realfilter =
'yes'. The filter-coefficients are computed from the real part of the
cross-spectral density matrix only. The rationale behind this would
be that 'true' sources only live in the real part of the csd-matrix
in the first place, because the forward mapping from source to signal
is instantaneous (hence also of course the real-valued leadfields).
On the other hand, including extra information in the computation of
your filters (i.e. allowing them to be complex, thus using also the
imaginary part), probably influences the suppressive properties of
the filter. This would mean that noise sources in your data (which
are not necessarily at zero phase-lag) may be more effectively
suppressed. So I am not sure which is 'the correct' way here.
However, if you want to use DICS-based filters to project your sensor
data, I would use the option cfg.realfilter = 'yes', to obtain more
'meaningful' voxel-level time courses (but not that these time-
courses are only optimised for the frequency band on which the
filters had been computed).

> Next thing I thought about was to FFT the single trial, filter it
> and then inverse FFT it, because the DICS filters are supposed to
> work in the frequency domain. But that shouldn't work either,
> because we have iFFT(filter(FFT(trial))) = iFFT(FFT(filter(trial)))
> = filter(trial), because all operation are linear.

This is true (so indeed that exercise is meaningless), but the
subsequent estimate of power (i.e. squaring the fourier coefficients)
is not linear. (power from the filtered data: abs(filter(FFT
(trial))).^2 will be obviously different from filter(abs(FFT
(trial)).^2) ).

In general, if you want to approximate SAM, to me it would make more
sense to use a time-domain beamformer in the first place, because
DICS filters are optimised for a specific frequency bin in the first
place. In other words, inverse-fft'ing the filtered sensor-fourier
coefficients (across all frequencies) does not seem to make too much
sense to me. This would boil down to bandpass-filtering your sensor
data, calling timelockanalysis with cfg.covariance  = 'yes' and
cfg.covariancewindow = [something]. Then sourceanalysis with
cfg.method = 'lcmv', after which you can project your bp-filtered
data through the filters.

> Next thing I am puzzled about is that the Filters (A) times the
> leadfield matrix (L) should be the identity matrix: AL=1 (see the
> Gross, 2001, PNAS paper). If A is complex - as it is in Fieldtrip
> -, then we would also have a complex leadfield, which seems odd to me.

Not necessarily: the leadfield is always real-valued. If you
interpret the product A*L just as a weighted sum of the complex
numbers in A (weighted by L), the values in L can be such that the
real part of the sum ends up to be 1, and the imaginary part ends up
to be 0. (For your and my peace of mind you could try this by running
sourceanalysis with cfg.keepfilter = 'yes' and cfg.realfilter = 'no'
and cfg.keepleadfield = 'yes' and looking at a random filter*leadfield).



The aim of this list is to facilitate the discussion between users of the FieldTrip  toolbox, to share experiences and to discuss new ideas for MEG and EEG analysis. See also http://listserv.surfnet.nl/archives/fieldtrip.html and http://www.ru.nl/fcdonders/fieldtrip.

More information about the fieldtrip mailing list