第 3 层 · 通道清理层 · 第 9 步 / 共 25 步

步骤 09:工频陷波

50/60 Hz 工频陷波,去除电力线干扰

🕐 12 分钟🎯 难度:进阶🔗 核心 API:raw.notch_filter⬅️ 前置:步骤 8

1. 目标

消除电力线干扰(50 Hz 中国/欧洲;60 Hz 北美)及其低次谐波(100/150 Hz 或 120/180 Hz)。不替代带通——它是带通的"补丁"。

2. 何时使用 / 何时跳过

  • 应当使用:所有室内采集的 EEG 数据(中国必加 50 Hz + 100 Hz + 150 Hz)
  • 可跳过:电池供电 + 已屏蔽良好的设备 + 在电源滤波良好的实验环境

3. 前置条件

  • 已执行步骤 08:带通滤波已完成

4. 核心代码

Python
import mne

# ====== 方式 A:单频率陷波(中国 50 Hz) ======
raw.notch_filter(
    freqs=50.0,
    picks=['eeg', 'eog', 'ecg'],
    method='fir',
    phase='zero',
)

# ====== 方式 B:基础频率 + 谐波(中国) ======
raw.notch_filter(
    freqs=[50, 100, 150],
    picks=['eeg', 'eog', 'ecg'],
    method='fir',
)

# ====== 方式 C:北美 ======
raw.notch_filter(freqs=[60, 120, 180])

# ====== 方式 D:使用窄带 IIR 陷波(更锐利) ======
raw.notch_filter(
    freqs=50,
    method='iir',
    iir_params=dict(order=4, ftype='butter'),
)

# ====== 方式 E:自动化检测(慎用) ======
# MNE 无自动检测接口,推荐手动设值

5. 参数详解

raw.notch_filter(freqs, picks=None, ..., notch_widths=None, method='fir', iir_params=None, mt_bandwidth=None, p_value=0.05, phase='zero', ...)

参数 含义 推荐值
freqs 要陷波的频率(Hz) 中国 [50] 或 [50, 100, 150];北美 [60] 或 [60, 120, 180]
method 滤波算法 'fir'(默认);'iir';'spectrum_fit'(现代推荐)
phase 相位特性 'zero'(默认,零相位)
picks 参与滤波的通道 ['eeg', 'eog', 'ecg'](务必包含 EOG/ECG!)
notch_widths 陷波宽度 FIR / spectrum_fit 法的参数(method='iir' 时由 iir_params 控制带宽)
iir_params IIR 算法参数 仅 method='iir' 时使用

⚠️ notch_widths 是 FIR 和 spectrum_fit 法的参数;IIR 法的带宽控制由 iir_params 决定(如 dict(order=4, ftype='butter'))。本教材原稿描述反向,已修正。

⚠️ 务必对 EOG/ECG 也施加 notch:它们的工频成分如果不消,会通过步骤 13 的平均参考回流到 EEG。

6. 验证方法

Python
# 验证 1:PSD 检查(50 Hz 处应明显塌陷)
psd = raw.compute_psd(fmax=200, picks='eeg')
freqs = psd.freqs
idx_50 = np.argmin(np.abs(freqs - 50))
idx_49 = np.argmin(np.abs(freqs - 49))
idx_51 = np.argmin(np.abs(freqs - 51))
psd_data = psd.get_data()
print(f"50 Hz 功率 (idx={idx_50}): {psd_data[:, idx_50].mean():.2e}")
print(f"49 Hz 功率 (idx={idx_49}): {psd_data[:, idx_49].mean():.2e}")
# 期望:50 Hz 功率 << 49 Hz 功率(差 1-3 个数量级)

# 验证 2:可视化
psd.plot()
# 期望:50 Hz 处有明显的"V"形凹槽

# 验证 3:时域
raw.plot(duration=2, scalings=dict(eeg=20e-6))
# 期望:50 Hz 周期性"嘶嘶"声消失

7. 常见错误

错误 原因 解决方案
没对 EOG/ECG 滤波 只对 EEG 滤波 → 50 Hz 通过平均参考回流 显式加 picks=['eeg', 'eog', 'ecg']
滤波后信号出现 ringing IIR 阶数过高 改用 method='fir',或降阶
误除目标 ERP 成分 陷波频率刚好等于 ERP 主频(罕见) 检查 ERP 关键成分频谱,确认无重叠
谐波没去干净 只陷波 50 Hz,但 100 Hz 仍存在 加 [50, 100, 150]
设备已用硬件陷波,再次 notch 引入伪迹 重复滤波 检查设备文档,跳过本步骤

8. 官方来源

资源类型 链接
raw.notch_filter https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.notch_filter
滤波教程 https://mne.tools/stable/auto_tutorials/preprocessing/30_filtering_resampling.html

9. 学术引用

American Clinical Neurophysiology Society. (2008). Guideline 1: Minimum technical standards for EEG recording. Journal of Clinical Neurophysiology, 25(2), 71-82.