Compute a cross-spectral density (CSD) matrix#

A cross-spectral density (CSD) matrix is similar to a covariance matrix, but in the time-frequency domain. It is the first step towards computing sensor-to-sensor coherence or a DICS beamformer.

This script demonstrates the three methods that MNE-Python provides to compute the CSD:

  1. Using short-term Fourier transform: mne.time_frequency.csd_fourier()

  2. Using a multitaper approach: mne.time_frequency.csd_multitaper()

  3. Using Morlet wavelets: mne.time_frequency.csd_morlet()

# Author: Marijn van Vliet <w.m.vanvliet@gmail.com>
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.
import mne
from mne.datasets import sample
from mne.time_frequency import csd_fourier, csd_morlet, csd_multitaper

print(__doc__)

In the following example, the computation of the CSD matrices can be performed using multiple cores. Set n_jobs to a value >1 to select the number of cores to use.

n_jobs = 1

Loading the sample dataset.

data_path = sample.data_path()
meg_path = data_path / "MEG" / "sample"
fname_raw = meg_path / "sample_audvis_raw.fif"
fname_event = meg_path / "sample_audvis_raw-eve.fif"
raw = mne.io.read_raw_fif(fname_raw)
events = mne.read_events(fname_event)
Opening raw data file /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif...
    Read a total of 3 projection items:
        PCA-v1 (1 x 102)  idle
        PCA-v2 (1 x 102)  idle
        PCA-v3 (1 x 102)  idle
    Range : 25800 ... 192599 =     42.956 ...   320.670 secs
Ready.

By default, CSD matrices are computed using all MEG/EEG channels. When interpreting a CSD matrix with mixed sensor types, be aware that the measurement units, and thus the scalings, differ across sensors. In this example, for speed and clarity, we select a single channel type: gradiometers.

picks = mne.pick_types(raw.info, meg="grad")

# Make some epochs, based on events with trigger code 1
epochs = mne.Epochs(
    raw,
    events,
    event_id=1,
    tmin=-0.2,
    tmax=1,
    picks=picks,
    baseline=(None, 0),
    reject=dict(grad=4000e-13),
    preload=True,
)
Not setting metadata
72 matching events found
Setting baseline interval to [-0.19979521315838786, 0.0] s
Applying baseline correction (mode: mean)
0 projection items activated
Loading data for 72 events and 722 original time points ...
0 bad epochs dropped

Computing CSD matrices using short-term Fourier transform and (adaptive) multitapers is straightforward:

csd_fft = csd_fourier(epochs, fmin=15, fmax=20, n_jobs=n_jobs)
csd_mt = csd_multitaper(epochs, fmin=15, fmax=20, adaptive=True, n_jobs=n_jobs)
Computing cross-spectral density from epochs...

  0%|          | CSD epoch blocks : 0/72 [00:00<?,       ?it/s]
  1%|▏         | CSD epoch blocks : 1/72 [00:00<00:01,   57.90it/s]
  3%|▎         | CSD epoch blocks : 2/72 [00:00<00:01,   57.84it/s]
  4%|▍         | CSD epoch blocks : 3/72 [00:00<00:01,   54.66it/s]
  6%|▌         | CSD epoch blocks : 4/72 [00:00<00:01,   55.79it/s]
  7%|▋         | CSD epoch blocks : 5/72 [00:00<00:01,   56.37it/s]
  8%|▊         | CSD epoch blocks : 6/72 [00:00<00:01,   54.10it/s]
 10%|▉         | CSD epoch blocks : 7/72 [00:00<00:01,   52.63it/s]
 11%|█         | CSD epoch blocks : 8/72 [00:00<00:01,   52.20it/s]
 12%|█▎        | CSD epoch blocks : 9/72 [00:00<00:01,   51.19it/s]
 14%|█▍        | CSD epoch blocks : 10/72 [00:00<00:01,   50.39it/s]
 15%|█▌        | CSD epoch blocks : 11/72 [00:00<00:01,   50.29it/s]
 17%|█▋        | CSD epoch blocks : 12/72 [00:00<00:01,   49.80it/s]
 18%|█▊        | CSD epoch blocks : 13/72 [00:00<00:01,   49.62it/s]
 19%|█▉        | CSD epoch blocks : 14/72 [00:00<00:01,   49.24it/s]
 21%|██        | CSD epoch blocks : 15/72 [00:00<00:01,   48.45it/s]
 22%|██▏       | CSD epoch blocks : 16/72 [00:00<00:01,   48.34it/s]
 24%|██▎       | CSD epoch blocks : 17/72 [00:00<00:01,   48.74it/s]
 25%|██▌       | CSD epoch blocks : 18/72 [00:00<00:01,   49.23it/s]
 26%|██▋       | CSD epoch blocks : 19/72 [00:00<00:01,   49.78it/s]
 28%|██▊       | CSD epoch blocks : 20/72 [00:00<00:01,   50.29it/s]
 29%|██▉       | CSD epoch blocks : 21/72 [00:00<00:01,   50.47it/s]
 31%|███       | CSD epoch blocks : 22/72 [00:00<00:00,   50.44it/s]
 32%|███▏      | CSD epoch blocks : 23/72 [00:00<00:00,   50.46it/s]
 33%|███▎      | CSD epoch blocks : 24/72 [00:00<00:00,   50.43it/s]
 35%|███▍      | CSD epoch blocks : 25/72 [00:00<00:00,   50.74it/s]
 36%|███▌      | CSD epoch blocks : 26/72 [00:00<00:00,   51.13it/s]
 38%|███▊      | CSD epoch blocks : 27/72 [00:00<00:00,   51.58it/s]
 39%|███▉      | CSD epoch blocks : 28/72 [00:00<00:00,   52.00it/s]
 40%|████      | CSD epoch blocks : 29/72 [00:00<00:00,   51.95it/s]
 42%|████▏     | CSD epoch blocks : 30/72 [00:00<00:00,   51.98it/s]
 43%|████▎     | CSD epoch blocks : 31/72 [00:00<00:00,   52.29it/s]
 44%|████▍     | CSD epoch blocks : 32/72 [00:00<00:00,   52.36it/s]
 46%|████▌     | CSD epoch blocks : 33/72 [00:00<00:00,   52.61it/s]
 47%|████▋     | CSD epoch blocks : 34/72 [00:00<00:00,   52.36it/s]
 49%|████▊     | CSD epoch blocks : 35/72 [00:00<00:00,   52.29it/s]
 50%|█████     | CSD epoch blocks : 36/72 [00:00<00:00,   52.43it/s]
 51%|█████▏    | CSD epoch blocks : 37/72 [00:00<00:00,   52.24it/s]
 53%|█████▎    | CSD epoch blocks : 38/72 [00:00<00:00,   52.27it/s]
 54%|█████▍    | CSD epoch blocks : 39/72 [00:00<00:00,   52.02it/s]
 56%|█████▌    | CSD epoch blocks : 40/72 [00:00<00:00,   52.02it/s]
 57%|█████▋    | CSD epoch blocks : 41/72 [00:00<00:00,   52.07it/s]
 58%|█████▊    | CSD epoch blocks : 42/72 [00:00<00:00,   52.16it/s]
 60%|█████▉    | CSD epoch blocks : 43/72 [00:00<00:00,   52.40it/s]
 61%|██████    | CSD epoch blocks : 44/72 [00:00<00:00,   52.64it/s]
 62%|██████▎   | CSD epoch blocks : 45/72 [00:00<00:00,   52.56it/s]
 64%|██████▍   | CSD epoch blocks : 46/72 [00:00<00:00,   52.76it/s]
 65%|██████▌   | CSD epoch blocks : 47/72 [00:00<00:00,   52.94it/s]
 67%|██████▋   | CSD epoch blocks : 48/72 [00:00<00:00,   52.92it/s]
 68%|██████▊   | CSD epoch blocks : 49/72 [00:00<00:00,   53.10it/s]
 69%|██████▉   | CSD epoch blocks : 50/72 [00:00<00:00,   53.06it/s]
 71%|███████   | CSD epoch blocks : 51/72 [00:00<00:00,   53.20it/s]
 72%|███████▏  | CSD epoch blocks : 52/72 [00:01<00:00,   48.54it/s]
 74%|███████▎  | CSD epoch blocks : 53/72 [00:01<00:00,   46.84it/s]
 75%|███████▌  | CSD epoch blocks : 54/72 [00:01<00:00,   47.32it/s]
 76%|███████▋  | CSD epoch blocks : 55/72 [00:01<00:00,   47.78it/s]
 78%|███████▊  | CSD epoch blocks : 56/72 [00:01<00:00,   48.23it/s]
 79%|███████▉  | CSD epoch blocks : 57/72 [00:01<00:00,   48.71it/s]
 81%|████████  | CSD epoch blocks : 58/72 [00:01<00:00,   49.19it/s]
 82%|████████▏ | CSD epoch blocks : 59/72 [00:01<00:00,   49.67it/s]
 83%|████████▎ | CSD epoch blocks : 60/72 [00:01<00:00,   50.13it/s]
 85%|████████▍ | CSD epoch blocks : 61/72 [00:01<00:00,   50.40it/s]
 86%|████████▌ | CSD epoch blocks : 62/72 [00:01<00:00,   50.54it/s]
 88%|████████▊ | CSD epoch blocks : 63/72 [00:01<00:00,   50.50it/s]
 89%|████████▉ | CSD epoch blocks : 64/72 [00:01<00:00,   50.79it/s]
 90%|█████████ | CSD epoch blocks : 65/72 [00:01<00:00,   50.97it/s]
 92%|█████████▏| CSD epoch blocks : 66/72 [00:01<00:00,   51.18it/s]
 93%|█████████▎| CSD epoch blocks : 67/72 [00:01<00:00,   51.43it/s]
 94%|█████████▍| CSD epoch blocks : 68/72 [00:01<00:00,   51.57it/s]
 96%|█████████▌| CSD epoch blocks : 69/72 [00:01<00:00,   51.92it/s]
 97%|█████████▋| CSD epoch blocks : 70/72 [00:01<00:00,   49.97it/s]
 99%|█████████▊| CSD epoch blocks : 71/72 [00:01<00:00,   50.01it/s]
100%|██████████| CSD epoch blocks : 72/72 [00:01<00:00,   50.15it/s]
100%|██████████| CSD epoch blocks : 72/72 [00:01<00:00,   50.75it/s]
[done]
    Using multitaper spectrum estimation with 7 DPSS windows
Computing cross-spectral density from epochs...

  0%|          | CSD epoch blocks : 0/72 [00:00<?,       ?it/s]
  1%|▏         | CSD epoch blocks : 1/72 [00:00<00:13,    5.37it/s]
  3%|▎         | CSD epoch blocks : 2/72 [00:00<00:12,    5.44it/s]
  4%|▍         | CSD epoch blocks : 3/72 [00:00<00:12,    5.47it/s]
  6%|▌         | CSD epoch blocks : 4/72 [00:00<00:12,    5.28it/s]
  7%|▋         | CSD epoch blocks : 5/72 [00:00<00:12,    5.47it/s]
  8%|▊         | CSD epoch blocks : 6/72 [00:01<00:12,    5.15it/s]
 10%|▉         | CSD epoch blocks : 7/72 [00:01<00:12,    5.19it/s]
 11%|█         | CSD epoch blocks : 8/72 [00:01<00:12,    5.19it/s]
 12%|█▎        | CSD epoch blocks : 9/72 [00:01<00:12,    5.23it/s]
 14%|█▍        | CSD epoch blocks : 10/72 [00:01<00:12,    5.07it/s]
 15%|█▌        | CSD epoch blocks : 11/72 [00:02<00:12,    5.02it/s]
 17%|█▋        | CSD epoch blocks : 12/72 [00:02<00:11,    5.02it/s]
 18%|█▊        | CSD epoch blocks : 13/72 [00:02<00:11,    5.01it/s]
 19%|█▉        | CSD epoch blocks : 14/72 [00:02<00:11,    5.00it/s]
 21%|██        | CSD epoch blocks : 15/72 [00:02<00:11,    5.01it/s]
 22%|██▏       | CSD epoch blocks : 16/72 [00:03<00:11,    5.01it/s]
 24%|██▎       | CSD epoch blocks : 17/72 [00:03<00:11,    4.99it/s]
 25%|██▌       | CSD epoch blocks : 18/72 [00:03<00:10,    5.05it/s]
 26%|██▋       | CSD epoch blocks : 19/72 [00:03<00:10,    5.11it/s]
 28%|██▊       | CSD epoch blocks : 20/72 [00:03<00:10,    5.20it/s]
 29%|██▉       | CSD epoch blocks : 21/72 [00:04<00:09,    5.28it/s]
 31%|███       | CSD epoch blocks : 22/72 [00:04<00:09,    5.36it/s]
 32%|███▏      | CSD epoch blocks : 23/72 [00:04<00:09,    5.43it/s]
 33%|███▎      | CSD epoch blocks : 24/72 [00:04<00:08,    5.50it/s]
 35%|███▍      | CSD epoch blocks : 25/72 [00:04<00:08,    5.54it/s]
 36%|███▌      | CSD epoch blocks : 26/72 [00:04<00:08,    5.61it/s]
 38%|███▊      | CSD epoch blocks : 27/72 [00:04<00:07,    5.64it/s]
 39%|███▉      | CSD epoch blocks : 28/72 [00:05<00:07,    5.69it/s]
 40%|████      | CSD epoch blocks : 29/72 [00:05<00:07,    5.71it/s]
 42%|████▏     | CSD epoch blocks : 30/72 [00:05<00:07,    5.76it/s]
 43%|████▎     | CSD epoch blocks : 31/72 [00:05<00:07,    5.80it/s]
 44%|████▍     | CSD epoch blocks : 32/72 [00:05<00:06,    5.81it/s]
 46%|████▌     | CSD epoch blocks : 33/72 [00:05<00:06,    5.84it/s]
 47%|████▋     | CSD epoch blocks : 34/72 [00:06<00:06,    5.86it/s]
 49%|████▊     | CSD epoch blocks : 35/72 [00:06<00:06,    5.90it/s]
 50%|█████     | CSD epoch blocks : 36/72 [00:06<00:06,    5.91it/s]
 51%|█████▏    | CSD epoch blocks : 37/72 [00:06<00:05,    5.95it/s]
 53%|█████▎    | CSD epoch blocks : 38/72 [00:06<00:05,    5.99it/s]
 54%|█████▍    | CSD epoch blocks : 39/72 [00:06<00:05,    6.00it/s]
 56%|█████▌    | CSD epoch blocks : 40/72 [00:07<00:05,    6.03it/s]
 57%|█████▋    | CSD epoch blocks : 41/72 [00:07<00:05,    6.04it/s]
 58%|█████▊    | CSD epoch blocks : 42/72 [00:07<00:04,    6.07it/s]
 60%|█████▉    | CSD epoch blocks : 43/72 [00:07<00:04,    6.10it/s]
 61%|██████    | CSD epoch blocks : 44/72 [00:07<00:04,    6.11it/s]
 62%|██████▎   | CSD epoch blocks : 45/72 [00:07<00:04,    6.15it/s]
 64%|██████▍   | CSD epoch blocks : 46/72 [00:07<00:04,    6.15it/s]
 65%|██████▌   | CSD epoch blocks : 47/72 [00:08<00:04,    6.17it/s]
 67%|██████▋   | CSD epoch blocks : 48/72 [00:08<00:03,    6.18it/s]
 68%|██████▊   | CSD epoch blocks : 49/72 [00:08<00:03,    6.20it/s]
 69%|██████▉   | CSD epoch blocks : 50/72 [00:08<00:03,    6.21it/s]
 71%|███████   | CSD epoch blocks : 51/72 [00:08<00:03,    6.24it/s]
 72%|███████▏  | CSD epoch blocks : 52/72 [00:08<00:03,    6.25it/s]
 74%|███████▎  | CSD epoch blocks : 53/72 [00:09<00:03,    6.26it/s]
 75%|███████▌  | CSD epoch blocks : 54/72 [00:09<00:02,    6.28it/s]
 76%|███████▋  | CSD epoch blocks : 55/72 [00:09<00:02,    6.26it/s]
 78%|███████▊  | CSD epoch blocks : 56/72 [00:09<00:02,    6.34it/s]
 79%|███████▉  | CSD epoch blocks : 57/72 [00:09<00:02,    6.39it/s]
 81%|████████  | CSD epoch blocks : 58/72 [00:09<00:02,    6.44it/s]
 82%|████████▏ | CSD epoch blocks : 59/72 [00:09<00:02,    6.48it/s]
 83%|████████▎ | CSD epoch blocks : 60/72 [00:10<00:01,    6.49it/s]
 85%|████████▍ | CSD epoch blocks : 61/72 [00:10<00:01,    6.49it/s]
 86%|████████▌ | CSD epoch blocks : 62/72 [00:10<00:01,    6.50it/s]
 88%|████████▊ | CSD epoch blocks : 63/72 [00:10<00:01,    6.55it/s]
 89%|████████▉ | CSD epoch blocks : 64/72 [00:10<00:01,    6.58it/s]
 90%|█████████ | CSD epoch blocks : 65/72 [00:10<00:01,    6.62it/s]
 92%|█████████▏| CSD epoch blocks : 66/72 [00:10<00:00,    6.67it/s]
 93%|█████████▎| CSD epoch blocks : 67/72 [00:10<00:00,    6.67it/s]
 94%|█████████▍| CSD epoch blocks : 68/72 [00:11<00:00,    6.67it/s]
 96%|█████████▌| CSD epoch blocks : 69/72 [00:11<00:00,    6.67it/s]
 97%|█████████▋| CSD epoch blocks : 70/72 [00:11<00:00,    6.68it/s]
 99%|█████████▊| CSD epoch blocks : 71/72 [00:11<00:00,    6.75it/s]
100%|██████████| CSD epoch blocks : 72/72 [00:11<00:00,    6.75it/s]
100%|██████████| CSD epoch blocks : 72/72 [00:11<00:00,    6.15it/s]
[done]

When computing the CSD with Morlet wavelets, you specify the exact frequencies at which to compute it. For each frequency, a corresponding wavelet will be constructed and convolved with the signal, resulting in a time-frequency decomposition.

The CSD is constructed by computing the correlation between the time-frequency representations between all sensor-to-sensor pairs. The time-frequency decomposition originally has the same sampling rate as the signal, in our case ~600Hz. This means the decomposition is over-specified in time and we may not need to use all samples during our CSD computation, just enough to get a reliable correlation statistic. By specifying decim=10, we use every 10th sample, which will greatly speed up the computation and will have a minimal effect on the CSD.

frequencies = [16, 17, 18, 19, 20]
csd_wav = csd_morlet(epochs, frequencies, decim=10, n_jobs=n_jobs)
Computing cross-spectral density from epochs...

  0%|          | CSD epoch blocks : 0/72 [00:00<?,       ?it/s]
  1%|▏         | CSD epoch blocks : 1/72 [00:00<00:06,   11.65it/s]
  3%|▎         | CSD epoch blocks : 2/72 [00:00<00:05,   11.71it/s]
  4%|▍         | CSD epoch blocks : 3/72 [00:00<00:05,   11.69it/s]
  6%|▌         | CSD epoch blocks : 4/72 [00:00<00:05,   11.62it/s]
  7%|▋         | CSD epoch blocks : 5/72 [00:00<00:05,   11.43it/s]
  8%|▊         | CSD epoch blocks : 6/72 [00:00<00:05,   11.36it/s]
 10%|▉         | CSD epoch blocks : 7/72 [00:00<00:05,   11.39it/s]
 11%|█         | CSD epoch blocks : 8/72 [00:00<00:05,   11.40it/s]
 12%|█▎        | CSD epoch blocks : 9/72 [00:00<00:05,   11.34it/s]
 14%|█▍        | CSD epoch blocks : 10/72 [00:00<00:05,   11.35it/s]
 15%|█▌        | CSD epoch blocks : 11/72 [00:00<00:05,   11.33it/s]
 17%|█▋        | CSD epoch blocks : 12/72 [00:01<00:05,   11.32it/s]
 18%|█▊        | CSD epoch blocks : 13/72 [00:01<00:05,   11.28it/s]
 19%|█▉        | CSD epoch blocks : 14/72 [00:01<00:05,   11.25it/s]
 21%|██        | CSD epoch blocks : 15/72 [00:01<00:05,   11.22it/s]
 22%|██▏       | CSD epoch blocks : 16/72 [00:01<00:04,   11.22it/s]
 24%|██▎       | CSD epoch blocks : 17/72 [00:01<00:04,   11.23it/s]
 25%|██▌       | CSD epoch blocks : 18/72 [00:01<00:04,   11.29it/s]
 26%|██▋       | CSD epoch blocks : 19/72 [00:01<00:04,   11.39it/s]
 28%|██▊       | CSD epoch blocks : 20/72 [00:01<00:04,   11.48it/s]
 29%|██▉       | CSD epoch blocks : 21/72 [00:01<00:04,   11.57it/s]
 31%|███       | CSD epoch blocks : 22/72 [00:01<00:04,   11.64it/s]
 32%|███▏      | CSD epoch blocks : 23/72 [00:01<00:04,   11.70it/s]
 33%|███▎      | CSD epoch blocks : 24/72 [00:02<00:04,   11.74it/s]
 35%|███▍      | CSD epoch blocks : 25/72 [00:02<00:03,   11.80it/s]
 36%|███▌      | CSD epoch blocks : 26/72 [00:02<00:03,   11.86it/s]
 38%|███▊      | CSD epoch blocks : 27/72 [00:02<00:03,   11.91it/s]
 39%|███▉      | CSD epoch blocks : 28/72 [00:02<00:03,   11.95it/s]
 40%|████      | CSD epoch blocks : 29/72 [00:02<00:03,   11.99it/s]
 42%|████▏     | CSD epoch blocks : 30/72 [00:02<00:03,   12.03it/s]
 43%|████▎     | CSD epoch blocks : 31/72 [00:02<00:03,   11.97it/s]
 44%|████▍     | CSD epoch blocks : 32/72 [00:02<00:03,   11.96it/s]
 46%|████▌     | CSD epoch blocks : 33/72 [00:02<00:03,   12.00it/s]
 47%|████▋     | CSD epoch blocks : 34/72 [00:02<00:03,   12.04it/s]
 49%|████▊     | CSD epoch blocks : 35/72 [00:02<00:03,   12.07it/s]
 50%|█████     | CSD epoch blocks : 36/72 [00:03<00:02,   12.11it/s]
 51%|█████▏    | CSD epoch blocks : 37/72 [00:03<00:02,   12.14it/s]
 53%|█████▎    | CSD epoch blocks : 38/72 [00:03<00:02,   12.16it/s]
 54%|█████▍    | CSD epoch blocks : 39/72 [00:03<00:02,   12.11it/s]
 56%|█████▌    | CSD epoch blocks : 40/72 [00:03<00:02,   12.18it/s]
 57%|█████▋    | CSD epoch blocks : 41/72 [00:03<00:02,   12.13it/s]
 58%|█████▊    | CSD epoch blocks : 42/72 [00:03<00:02,   12.13it/s]
 60%|█████▉    | CSD epoch blocks : 43/72 [00:03<00:02,   12.15it/s]
 61%|██████    | CSD epoch blocks : 44/72 [00:03<00:02,   12.17it/s]
 62%|██████▎   | CSD epoch blocks : 45/72 [00:03<00:02,   12.14it/s]
 64%|██████▍   | CSD epoch blocks : 46/72 [00:03<00:02,   12.10it/s]
 65%|██████▌   | CSD epoch blocks : 47/72 [00:03<00:02,   12.08it/s]
 67%|██████▋   | CSD epoch blocks : 48/72 [00:04<00:01,   12.05it/s]
 68%|██████▊   | CSD epoch blocks : 49/72 [00:04<00:01,   12.01it/s]
 69%|██████▉   | CSD epoch blocks : 50/72 [00:04<00:01,   12.06it/s]
 71%|███████   | CSD epoch blocks : 51/72 [00:04<00:01,   12.03it/s]
 72%|███████▏  | CSD epoch blocks : 52/72 [00:04<00:01,   12.06it/s]
 74%|███████▎  | CSD epoch blocks : 53/72 [00:04<00:01,   12.12it/s]
 75%|███████▌  | CSD epoch blocks : 54/72 [00:04<00:01,   12.10it/s]
 76%|███████▋  | CSD epoch blocks : 55/72 [00:04<00:01,   12.08it/s]
 78%|███████▊  | CSD epoch blocks : 56/72 [00:04<00:01,   12.08it/s]
 79%|███████▉  | CSD epoch blocks : 57/72 [00:04<00:01,   12.19it/s]
 81%|████████  | CSD epoch blocks : 58/72 [00:04<00:01,   12.21it/s]
 82%|████████▏ | CSD epoch blocks : 59/72 [00:04<00:01,   12.24it/s]
 83%|████████▎ | CSD epoch blocks : 60/72 [00:04<00:00,   12.39it/s]
 85%|████████▍ | CSD epoch blocks : 61/72 [00:05<00:00,   12.58it/s]
 86%|████████▌ | CSD epoch blocks : 62/72 [00:05<00:00,   12.75it/s]
 88%|████████▊ | CSD epoch blocks : 63/72 [00:05<00:00,   12.93it/s]
 89%|████████▉ | CSD epoch blocks : 64/72 [00:05<00:00,   13.09it/s]
 90%|█████████ | CSD epoch blocks : 65/72 [00:05<00:00,   13.25it/s]
 92%|█████████▏| CSD epoch blocks : 66/72 [00:05<00:00,   13.41it/s]
 93%|█████████▎| CSD epoch blocks : 67/72 [00:05<00:00,   13.57it/s]
 94%|█████████▍| CSD epoch blocks : 68/72 [00:05<00:00,   13.72it/s]
 96%|█████████▌| CSD epoch blocks : 69/72 [00:05<00:00,   13.86it/s]
 97%|█████████▋| CSD epoch blocks : 70/72 [00:05<00:00,   14.00it/s]
 99%|█████████▊| CSD epoch blocks : 71/72 [00:05<00:00,   14.13it/s]
100%|██████████| CSD epoch blocks : 72/72 [00:05<00:00,   14.25it/s]
100%|██████████| CSD epoch blocks : 72/72 [00:05<00:00,   12.68it/s]
[done]

The resulting mne.time_frequency.CrossSpectralDensity objects have a plotting function we can use to compare the results of the different methods. We’re plotting the mean CSD across frequencies. mne.time_frequency.CrossSpectralDensity.plot() returns a list of created figures; in this case, each returned list has only one figure so we use a Python trick of including a comma after our variable name to assign the figure (not the list) to our fig variable:

plot_dict = {
    "Short-time Fourier transform": csd_fft,
    "Adaptive multitapers": csd_mt,
    "Morlet wavelet transform": csd_wav,
}
for title, csd in plot_dict.items():
    (fig,) = csd.mean().plot()
    fig.suptitle(title)
  • Short-time Fourier transform, 15.8-20.0 Hz.
  • Adaptive multitapers, 15.8-20.0 Hz.
  • Morlet wavelet transform, 16.0-20.0 Hz.

Total running time of the script: (0 minutes 20.274 seconds)

Gallery generated by Sphinx-Gallery