---
id: wiki-2026-0508-cross-frequency-coupling-cfc
title: Cross Frequency Coupling (CFC)
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [CFC, Phase-Amplitude Coupling, PAC, Theta-Gamma Coupling]
duplicate_of: none
source_trust_level: A
confidence_score: 0.85
verification_status: applied
tags: [neuroscience, eeg, signal-processing, brain, oscillations]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: Python
  framework: MNE-Python / tensorpac / scipy
---

# Cross Frequency Coupling (CFC)

## 매 한 줄
> **"매 brain oscillation 의 매 multi-band interaction"**. Bragin 1995 hippocampus theta-gamma 발견 → Canolty 2006 PAC formalism → 2026 closed-loop neurostim 의 clinical use. 매 working memory + attention + sensorimotor binding 의 매 candidate mechanism — 매 BCI/neurofeedback의 actionable feature.

## 매 핵심

### 매 CFC types
- **Phase-Amplitude Coupling (PAC)**: 매 low-freq phase 의 high-freq amplitude 의 modulation — 매 most studied (theta phase × gamma amplitude).
- **Phase-Phase Coupling (n:m)**: 매 phase synchrony at integer ratios — 매 7:1 theta-gamma 의 hippocampus.
- **Amplitude-Amplitude Coupling**: 매 envelope co-fluctuation.
- **Phase-Frequency Coupling**: 매 less common.

### 매 PAC 측정 metrics
- **Modulation Index (MI, Tort 2010)**: 매 KL divergence — 매 가장 robust.
- **Mean Vector Length (MVL, Canolty)**: 매 simpler, noise-sensitive.
- **General Linear Model PAC (van Wijk)**: 매 statistical inference.
- **Phase-Locking Value (PLV)**: 매 phase-phase only.

### 매 Functional roles
- **Theta-Gamma (4-8 Hz × 30-100 Hz)**: 매 working memory chunking — 매 Lisman-Idiart 7±2 model.
- **Alpha-Gamma (8-13 Hz × 30-100 Hz)**: 매 attention gating — 매 sensory selection.
- **Delta-Beta (1-3 Hz × 13-30 Hz)**: 매 motor planning.
- **Theta-Alpha**: 매 hippocampus-cortex coordination.

### 매 응용
1. **BCI**: 매 PAC features 의 motor intent decoding — 매 SOTA 보다 +10% accuracy.
2. **Neurofeedback**: 매 closed-loop modulation 의 ADHD/depression.
3. **Sleep staging**: 매 SO-spindle coupling 의 NREM consolidation marker.
4. **Anesthesia depth**: 매 alpha-delta PAC 의 monitoring.
5. **Esports/flow detection**: 매 frontal theta-gamma 의 absorption marker.

## 💻 패턴

### Modulation Index (Tort 2010)
```python
import numpy as np
from scipy.signal import hilbert, butter, filtfilt

def bandpass(sig, fs, low, high, order=4):
    b, a = butter(order, [low, high], btype="band", fs=fs)
    return filtfilt(b, a, sig)

def modulation_index(signal, fs, phase_band, amp_band, n_bins=18):
    phase_sig = bandpass(signal, fs, *phase_band)
    amp_sig = bandpass(signal, fs, *amp_band)
    phase = np.angle(hilbert(phase_sig))
    amp = np.abs(hilbert(amp_sig))

    bins = np.linspace(-np.pi, np.pi, n_bins + 1)
    mean_amp = np.array([
        amp[(phase >= bins[i]) & (phase < bins[i+1])].mean()
        for i in range(n_bins)
    ])
    p = mean_amp / mean_amp.sum()
    H = -np.sum(p * np.log(p + 1e-12))
    Hmax = np.log(n_bins)
    return (Hmax - H) / Hmax  # MI ∈ [0, 1]
```

### PAC Comodulogram (frequency-pair sweep)
```python
def comodulogram(signal, fs,
                 phase_freqs=np.arange(2, 15, 1),
                 amp_freqs=np.arange(20, 120, 5),
                 bw_phase=2, bw_amp=10):
    co = np.zeros((len(phase_freqs), len(amp_freqs)))
    for i, fp in enumerate(phase_freqs):
        for j, fa in enumerate(amp_freqs):
            co[i, j] = modulation_index(
                signal, fs,
                (fp - bw_phase/2, fp + bw_phase/2),
                (fa - bw_amp/2, fa + bw_amp/2),
            )
    return phase_freqs, amp_freqs, co
```

### Tensorpac (production library)
```python
from tensorpac import Pac
import numpy as np

# 매 multi-trial PAC + surrogate statistics
data = np.random.randn(100, 2048)  # n_epochs × n_samples
fs = 256
p = Pac(idpac=(2, 2, 4),  # MVL, swap-block surrogate, z-score
        f_pha=(2, 15, 1, 0.5), f_amp=(20, 120, 5, 5))
phases = p.filter(fs, data, ftype="phase", n_jobs=4)
amps = p.filter(fs, data, ftype="amplitude", n_jobs=4)
xpac = p.fit(phases, amps)  # n_amp × n_pha × n_epochs
```

### Sleep SO-Spindle Coupling
```python
def so_spindle_coupling(eeg, fs=500):
    # 매 slow oscillation phase (0.5-1.25 Hz) × spindle amplitude (12-15 Hz)
    return modulation_index(eeg, fs, (0.5, 1.25), (12, 15))
# 매 healthy young: MI ≈ 0.005-0.015; 매 elderly: 매 lower
```

### Closed-Loop Phase-Triggered Stim
```python
import collections, time

class PhaseTriggeredStim:
    def __init__(self, fs, target_phase=0, tolerance=0.3):
        self.fs = fs; self.buf = collections.deque(maxlen=int(fs * 2))
        self.target = target_phase; self.tol = tolerance
    def push_sample(self, x):
        self.buf.append(x)
        if len(self.buf) < self.fs: return False
        sig = np.array(self.buf)
        theta = bandpass(sig, self.fs, 4, 8)
        cur_phase = np.angle(hilbert(theta))[-1]
        return abs(cur_phase - self.target) < self.tol
    def stim_loop(self, sample_iter, deliver_pulse):
        for x in sample_iter:
            if self.push_sample(x): deliver_pulse()
```

### Statistical Significance via Surrogates
```python
def pac_zscore(signal, fs, phase_band, amp_band, n_perm=200):
    real = modulation_index(signal, fs, phase_band, amp_band)
    surr = []
    for _ in range(n_perm):
        shift = np.random.randint(fs, len(signal) - fs)
        s = np.concatenate([signal[shift:], signal[:shift]])
        surr.append(modulation_index(s, fs, phase_band, amp_band))
    return (real - np.mean(surr)) / np.std(surr)
```

## 매 결정 기준
| Use case | Approach |
|---|---|
| Single recording, exploration | Tort MI + comodulogram |
| Multi-trial group stats | Tensorpac w/ surrogates + cluster perm |
| Real-time BCI/stim | MVL (cheaper) + phase tracker |
| Sleep research | SO-spindle MI + co-occurrence |
| Tutorial/learning | Tort MI w/ 18 bins |

**기본값**: Tort 2010 MI + 200 surrogate permutations + cluster correction.

## 🔗 Graph
- 변형: [[Phase-Amplitude Coupling]]
- 응용: [[Brain-Computer Interface]] · [[Cognitive Neuroscience of Flow]]
- Adjacent: [[Working Memory]]

## 🤖 LLM 활용
**언제**: 매 PAC pipeline scaffold, 매 metric choice 의 explanation, 매 surrogate-test 의 reasoning.
**언제 X**: 매 clinical diagnostic decision 의 sole basis, 매 individual subject 의 inference 의 small-sample.

## ❌ 안티패턴
- **No surrogate test**: 매 spurious PAC 의 1/f noise + nonstationarity 의 false positive.
- **Filter ringing artifact**: 매 narrow band + steep filter 의 phase distortion.
- **Phase-amp band overlap**: 매 fp + bw/2 ≥ fa - bw/2 의 self-coupling artifact.
- **Edge effects 무시**: 매 Hilbert transform 의 endpoint distortion.
- **MVL alone**: 매 amplitude variance 의 confound — 매 MI 의 더 robust.
- **PAC = causation**: 매 correlation 의 mechanistic interpretation 의 over-claim.

## 🧪 검증 / 중복
- Verified (Tort et al. 2010 _J Neurophysiol_, Canolty & Knight 2010 _Trends Cogn Sci_, Aru et al. 2015 _Curr Opin Neurobiol_ pitfalls review).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — Tort MI + comodulogram + closed-loop stim patterns |
