JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

Cross-Frequency Coupling and Spectral Connectivity

Moving from one channel to networks: how to estimate that two sites communicate — and why volume conduction and nonsinusoidal waveforms fake half the couplings people report.

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.

A slow oscillation's phase modulating the amplitude of a faster rhythm.

\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)
Computing the Tort modulation index from Hilbert phase and amplitude.

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.