步骤 08:带通滤波
0.1–40 Hz 带通滤波,去除低频与高频噪声
1. 目标
在频域上保留感兴趣的信号(如 0.1–40 Hz)、剔除噪声与漂移。带通是几乎所有 ERP 研究的必备步骤,会显著影响后续 ICA、阈值拒绝、autoreject 的有效性。
2. 何时使用 / 何时跳过
- 必须使用:几乎所有 EEG/ERP 实验
- 可跳过:仅在分析超高频(如 gamma 100+ Hz)或纯直流(DC)信号时
- 高通特殊:若计划做 ICA,建议高通 ≥ 1 Hz,避免 ICA 拆出超低频漂移成分
3. 前置条件
- 已执行步骤 07:原始坏导已标记
4. 核心代码
Python
import mne
# ====== 方式 A:标准 ERP 带通 ======
raw.filter(
l_freq=0.1, # 高通:剔除超低频漂移、DC offset
h_freq=40.0, # 低通:剔除肌电、高频干扰
picks=['eeg', 'eog', 'ecg'],
method='fir', # 推荐 FIR,无相位偏移
phase='zero', # 零相位(双向滤波)
fir_design='firwin',
skip_by_annotation='edge',
)
# ====== 方式 B:低通 + 高通分别设置 ======
# 低通(消除 50 Hz 工频的更高次谐波也用此)
raw.filter(l_freq=None, h_freq=40.0, picks=['eeg'])
# 高通(保留低频 ERP 成分如 P300、CNV)
raw.filter(l_freq=0.1, h_freq=None, picks=['eeg'])
# ====== 方式 C:保留低频 ERP 研究 ======
# 用于 N400、MMN、P600 等需要保留慢成分的研究
raw.filter(l_freq=0.01, h_freq=30.0, picks=['eeg'])
# ====== 方式 D:儿童 / 高噪声数据 ======
raw.filter(l_freq=0.3, h_freq=30.0, picks=['eeg'])
# ====== 方式 E:ICA 前的特定滤波 ======
# ICA fit 建议:l_freq=1.0, h_freq=None(保留更多 ICA 信息)
# 但必须在拟合 ICA 前临时应用,后续按需重置
# raw_for_ica = raw.copy().filter(l_freq=1.0, h_freq=None)
5. 参数详解
| 参数 | 含义 | 推荐值 |
|---|---|---|
l_freq |
高通(Hz) | 0.1(一般)/ 1.0(ICA 前)/ 0.01(保留慢成分) |
h_freq |
低通(Hz) | 40(标准)/ 30(儿童)/ 100(高频分析) |
method |
滤波算法 | 'fir'(推荐);'iir'(更快但有相位风险) |
phase |
相位特性 | 'zero'(零相位)/ 'zero-double'(双向) |
fir_design |
FIR 设计方法 | 'firwin'(默认,窗函数法) |
skip_by_annotation |
跳过带 annotation 的数据 | 'edge'(推荐) |
n_jobs |
并行核数 | 1(一般);-1(全核) |
6. 验证方法
Python
# 验证 1:检查滤波后频谱
raw.compute_psd(fmax=80).plot(average=True)
# 期望:低于 0.1 Hz 与高于 40 Hz 衰减明显
# 验证 2:检查 info 中的高低通
print(f"滤波后: highpass={raw.info['highpass']}, lowpass={raw.info['lowpass']}")
assert raw.info['highpass'] >= 0.1
assert raw.info['lowpass'] <= 40
# 验证 3:可视化
raw.plot(duration=5, n_channels=30)
# 期望:低频漂移消失、信号更稳定
# 验证 4:时域振幅不应有剧烈变化(过强滤波导致)
data, _ = raw[:5, :5000] # 前 5 导、前 5 秒
peak_to_peak = (data.max() - data.min()) * 1e6
print(f"峰峰振幅: {peak_to_peak:.1f} µV")
# 期望:100~500 µV(正常)
7. 常见错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
l_freq=0 引入了 DC 漂移 |
0 Hz 等价于未滤波 | 用 l_freq=0.1 或更高 |
h_freq=50 与 notch 冲突 |
notch 也消除 50 Hz | 把 h_freq 设为 ≤ notch 频率 - 2 |
| 滤波后 ERP 振幅明显变小 | 滤波过窄丢失了核心频段 | 调宽 h_freq 至 30–40 Hz |
| 滤波后出现边缘伪迹 | FIR padding 不足 | 提高 l_trans_bandwidth 与 h_trans_bandwidth(默认自动) |
| 用 IIR 后 ERP 时序错位 | IIR 默认非零相位 | 改 method='fir' 或加 phase='zero' |
8. 官方来源
| 资源类型 | 链接 |
|---|---|
raw.filter |
https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.filter |
| 滤波教程 | https://mne.tools/stable/auto_tutorials/preprocessing/30_filtering_resampling.html |
| FIR vs IIR 对比 | https://mne.tools/stable/auto_tutorials/preprocessing/30_filtering_resampling.html |
| notch_filter(步骤 09) | https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.notch_filter |
9. 学术引用
Widmann, A., & Schröger, E. (2012). Filter effects and filter artifacts in the analysis of electrophysiological data. Frontiers in Psychology, 3, 233.
Luck, S. J. (2014). An Introduction to the Event-Related Potential Technique (2nd ed.), Chapter 4. MIT Press.