# 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)
from matplotlib import pyplot as plt

import mne
from mne.datasets import sample
from mne.time_frequency import csd_fourier, csd_multitaper, csd_morlet

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
```

```data_path = sample.data_path()
fname_raw = data_path + '/MEG/sample/sample_audvis_raw.fif'
fname_event = data_path + '/MEG/sample/sample_audvis_raw-eve.fif'
```

Out:

```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
```

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),
```

Out:

```Not setting metadata
72 matching events found
Setting baseline interval to [-0.19979521315838786, 0.0] sec
Applying baseline correction (mode: mean)
3 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)
```

Out:

```Removing projector <Projection | PCA-v1, active : True, n_channels : 102>
Removing projector <Projection | PCA-v2, active : True, n_channels : 102>
Removing projector <Projection | PCA-v3, active : True, n_channels : 102>
Computing cross-spectral density from epochs...

0%|          | CSD epoch blocks : 0/72 [00:00<?,       ?it/s]
1%|1         | CSD epoch blocks : 1/72 [00:00<00:02,   27.71it/s]
3%|2         | CSD epoch blocks : 2/72 [00:00<00:01,   38.44it/s]
4%|4         | CSD epoch blocks : 3/72 [00:00<00:01,   44.27it/s]
6%|5         | CSD epoch blocks : 4/72 [00:00<00:01,   48.01it/s]
7%|6         | CSD epoch blocks : 5/72 [00:00<00:01,   50.59it/s]
8%|8         | CSD epoch blocks : 6/72 [00:00<00:01,   52.41it/s]
10%|9         | CSD epoch blocks : 7/72 [00:00<00:01,   53.71it/s]
11%|#1        | CSD epoch blocks : 8/72 [00:00<00:01,   54.82it/s]
12%|#2        | CSD epoch blocks : 9/72 [00:00<00:01,   55.69it/s]
14%|#3        | CSD epoch blocks : 10/72 [00:00<00:01,   56.32it/s]
15%|#5        | CSD epoch blocks : 11/72 [00:00<00:01,   56.80it/s]
17%|#6        | CSD epoch blocks : 12/72 [00:00<00:01,   55.51it/s]
18%|#8        | CSD epoch blocks : 13/72 [00:00<00:01,   56.08it/s]
19%|#9        | CSD epoch blocks : 14/72 [00:00<00:01,   56.52it/s]
22%|##2       | CSD epoch blocks : 16/72 [00:00<00:00,   57.57it/s]
24%|##3       | CSD epoch blocks : 17/72 [00:00<00:00,   57.90it/s]
25%|##5       | CSD epoch blocks : 18/72 [00:00<00:00,   58.22it/s]
26%|##6       | CSD epoch blocks : 19/72 [00:00<00:00,   58.51it/s]
29%|##9       | CSD epoch blocks : 21/72 [00:00<00:00,   59.15it/s]
31%|###       | CSD epoch blocks : 22/72 [00:00<00:00,   59.06it/s]
32%|###1      | CSD epoch blocks : 23/72 [00:00<00:00,   59.17it/s]
33%|###3      | CSD epoch blocks : 24/72 [00:00<00:00,   59.28it/s]
35%|###4      | CSD epoch blocks : 25/72 [00:00<00:00,   59.36it/s]
36%|###6      | CSD epoch blocks : 26/72 [00:00<00:00,   59.46it/s]
38%|###7      | CSD epoch blocks : 27/72 [00:00<00:00,   59.62it/s]
39%|###8      | CSD epoch blocks : 28/72 [00:00<00:00,   59.73it/s]
40%|####      | CSD epoch blocks : 29/72 [00:00<00:00,   59.79it/s]
42%|####1     | CSD epoch blocks : 30/72 [00:00<00:00,   59.82it/s]
43%|####3     | CSD epoch blocks : 31/72 [00:00<00:00,   59.93it/s]
44%|####4     | CSD epoch blocks : 32/72 [00:00<00:00,   60.01it/s]
46%|####5     | CSD epoch blocks : 33/72 [00:00<00:00,   60.08it/s]
47%|####7     | CSD epoch blocks : 34/72 [00:00<00:00,   60.14it/s]
50%|#####     | CSD epoch blocks : 36/72 [00:00<00:00,   60.40it/s]
51%|#####1    | CSD epoch blocks : 37/72 [00:00<00:00,   60.50it/s]
53%|#####2    | CSD epoch blocks : 38/72 [00:00<00:00,   60.52it/s]
54%|#####4    | CSD epoch blocks : 39/72 [00:00<00:00,   60.61it/s]
56%|#####5    | CSD epoch blocks : 40/72 [00:00<00:00,   60.70it/s]
58%|#####8    | CSD epoch blocks : 42/72 [00:00<00:00,   60.98it/s]
61%|######1   | CSD epoch blocks : 44/72 [00:00<00:00,   61.26it/s]
62%|######2   | CSD epoch blocks : 45/72 [00:00<00:00,   61.31it/s]
65%|######5   | CSD epoch blocks : 47/72 [00:00<00:00,   61.50it/s]
68%|######8   | CSD epoch blocks : 49/72 [00:00<00:00,   61.66it/s]
71%|#######   | CSD epoch blocks : 51/72 [00:00<00:00,   61.81it/s]
72%|#######2  | CSD epoch blocks : 52/72 [00:00<00:00,   61.84it/s]
74%|#######3  | CSD epoch blocks : 53/72 [00:00<00:00,   61.86it/s]
76%|#######6  | CSD epoch blocks : 55/72 [00:00<00:00,   61.98it/s]
78%|#######7  | CSD epoch blocks : 56/72 [00:00<00:00,   61.98it/s]
79%|#######9  | CSD epoch blocks : 57/72 [00:00<00:00,   61.99it/s]
82%|########1 | CSD epoch blocks : 59/72 [00:00<00:00,   62.07it/s]
83%|########3 | CSD epoch blocks : 60/72 [00:00<00:00,   62.08it/s]
85%|########4 | CSD epoch blocks : 61/72 [00:01<00:00,   62.08it/s]
88%|########7 | CSD epoch blocks : 63/72 [00:01<00:00,   62.19it/s]
90%|######### | CSD epoch blocks : 65/72 [00:01<00:00,   62.22it/s]
92%|#########1| CSD epoch blocks : 66/72 [00:01<00:00,   62.19it/s]
93%|#########3| CSD epoch blocks : 67/72 [00:01<00:00,   62.20it/s]
94%|#########4| CSD epoch blocks : 68/72 [00:01<00:00,   62.21it/s]
97%|#########7| CSD epoch blocks : 70/72 [00:01<00:00,   62.27it/s]
99%|#########8| CSD epoch blocks : 71/72 [00:01<00:00,   62.26it/s]
100%|##########| CSD epoch blocks : 72/72 [00:01<00:00,   62.24it/s]
100%|##########| CSD epoch blocks : 72/72 [00:01<00:00,   60.83it/s]
[done]
Removing projector <Projection | PCA-v1, active : True, n_channels : 102>
Removing projector <Projection | PCA-v2, active : True, n_channels : 102>
Removing projector <Projection | PCA-v3, active : True, n_channels : 102>
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%|1         | CSD epoch blocks : 1/72 [00:00<00:17,    4.04it/s]
3%|2         | CSD epoch blocks : 2/72 [00:00<00:13,    5.07it/s]
4%|4         | CSD epoch blocks : 3/72 [00:00<00:12,    5.65it/s]
6%|5         | CSD epoch blocks : 4/72 [00:00<00:11,    5.98it/s]
7%|6         | CSD epoch blocks : 5/72 [00:00<00:10,    6.21it/s]
8%|8         | CSD epoch blocks : 6/72 [00:00<00:10,    6.36it/s]
10%|9         | CSD epoch blocks : 7/72 [00:01<00:10,    6.49it/s]
11%|#1        | CSD epoch blocks : 8/72 [00:01<00:09,    6.58it/s]
12%|#2        | CSD epoch blocks : 9/72 [00:01<00:09,    6.65it/s]
14%|#3        | CSD epoch blocks : 10/72 [00:01<00:09,    6.62it/s]
15%|#5        | CSD epoch blocks : 11/72 [00:01<00:09,    6.67it/s]
17%|#6        | CSD epoch blocks : 12/72 [00:01<00:08,    6.72it/s]
18%|#8        | CSD epoch blocks : 13/72 [00:01<00:08,    6.75it/s]
19%|#9        | CSD epoch blocks : 14/72 [00:02<00:08,    6.78it/s]
21%|##        | CSD epoch blocks : 15/72 [00:02<00:08,    6.81it/s]
22%|##2       | CSD epoch blocks : 16/72 [00:02<00:08,    6.83it/s]
24%|##3       | CSD epoch blocks : 17/72 [00:02<00:08,    6.84it/s]
25%|##5       | CSD epoch blocks : 18/72 [00:02<00:07,    6.86it/s]
26%|##6       | CSD epoch blocks : 19/72 [00:02<00:07,    6.86it/s]
28%|##7       | CSD epoch blocks : 20/72 [00:02<00:07,    6.83it/s]
29%|##9       | CSD epoch blocks : 21/72 [00:03<00:07,    6.72it/s]
31%|###       | CSD epoch blocks : 22/72 [00:03<00:07,    6.75it/s]
32%|###1      | CSD epoch blocks : 23/72 [00:03<00:07,    6.77it/s]
33%|###3      | CSD epoch blocks : 24/72 [00:03<00:07,    6.80it/s]
35%|###4      | CSD epoch blocks : 25/72 [00:03<00:06,    6.83it/s]
36%|###6      | CSD epoch blocks : 26/72 [00:03<00:06,    6.85it/s]
38%|###7      | CSD epoch blocks : 27/72 [00:03<00:06,    6.81it/s]
39%|###8      | CSD epoch blocks : 28/72 [00:04<00:06,    6.84it/s]
40%|####      | CSD epoch blocks : 29/72 [00:04<00:06,    6.86it/s]
42%|####1     | CSD epoch blocks : 30/72 [00:04<00:06,    6.87it/s]
43%|####3     | CSD epoch blocks : 31/72 [00:04<00:05,    6.89it/s]
44%|####4     | CSD epoch blocks : 32/72 [00:04<00:05,    6.91it/s]
46%|####5     | CSD epoch blocks : 33/72 [00:04<00:05,    6.93it/s]
47%|####7     | CSD epoch blocks : 34/72 [00:04<00:05,    6.94it/s]
49%|####8     | CSD epoch blocks : 35/72 [00:05<00:05,    6.96it/s]
50%|#####     | CSD epoch blocks : 36/72 [00:05<00:05,    6.91it/s]
51%|#####1    | CSD epoch blocks : 37/72 [00:05<00:05,    6.91it/s]
53%|#####2    | CSD epoch blocks : 38/72 [00:05<00:04,    6.82it/s]
54%|#####4    | CSD epoch blocks : 39/72 [00:05<00:04,    6.84it/s]
56%|#####5    | CSD epoch blocks : 40/72 [00:05<00:04,    6.86it/s]
57%|#####6    | CSD epoch blocks : 41/72 [00:06<00:04,    6.87it/s]
58%|#####8    | CSD epoch blocks : 42/72 [00:06<00:04,    6.89it/s]
60%|#####9    | CSD epoch blocks : 43/72 [00:06<00:04,    6.91it/s]
61%|######1   | CSD epoch blocks : 44/72 [00:06<00:04,    6.88it/s]
62%|######2   | CSD epoch blocks : 45/72 [00:06<00:03,    6.80it/s]
64%|######3   | CSD epoch blocks : 46/72 [00:06<00:03,    6.82it/s]
65%|######5   | CSD epoch blocks : 47/72 [00:06<00:03,    6.80it/s]
67%|######6   | CSD epoch blocks : 48/72 [00:07<00:03,    6.81it/s]
68%|######8   | CSD epoch blocks : 49/72 [00:07<00:03,    6.83it/s]
69%|######9   | CSD epoch blocks : 50/72 [00:07<00:03,    6.78it/s]
71%|#######   | CSD epoch blocks : 51/72 [00:07<00:03,    6.76it/s]
72%|#######2  | CSD epoch blocks : 52/72 [00:07<00:02,    6.74it/s]
74%|#######3  | CSD epoch blocks : 53/72 [00:07<00:02,    6.73it/s]
75%|#######5  | CSD epoch blocks : 54/72 [00:07<00:02,    6.74it/s]
76%|#######6  | CSD epoch blocks : 55/72 [00:08<00:02,    6.76it/s]
78%|#######7  | CSD epoch blocks : 56/72 [00:08<00:02,    6.76it/s]
79%|#######9  | CSD epoch blocks : 57/72 [00:08<00:02,    6.75it/s]
81%|########  | CSD epoch blocks : 58/72 [00:08<00:02,    6.75it/s]
82%|########1 | CSD epoch blocks : 59/72 [00:08<00:01,    6.73it/s]
83%|########3 | CSD epoch blocks : 60/72 [00:08<00:01,    6.75it/s]
85%|########4 | CSD epoch blocks : 61/72 [00:08<00:01,    6.77it/s]
86%|########6 | CSD epoch blocks : 62/72 [00:09<00:01,    6.78it/s]
88%|########7 | CSD epoch blocks : 63/72 [00:09<00:01,    6.80it/s]
89%|########8 | CSD epoch blocks : 64/72 [00:09<00:01,    6.82it/s]
90%|######### | CSD epoch blocks : 65/72 [00:09<00:01,    6.83it/s]
92%|#########1| CSD epoch blocks : 66/72 [00:09<00:00,    6.84it/s]
93%|#########3| CSD epoch blocks : 67/72 [00:09<00:00,    6.85it/s]
94%|#########4| CSD epoch blocks : 68/72 [00:09<00:00,    6.86it/s]
96%|#########5| CSD epoch blocks : 69/72 [00:10<00:00,    6.87it/s]
97%|#########7| CSD epoch blocks : 70/72 [00:10<00:00,    6.88it/s]
99%|#########8| CSD epoch blocks : 71/72 [00:10<00:00,    6.90it/s]
100%|##########| CSD epoch blocks : 72/72 [00:10<00:00,    6.91it/s]
100%|##########| CSD epoch blocks : 72/72 [00:10<00:00,    6.82it/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)
```

Out:

```Removing projector <Projection | PCA-v1, active : True, n_channels : 102>
Removing projector <Projection | PCA-v2, active : True, n_channels : 102>
Removing projector <Projection | PCA-v3, active : True, n_channels : 102>
Computing cross-spectral density from epochs...

0%|          | CSD epoch blocks : 0/72 [00:00<?,       ?it/s]
1%|1         | CSD epoch blocks : 1/72 [00:00<00:05,   12.19it/s]
3%|2         | CSD epoch blocks : 2/72 [00:00<00:05,   13.30it/s]
4%|4         | CSD epoch blocks : 3/72 [00:00<00:05,   13.67it/s]
6%|5         | CSD epoch blocks : 4/72 [00:00<00:04,   13.85it/s]
7%|6         | CSD epoch blocks : 5/72 [00:00<00:04,   13.97it/s]
8%|8         | CSD epoch blocks : 6/72 [00:00<00:04,   14.08it/s]
10%|9         | CSD epoch blocks : 7/72 [00:00<00:04,   14.17it/s]
11%|#1        | CSD epoch blocks : 8/72 [00:00<00:04,   14.19it/s]
12%|#2        | CSD epoch blocks : 9/72 [00:00<00:04,   14.22it/s]
14%|#3        | CSD epoch blocks : 10/72 [00:00<00:04,   14.27it/s]
15%|#5        | CSD epoch blocks : 11/72 [00:00<00:04,   14.29it/s]
17%|#6        | CSD epoch blocks : 12/72 [00:00<00:04,   14.33it/s]
18%|#8        | CSD epoch blocks : 13/72 [00:00<00:04,   14.35it/s]
19%|#9        | CSD epoch blocks : 14/72 [00:00<00:04,   14.36it/s]
21%|##        | CSD epoch blocks : 15/72 [00:01<00:03,   14.37it/s]
22%|##2       | CSD epoch blocks : 16/72 [00:01<00:03,   14.39it/s]
24%|##3       | CSD epoch blocks : 17/72 [00:01<00:03,   14.41it/s]
25%|##5       | CSD epoch blocks : 18/72 [00:01<00:03,   14.42it/s]
26%|##6       | CSD epoch blocks : 19/72 [00:01<00:03,   14.44it/s]
28%|##7       | CSD epoch blocks : 20/72 [00:01<00:03,   14.45it/s]
29%|##9       | CSD epoch blocks : 21/72 [00:01<00:03,   14.46it/s]
31%|###       | CSD epoch blocks : 22/72 [00:01<00:03,   14.36it/s]
32%|###1      | CSD epoch blocks : 23/72 [00:01<00:03,   14.38it/s]
33%|###3      | CSD epoch blocks : 24/72 [00:01<00:03,   14.38it/s]
35%|###4      | CSD epoch blocks : 25/72 [00:01<00:03,   14.39it/s]
36%|###6      | CSD epoch blocks : 26/72 [00:01<00:03,   14.40it/s]
38%|###7      | CSD epoch blocks : 27/72 [00:01<00:03,   14.40it/s]
39%|###8      | CSD epoch blocks : 28/72 [00:01<00:03,   14.40it/s]
40%|####      | CSD epoch blocks : 29/72 [00:02<00:02,   14.42it/s]
42%|####1     | CSD epoch blocks : 30/72 [00:02<00:02,   14.42it/s]
43%|####3     | CSD epoch blocks : 31/72 [00:02<00:02,   14.43it/s]
44%|####4     | CSD epoch blocks : 32/72 [00:02<00:02,   14.42it/s]
46%|####5     | CSD epoch blocks : 33/72 [00:02<00:02,   14.41it/s]
47%|####7     | CSD epoch blocks : 34/72 [00:02<00:02,   14.41it/s]
49%|####8     | CSD epoch blocks : 35/72 [00:02<00:02,   14.40it/s]
50%|#####     | CSD epoch blocks : 36/72 [00:02<00:02,   14.41it/s]
51%|#####1    | CSD epoch blocks : 37/72 [00:02<00:02,   14.40it/s]
53%|#####2    | CSD epoch blocks : 38/72 [00:02<00:02,   14.40it/s]
54%|#####4    | CSD epoch blocks : 39/72 [00:02<00:02,   14.40it/s]
56%|#####5    | CSD epoch blocks : 40/72 [00:02<00:02,   14.39it/s]
57%|#####6    | CSD epoch blocks : 41/72 [00:02<00:02,   14.39it/s]
58%|#####8    | CSD epoch blocks : 42/72 [00:02<00:02,   14.40it/s]
60%|#####9    | CSD epoch blocks : 43/72 [00:02<00:02,   14.41it/s]
61%|######1   | CSD epoch blocks : 44/72 [00:03<00:01,   14.41it/s]
62%|######2   | CSD epoch blocks : 45/72 [00:03<00:01,   14.41it/s]
64%|######3   | CSD epoch blocks : 46/72 [00:03<00:01,   14.39it/s]
65%|######5   | CSD epoch blocks : 47/72 [00:03<00:01,   14.40it/s]
67%|######6   | CSD epoch blocks : 48/72 [00:03<00:01,   14.40it/s]
68%|######8   | CSD epoch blocks : 49/72 [00:03<00:01,   14.19it/s]
69%|######9   | CSD epoch blocks : 50/72 [00:03<00:01,   14.02it/s]
71%|#######   | CSD epoch blocks : 51/72 [00:03<00:01,   14.05it/s]
72%|#######2  | CSD epoch blocks : 52/72 [00:03<00:01,   14.09it/s]
74%|#######3  | CSD epoch blocks : 53/72 [00:03<00:01,   14.11it/s]
75%|#######5  | CSD epoch blocks : 54/72 [00:03<00:01,   14.14it/s]
76%|#######6  | CSD epoch blocks : 55/72 [00:03<00:01,   14.17it/s]
78%|#######7  | CSD epoch blocks : 56/72 [00:03<00:01,   14.18it/s]
79%|#######9  | CSD epoch blocks : 57/72 [00:03<00:01,   14.20it/s]
81%|########  | CSD epoch blocks : 58/72 [00:04<00:00,   14.21it/s]
82%|########1 | CSD epoch blocks : 59/72 [00:04<00:00,   14.23it/s]
83%|########3 | CSD epoch blocks : 60/72 [00:04<00:00,   14.24it/s]
85%|########4 | CSD epoch blocks : 61/72 [00:04<00:00,   14.23it/s]
86%|########6 | CSD epoch blocks : 62/72 [00:04<00:00,   14.25it/s]
88%|########7 | CSD epoch blocks : 63/72 [00:04<00:00,   14.27it/s]
89%|########8 | CSD epoch blocks : 64/72 [00:04<00:00,   14.29it/s]
90%|######### | CSD epoch blocks : 65/72 [00:04<00:00,   14.29it/s]
92%|#########1| CSD epoch blocks : 66/72 [00:04<00:00,   14.31it/s]
93%|#########3| CSD epoch blocks : 67/72 [00:04<00:00,   14.32it/s]
94%|#########4| CSD epoch blocks : 68/72 [00:04<00:00,   14.33it/s]
96%|#########5| CSD epoch blocks : 69/72 [00:04<00:00,   14.34it/s]
97%|#########7| CSD epoch blocks : 70/72 [00:04<00:00,   14.15it/s]
99%|#########8| CSD epoch blocks : 71/72 [00:04<00:00,   14.06it/s]
100%|##########| CSD epoch blocks : 72/72 [00:05<00:00,   14.07it/s]
100%|##########| CSD epoch blocks : 72/72 [00:05<00:00,   14.24it/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.

```csd_fft.mean().plot()
plt.suptitle('short-term Fourier transform')

csd_mt.mean().plot()