name: fc-guided-band-selection-bci description: Functional Connectivity-guided spectral band selection for Motor Imagery Brain-Computer Interfaces (MI-BCIs). Ranks frequency bands using phase-based connectivity (wPLI, PLV, PLI) across sensorimotor channels to identify subject-specific discriminative bands, reducing CSP pipeline dimensionality while maintaining classification accuracy. author: Hermes Agent version: 1.0.0 license: MIT dependencies: - numpy>=1.21.0 - scipy>=1.7.0 - scikit-learn>=1.0.0 - mne>=1.0.0 - pyriemann>=0.5.0 - matplotlib>=3.5.0 - pandas>=1.3.0 triggers: - FC-guided band selection - functional connectivity BCI - MI-BCI spectral selection - wPLI PLV band selection - filter bank CSP band selection - phase connectivity motor imagery - subject-specific frequency bands - hemispheric coupling BCI keywords: - brain-computer interface - motor imagery - functional connectivity - common spatial pattern - filter bank CSP - wPLI - PLV - PLI - band selection - phase locking - sensorimotor rhythms - spectral selection - BCI Competition IV-2a - OpenBMI
FC-Guided Band Selection for Motor Imagery BCI
Overview
This skill implements Functional Connectivity (FC)-guided spectral band selection for Motor Imagery Brain-Computer Interfaces (MI-BCIs), based on the methodology described in "Functional Connectivity-Guided Band Selection for Motor Imagery Brain-Computer Interfaces" (arXiv: 2605.00746, Araújo do Carmo & Nagarajan, 2026).
The core insight: rather than using predefined frequency sub-bands in Filter Bank CSP (FBCSP), this method identifies the most discriminative spectral bands by calculating phase-based functional connectivity across sensorimotor channels, ranking bands by the effect size of their hemispheric coupling differences, and pruning to the top-K bands for feature extraction and classification.
Problem Statement
CSP Performance Dependency on Spectral Range
The Common Spatial Pattern (CSP) algorithm is the cornerstone of MI-BCI decoding, but its performance depends critically on the spectral range of the input EEG data:
- Individual variability: User-specific neural rhythms (μ and β bands) vary significantly across individuals in both center frequency and bandwidth
- Heuristic limitations: Standard FBCSP uses predefined, evenly-spaced frequency sub-bands (e.g., 4-8, 8-12, 12-16 Hz) that are not selected using subject-specific physiological criteria
- Dimensionality waste: Using all bands in a filter bank increases computational cost and may include non-discriminative frequency ranges, introducing noise and overfitting
- Volume conduction artifacts: Traditional coherence measures are contaminated by zero-lag volume conduction, obscuring true neural connectivity
Key Questions Addressed
- Which frequency bands carry the most discriminative information for a given subject?
- What is the minimum number of bands (K*) required to maintain performance within a 2% equivalence zone of the full filter bank baseline?
- Which phase-based connectivity metric (wPLI, PLV, or PLI) provides the best trade-off between dimensionality reduction and inter-session robustness?
Methodology
1. Filter Bank Design
The EEG signal is decomposed into a filter bank of 9 contiguous sub-bands spanning 4–40 Hz:
| Band Index | Frequency Range (Hz) | Physiological Interpretation |
|---|---|---|
| 1 | 4–8 | Theta |
| 2 | 8–12 | μ (mu) — sensorimotor rhythm |
| 3 | 12–16 | Low β (beta) |
| 4 | 16–20 | Low-mid β |
| 5 | 20–24 | Mid β |
| 6 | 24–28 | Mid-high β |
| 7 | 28–32 | High β |
| 8 | 32–36 | High β / low γ |
| 9 | 36–40 | Low γ |
Each band is extracted using a zero-phase bandpass filter (e.g., 4th-order Butterworth, forward-backward via scipy.signal.filtfilt) to avoid phase distortion.
2. Phase-Based Connectivity Metrics
Three complementary phase-based connectivity metrics are computed for each band:
Weighted Phase Lag Index (wPLI)
Measures the asymmetry of the imaginary component of the cross-spectrum, weighted by magnitude:
wPLI = |E[|Im{X}| · sgn(Im{X})]| / E[|Im{X}|]
- Advantage: Robust to volume conduction and common source artifacts
- Interpretation: Non-zero wPLI indicates consistent, non-zero-lag phase coupling
- Best use case: Inter-session robustness; when data spans multiple recording sessions with varying electrode impedances
Phase Locking Value (PLV)
Measures the consistency of phase differences across trials:
PLV = |(1/N) Σ exp(j · Δφ(t))|
- Range: 0 (random phase) to 1 (perfect phase locking)
- Advantage: Sensitive to both zero-lag and non-zero-lag coupling
- Best use case: Aggressive dimensionality reduction; prioritizes μ and low-β ranges
Phase Lag Index (PLI)
Measures the asymmetry of the phase difference distribution:
PLI = |E[sgn(Im{X})]|
- Advantage: Insensitive to volume conduction (ignores zero-lag coupling)
- Disadvantage: Discontinuous; discards amplitude information
- Best use case: Quick screening; binary assessment of consistent lagged coupling
3. Sensorimotor Channel Selection
Functional connectivity is computed across four key sensorimotor channels:
- Left hemisphere: C3, CP3 (or equivalent positions in the 10-20 system)
- Right hemisphere: C4, CP4 (or equivalent positions)
These channels are selected because:
- Motor imagery of left/right limbs produces contralateral ERD/ERS patterns
- The four channels capture hemispheric asymmetry central to MI classification
- Minimal channel count reduces computational overhead and overfitting risk
4. Hemispheric Coupling Difference Ranking
For each frequency band and connectivity metric:
Compute intra-hemispheric connectivity:
- Left: connectivity(C3, CP3)
- Right: connectivity(C4, CP4)
Compute inter-hemispheric connectivity:
- Cross: connectivity(C3, C4), connectivity(CP3, CP4)
Calculate hemispheric coupling difference (HCD):
HCD_band = |left_connectivity - right_connectivity|Rank bands by the effect size (Cohen's d) of the HCD between MI classes (e.g., left hand vs. right hand imagery):
d = (mean_HCD_class1 - mean_HCD_class2) / pooled_stdSelect top-K bands with the largest effect sizes for downstream CSP feature extraction.
5. Top-K Band Pruning Strategy
The method evaluates K values from 1 to 8 (out of 9 total bands):
- K=1: Maximum compression; single most discriminative band
- K=2–4: Moderate compression; balance of performance and efficiency
- K=5–8: Minimal compression; near-complete filter bank
The optimal K* is defined as the minimum K where classification accuracy remains within a 2% equivalence zone of the full 9-band FBCSP baseline:
K* = min{K : accuracy(K) ≥ accuracy(9-band) - 0.02}
This ensures that band selection achieves meaningful dimensionality reduction without clinically significant performance degradation.
Implementation Pipeline
End-to-End Workflow
┌─────────────────────────────────────────────────────────────────────┐
│ FC-GUIDED BAND SELECTION PIPELINE │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. EEG Preprocessing │
│ ├── Bandpass filter (0.5–100 Hz) + notch filter (50/60 Hz) │
│ ├── Artifact rejection / ICA cleaning │
│ └── Epoch extraction (cue onset to offset) │
│ │
│ 2. Filter Bank Decomposition │
│ ├── Apply 9 bandpass filters (4–40 Hz, 4 Hz width) │
│ └── Extract 9 band-limited signal sets │
│ │
│ 3. Phase Estimation │
│ ├── Hilbert transform per band per channel │
│ └── Extract instantaneous phase angles │
│ │
│ 4. Connectivity Computation │
│ ├── wPLI / PLV / PLI for each band │
│ ├── Compute across 4 sensorimotor channel pairs │
│ └── Store connectivity matrices per band │
│ │
│ 5. Band Ranking │
│ ├── Calculate HCD per band per MI class │
│ ├── Compute Cohen's d effect sizes │
│ └── Rank bands by discriminative power │
│ │
│ 6. Top-K Selection │
│ ├── Select top-K bands for K = 1..8 │
│ └── Identify K* (minimum K within 2% equivalence zone) │
│ │
│ 7. FBCSP Feature Extraction │
│ ├── Run CSP on selected bands only │
│ └── Extract log-variance CSP features │
│ │
│ 8. Classification │
│ ├── Support Vector Machine / SVR classifier │
│ ├── Cross-validation (subject-dependent or subject-independent) │
│ └── Report accuracy, F1, Cohen's kappa │
│ │
└─────────────────────────────────────────────────────────────────────┘
Core Python Implementation
import numpy as np
from scipy.signal import butter, filtfilt, hilbert
from scipy.stats import ttest_ind
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import cohen_kappa_score
import mne
from mne.decoding import CSP
class FCGuidedBandSelector:
"""
Functional Connectivity-guided band selection for MI-BCI.
Parameters
----------
sfreq : float
Sampling frequency in Hz.
band_edges : list of tuple
List of (low, high) frequency pairs for the filter bank.
Default: 9 bands from 4-40 Hz (4 Hz width each).
metric : str
Connectivity metric: 'wpli', 'plv', or 'pli'.
"""
def __init__(self, sfreq=250, band_edges=None, metric='wpli'):
self.sfreq = sfreq
self.metric = metric.lower()
self.band_edges = band_edges or [
(4, 8), (8, 12), (12, 16), (16, 20),
(20, 24), (24, 28), (28, 32), (32, 36), (36, 40)
]
self.band_rankings_ = None
self.selected_bands_ = None
def _bandpass_filter(self, data, low, high):
"""Zero-phase bandpass filter using Butterworth design."""
nyq = self.sfreq / 2.0
low_norm = low / nyq
high_norm = high / nyq
b, a = butter(4, [low_norm, high_norm], btype='band')
return filtfilt(b, a, data, axis=-1)
def _compute_phase(self, signal):
"""Extract instantaneous phase via Hilbert transform."""
analytic = hilbert(signal, axis=-1)
return np.angle(analytic)
def _compute_wpli(self, phase1, phase2):
"""
Compute Weighted Phase Lag Index.
Parameters
----------
phase1, phase2 : array-like
Instantaneous phase time series for two channels.
Shape: (n_trials, n_timepoints)
"""
# Compute cross-spectrum phase difference
phase_diff = phase1 - phase2
# Imaginary component of cross-spectrum
im_cross = np.sin(phase_diff)
# wPLI formula
numerator = np.abs(np.mean(np.abs(im_cross) * np.sign(im_cross), axis=-1))
denominator = np.mean(np.abs(im_cross), axis=-1)
wpli = np.where(denominator > 0, numerator / denominator, 0)
return np.mean(wpli, axis=0) # Average across trials
def _compute_plv(self, phase1, phase2):
"""
Compute Phase Locking Value.
Parameters
----------
phase1, phase2 : array-like
Instantaneous phase time series for two channels.
"""
phase_diff = phase1 - phase2
complex_plv = np.mean(np.exp(1j * phase_diff), axis=-1)
return np.abs(complex_plv)
def _compute_pli(self, phase1, phase2):
"""
Compute Phase Lag Index.
Parameters
----------
phase1, phase2 : array-like
Instantaneous phase time series for two channels.
"""
phase_diff = phase1 - phase2
im_cross = np.sin(phase_diff)
pli = np.abs(np.mean(np.sign(im_cross), axis=-1))
return pli
def compute_connectivity(self, band_signals, channel_pairs):
"""
Compute phase-based connectivity for all bands and channel pairs.
Parameters
----------
band_signals : list of ndarray
Band-limited signals for each band.
Each element: shape (n_trials, n_channels, n_timepoints)
channel_pairs : list of tuple
Pairs of channel indices for connectivity computation.
e.g., [(0, 1), (2, 3), (0, 2), (1, 3)] for
[left_intra, right_intra, cross1, cross2]
Returns
-------
connectivity : ndarray
Shape: (n_bands, n_channel_pairs)
"""
n_bands = len(band_signals)
connectivity = np.zeros((n_bands, len(channel_pairs)))
for b_idx, signals in enumerate(band_signals):
phases = self._compute_phase(signals)
for p_idx, (ch1, ch2) in enumerate(channel_pairs):
if self.metric == 'wpli':
connectivity[b_idx, p_idx] = self._compute_wpli(
phases[:, ch1, :], phases[:, ch2, :])
elif self.metric == 'plv':
connectivity[b_idx, p_idx] = self._compute_plv(
phases[:, ch1, :], phases[:, ch2, :])
elif self.metric == 'pli':
connectivity[b_idx, p_idx] = self._compute_pli(
phases[:, ch1, :], phases[:, ch2, :])
return connectivity
def rank_bands(self, connectivity_class1, connectivity_class2,
n_intra_pairs=2, n_cross_pairs=2):
"""
Rank bands by hemispheric coupling difference effect size.
Parameters
----------
connectivity_class1, connectivity_class2 : ndarray
Connectivity matrices for each MI class.
Shape: (n_bands, n_channel_pairs)
n_intra_pairs : int
Number of intra-hemispheric channel pairs (left + right).
n_cross_pairs : int
Number of inter-hemispheric channel pairs.
Returns
-------
ranked_indices : ndarray
Band indices sorted by descending Cohen's d.
effect_sizes : ndarray
Cohen's d values for each band.
"""
n_bands = connectivity_class1.shape[0]
effect_sizes = np.zeros(n_bands)
for b_idx in range(n_bands):
# Intra-hemispheric coupling (first n_intra_pairs columns)
intra1 = np.mean(connectivity_class1[b_idx, :n_intra_pairs])
intra2 = np.mean(connectivity_class2[b_idx, :n_intra_pairs])
# Hemispheric coupling difference
hcd1 = np.abs(intra1)
hcd2 = np.abs(intra2)
# Cohen's d effect size
pooled_std = np.sqrt(
(np.var(intra1) + np.var(intra2)) / 2.0)
if pooled_std > 0:
effect_sizes[b_idx] = np.abs(hcd1 - hcd2) / pooled_std
else:
effect_sizes[b_idx] = 0
ranked_indices = np.argsort(effect_sizes)[::-1]
return ranked_indices, effect_sizes
def select_top_k(self, ranked_indices, k):
"""Select top-K band indices."""
return ranked_indices[:k]
def find_optimal_k(self, ranked_indices, accuracies_k, baseline_accuracy,
tolerance=0.02):
"""
Find optimal K* within the 2% equivalence zone.
Parameters
----------
ranked_indices : ndarray
Band indices sorted by descending effect size.
accuracies_k : dict
Mapping of K value to classification accuracy.
baseline_accuracy : float
Accuracy of the full 9-band FBCSP pipeline.
tolerance : float
Equivalence zone tolerance (default: 0.02 = 2%).
Returns
-------
k_star : int
Minimum K maintaining accuracy within tolerance of baseline.
"""
for k in range(1, len(ranked_indices) + 1):
if k in accuracies_k:
if accuracies_k[k] >= baseline_accuracy - tolerance:
return k
return len(ranked_indices) # Fallback: use all bands
FBCSP Integration
class FBCSPWithFCSelection:
"""
Filter Bank CSP with FC-guided band selection.
Integrates the FC-guided band selector with the standard FBCSP
classification pipeline.
"""
def __init__(self, sfreq=250, metric='wpli', n_csp_components=4):
self.sfreq = sfreq
self.selector = FCGuidedBandSelector(sfreq=sfreq, metric=metric)
self.n_csp_components = n_csp_components
self.csp = CSP(n_components=n_csp_components, reg=None)
self.clf = SVC(kernel='linear', C=1.0)
def fit(self, X, y, k=None):
"""
Fit the pipeline with FC-guided band selection.
Parameters
----------
X : ndarray
EEG data, shape (n_trials, n_channels, n_timepoints)
y : ndarray
Class labels
k : int, optional
Number of top bands to select. If None, uses all bands.
"""
# Step 1: Filter bank decomposition
band_signals = []
for low, high in self.selector.band_edges:
band_data = self.selector._bandpass_filter(X, low, high)
band_signals.append(band_data)
# Step 2: Compute connectivity and rank bands
# (Assumes two-class MI: left hand vs right hand)
class1_mask = y == y[0] # Adjust based on actual labels
class2_mask = ~class1_mask
# Define sensorimotor channel pairs (indices for C3, CP3, C4, CP4)
channel_pairs = [(0, 1), (2, 3), (0, 2), (1, 3)]
conn_class1 = self.selector.compute_connectivity(
[bs[class1_mask] for bs in band_signals], channel_pairs)
conn_class2 = self.selector.compute_connectivity(
[bs[class2_mask] for bs in band_signals], channel_pairs)
ranked_indices, effect_sizes = self.selector.rank_bands(
conn_class1, conn_class2)
self.selector.band_rankings_ = ranked_indices
self.selector.effect_sizes_ = effect_sizes
# Step 3: Select top-K bands
k = k or len(band_signals)
selected = self.selector.select_top_k(ranked_indices, k)
self.selector.selected_bands_ = selected
# Step 4: FBCSP on selected bands
csp_features = []
for b_idx in selected:
band_data = band_signals[b_idx]
csp_feat = self.csp.fit_transform(band_data, y)
csp_features.append(csp_feat)
X_csp = np.hstack(csp_features)
# Step 5: Classification
self.clf.fit(X_csp, y)
return self
def predict(self, X):
"""Predict class labels for new data."""
band_signals = []
for low, high in self.selector.band_edges:
band_data = self.selector._bandpass_filter(X, low, high)
band_signals.append(band_data)
selected = self.selector.selected_bands_
csp_features = []
for b_idx in selected:
band_data = band_signals[b_idx]
csp_feat = self.csp.transform(band_data)
csp_features.append(csp_feat)
X_csp = np.hstack(csp_features)
return self.clf.predict(X_csp)
Performance Benchmarks
BCI Competition IV-2a Dataset
- Subjects: 9 (A01–A09)
- Classes: 4-class motor imagery (left hand, right hand, foot, tongue)
- Channels: 22 EEG electrodes
- Sampling rate: 250 Hz
- Trials: 288 per subject (72 per class), 2 sessions
Key results:
- FC-guided selection consistently outperforms random band ablation
- PLV achieves the most aggressive dimensionality reduction (lower K*)
- wPLI shows superior inter-session robustness (Session 1 → Session 2 transfer)
- Typical K* range: 3–6 bands depending on subject and metric
OpenBMI Dataset
- Subjects: 54
- Classes: 2-class motor imagery (left hand, right hand)
- Channels: 62 EEG electrodes
- Sampling rate: 1,000 Hz
- Sessions: 2 sessions per subject
Key results:
- Larger subject pool confirms generalizability of FC-guided approach
- Dimensionality reduction savings: 22.2% to 77.8% fewer CSP fits
- Inter-subject variability in K* highlights the value of subject-specific selection
Ablation: Random vs. FC-Guided Selection
| Metric | Full 9-band FBCSP | FC-Guided (K*) | Random (K*) |
|---|---|---|---|
| Accuracy | Baseline | ≥ baseline - 2% | Variable |
| CSP fits reduced | 0% | 22–78% | 22–78% |
| Session transfer | Baseline | Superior (wPLI) | Degraded |
| Interpretability | Low | High | None |
PLV vs. wPLI Trade-offs
PLV (Phase Locking Value)
Strengths:
- Most aggressive dimensionality reduction (lowest K*)
- Strongly prioritizes μ (8–12 Hz) and low-β (12–20 Hz) ranges
- Highest sensitivity to phase-locked oscillatory activity
- Best for single-session, within-subject decoding
Weaknesses:
- Susceptible to volume conduction artifacts
- Zero-lag coupling from common sources inflates connectivity estimates
- Lower inter-session robustness (Session 1 → Session 2 performance drops more)
wPLI (Weighted Phase Lag Index)
Strengths:
- Superior inter-session robustness
- Mitigates volume conduction by weighting non-zero-lag components
- More stable across recording sessions with varying electrode setups
- Better generalization to unseen data
Weaknesses:
- May require more bands (higher K*) to reach equivalence zone
- Computationally slightly more expensive than PLV
- May miss genuine zero-lag functional connectivity
Practical Recommendation
| Use Case | Recommended Metric |
|---|---|
| Maximum compression, single-session | PLV |
| Cross-session / longitudinal studies | wPLI |
| Quick screening / resource-constrained | PLI |
| Clinical / real-world BCI deployment | wPLI |
| Research / maximum accuracy | Compare all three |
Usage Examples
Basic Usage
from your_module import FCGuidedBandSelector, FBCSPWithFCSelection
# Initialize with PLV for aggressive dimensionality reduction
pipeline = FBCSPWithFCSelection(sfreq=250, metric='plv', n_csp_components=4)
# Fit on training data (shape: n_trials x n_channels x n_timepoints)
pipeline.fit(X_train, y_train, k=4) # Select top 4 bands
# Predict
predictions = pipeline.predict(X_test)
# Access selected bands
print(f"Selected bands: {pipeline.selector.selected_bands_}")
print(f"Band rankings: {pipeline.selector.band_rankings_}")
Finding Optimal K*
# Evaluate all K values
selector = FCGuidedBandSelector(sfreq=250, metric='wpli')
# ... (compute connectivity and rank bands as above) ...
# Get accuracies for each K (requires cross-validation loop)
accuracies_k = {}
for k in range(1, 9):
acc = cross_validate_with_k(X, y, k, ranked_indices)
accuracies_k[k] = acc
# Find optimal K*
baseline_acc = cross_validate_with_k(X, y, 9, ranked_indices)
k_star = selector.find_optimal_k(ranked_indices, accuracies_k, baseline_acc)
print(f"Optimal K*: {k_star} (baseline accuracy: {baseline_acc:.3f})")
Working with MNE-Python Datasets
import mne
from mne.datasets import eegbci
# Load BCI Competition IV-2a data (via MNE)
# Note: Use the official dataset download for Competition IV-2a
raw = mne.io.read_raw_edf('A01T.edf', preload=True)
raw.filter(0.5, 100)
raw.notch_filter([50])
# Extract epochs
events = mne.find_events(raw, stim_channel='STI 014')
epochs = mne.Epochs(raw, events, event_id={
'left_hand': 1, 'right_hand': 2,
'foot': 3, 'tongue': 4
}, tmin=0, tmax=4, baseline=None, preload=True)
# Pick sensorimotor channels
epochs.pick_channels(['C3', 'CP3', 'C4', 'CP4'])
# Convert to numpy array
X = epochs.get_data()
y = epochs.events[:, 2]
# Run FC-guided band selection
pipeline = FBCSPWithFCSelection(sfreq=250, metric='wpli')
pipeline.fit(X, y, k=4)
Configuration Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
sfreq |
float | 250 | EEG sampling frequency (Hz) |
metric |
str | 'wpli' | Connectivity metric: 'wpli', 'plv', 'pli' |
band_edges |
list | 9 bands 4–40 Hz | Custom filter bank definitions |
n_csp_components |
int | 4 | Number of CSP spatial filters per band |
k |
int | None (use all) | Number of top bands to select |
equivalence_tolerance |
float | 0.02 | 2% accuracy tolerance for K* selection |
channel_pairs |
list | 4 pairs | Sensorimotor channel indices for FC |
Limitations and Considerations
Static vs. Adaptive: This method uses static band selection (computed once per subject). For adaptive BCIs, consider re-ranking bands online as neural patterns shift.
Channel Selection: The 4-channel sensorimotor selection is optimal for hand MI. Foot and tongue imagery may require additional channel pairs (e.g., Cz, FCz).
Filter Design: The 4 Hz band width is a design choice. Narrower bands increase frequency resolution but may reduce signal-to-noise ratio.
Effect Size Sensitivity: Cohen's d assumes approximately normal distributions. For small trial counts, consider permutation-based effect size estimation.
Multi-class Extension: The current methodology is demonstrated on 2-class MI. For 4-class (Competition IV-2a), apply the ranking per class pair and aggregate via voting or mean effect size.
Computational Cost: Connectivity computation scales as O(n_bands × n_channel_pairs × n_trials × n_timepoints). For large datasets, consider subsampling trials or using parallel computation.
Related Skills
eeg-brain-connectivity-bci: General EEG-based brain connectivity analysis for BCI applicationsfc-guided-band-selection-mi-bci: Variant focusing on motor imagery-specific implementationshermes-brain-connectivity: Comprehensive brain connectivity toolkit with multiple modalities
References
Araújo do Carmo, N., & Nagarajan, A. (2026). Functional Connectivity-Guided Band Selection for Motor Imagery Brain-Computer Interfaces. arXiv:2605.00746 [q-bio.NC, eess.SP].
Blankertz, B., et al. (2008). Optimizing spatial filters for robust EEG single-trial analysis. IEEE Signal Processing Magazine, 25(1), 41-56.
Vinck, M., et al. (2011). An improved index of phase-synchronization for electrophysiological data in the presence of volume-conduction, noise and sample-size bias. NeuroImage, 55(4), 1548-1565.
Lachaux, J.-P., et al. (1999). Measuring phase synchrony in brain signals. Human Brain Mapping, 8(4), 194-208.
Stam, C. J., et al. (2007). Phase lag index: Assessment of functional connectivity from multi channel EEG and MEG with diminished bias from common sources. Human Brain Mapping, 28(11), 1178-1193.
Ang, K. K., et al. (2008). Filter bank common spatial pattern (FBCSP) in brain-computer interface. IJCNN, 2390-2397.