From one channel to two: the cross-spectrum
Connectivity in the frequency domain starts from the cross-spectral density, the frequency-resolved covariance between two channels. Its magnitude asks whether the two share power at a frequency; its phase asks with what lag. Everything else — coherence, phase-locking, Granger-style measures — is built from it.
S_{xy}(f) = \mathbb{E}\!\left[X(f)\,Y^{*}(f)\right] = |S_{xy}(f)|\,e^{i\theta_{xy}(f)}The cross-spectral density is a complex quantity: magnitude and phase.
To measure how two channels relate frequency by frequency, multiply one channel's Fourier transform by the conjugate of the other's. The result is complex: its size says how strongly they co-vary at that frequency, and its angle says their phase lag.
- S_{xy}(f)
- The cross-spectral density between channels x and y.
- X(f),\,Y^{*}(f)
- Their Fourier transforms, the second one conjugated.
- |S_{xy}(f)|
- The strength of shared activity at frequency f.
- \theta_{xy}(f)
- Their phase difference at that frequency.
Coherence and its discontents
Magnitude-squared coherence normalizes the cross-spectrum by both auto-spectra, giving a correlation-like number in [0,1] at each frequency. It is the natural linear measure of frequency-specific coupling — but it is inflated by volume conduction: a single source seen by two electrodes produces near-perfect zero-lag coherence with no communication at all.
C_{xy}(f) = \frac{|S_{xy}(f)|^2}{S_{xx}(f)\,S_{yy}(f)} \in [0,1]Magnitude-squared coherence lies between 0 and 1.
Coherence normalizes the cross-spectrum into a clean 0-to-1 score: how much of two channels' activity at frequency f is shared. One means they move in lockstep at that frequency; zero means they're unrelated there.
- C_{xy}(f)
- Magnitude-squared coherence at frequency f.
- |S_{xy}(f)|^{2}
- The shared (cross) power, squared.
- S_{xx}(f),\,S_{yy}(f)
- Each channel's own power at that frequency.
- [0,1]
- The range — the fraction of variance the two channels share.
Connectivity that resists zero-lag leakage
The fix for volume conduction is to discount zero-lag interactions. The phase-locking value measures phase consistency regardless of amplitude; the imaginary part of coherency keeps only the out-of-phase component that instantaneous mixing cannot produce; and the phase-lag index (and weighted PLI) count only the sign of the phase difference, immunizing against a shared zero-lag source.
\mathrm{PLV} = \left|\frac{1}{N}\sum_{n=1}^{N} e^{\,i\,\Delta\phi_n}\right|, \qquad \Delta\phi_n = \phi_x(n) - \phi_y(n)The phase-locking value: how consistent the phase difference is across trials.
The phase-locking value ignores amplitude and asks only: is the phase difference between two signals consistent from trial to trial? Line up all trials' phase-difference arrows and average them — if they point the same way (length near 1) the signals are phase-locked.
- \mathrm{PLV}
- The phase-locking value, between 0 and 1.
- \Delta\phi_n
- The phase difference on trial n.
- e^{i\Delta\phi_n}
- A unit arrow pointing along that phase difference.
- \tfrac{1}{N}\sum
- Average over the N trials.
Cross-frequency coupling: phase drives amplitude
Phase–amplitude coupling (PAC) asks whether the phase of a slow rhythm modulates the amplitude of a faster one — the canonical example being theta phase organizing gamma bursts in hippocampus. Operationally: band-pass to the slow band and take its Hilbert phase; band-pass to the fast band and take its Hilbert amplitude; then quantify how amplitude is distributed across phase.
\mathrm{MI} = \frac{D_{\mathrm{KL}}\!\big(P \,\|\, U\big)}{\log N_{\mathrm{bins}}} = \frac{\log N_{\mathrm{bins}} + \sum_j P(\phi_j)\log P(\phi_j)}{\log N_{\mathrm{bins}}}Tort modulation index: normalized KL divergence of the amplitude-by-phase distribution from uniform.
Measures whether a slow rhythm's phase controls a fast rhythm's amplitude (phase–amplitude coupling). Bin the fast amplitude by slow phase: if amplitude is flat across phases there's no coupling; if it peaks at certain phases the distribution departs from uniform, and the KL divergence measures that departure.
- \mathrm{MI}
- The modulation index — 0 means no coupling.
- D_{\mathrm{KL}}(P\,\|\,U)
- KL divergence of the amplitude-by-phase distribution P from uniform U.
- P(\phi_j)
- The mean fast-wave amplitude in phase bin j.
- N_{\mathrm{bins}}
- The number of phase bins — it normalizes the score.
# Phase-amplitude coupling (Tort modulation index)
phase = np.angle(hilbert(bandpass(x, f_lo))) # slow-band phase
amp = np.abs(hilbert(bandpass(x, f_hi))) # fast-band amplitude
P = np.array([amp[(phase >= b0) & (phase < b1)].mean()
for b0, b1 in phase_bins]) # mean amp per phase bin
P /= P.sum() # normalize to a distribution
MI = (np.log(n_bins) + np.sum(P * np.log(P))) / np.log(n_bins)The nonsinusoidality trap
Here is the failure mode that has retracted many PAC claims: neural rhythms are often nonsinusoidal (mu has an arch shape, cortical slow waves are sawtooth). A nonsinusoidal oscillation has harmonics, and a sharp waveform edge concentrates broadband amplitude at a consistent phase — which every PAC estimator reports as coupling even though only one rhythm exists.
The same caution applies to all these measures: coherence, PLV, and PAC are descriptions of second- and higher-order spectral structure. Whether they reflect communication is a claim about mechanism that the statistic alone cannot settle.