一、为什么要滤波:在频率轴上划出“留”和“去”
滤波就是按频率取舍:第 4 节的功率谱已经把脑电拆成了不同频率的成分。滤波就是在这条频率轴上划线,留下关心的频段,压低不关心的频段。它只改变各频率成分的强弱,不改变数据的形状:滤波后仍是 (64, 20000) 的矩阵,通道数和采样点数都不变。
这份数据要去掉两样东西:一是 1 Hz 以下的慢漂移,来自出汗、电极极化和身体移动,在功率谱最左端翘得最高;二是 60 Hz 的工频尖峰,比两侧高出约 10 dB。EEGMMIDB 在美国采集,工频是 60 Hz;国内采集的数据是 50 Hz。文件里没有记录工频(info 中 line_freq 为空),MNE 不会自己知道,要由人在提示词里写明。
采样率决定能分析的上限:160 Hz 采样,最多只能分析到它的一半,即 80 Hz(奈奎斯特频率)。所以 60 Hz 的二次谐波 120 Hz 在这份数据里根本不存在,只需要陷 60 Hz 一个频点。

两把“剪刀”:陷波(Notch)只挖掉 60 Hz 附近一个窄频带,其余频率原样保留;带通(Band-pass)只留 1–40 Hz,把两头一起切掉,40 Hz 以上的 60 Hz 自然也被压住。
截止频率怎么定:高通方面,ERP 研究常用 0.1 Hz,保留慢电位;ICA 和机器学习常用 1 Hz,漂移去得更干净,ICA 分解也更稳定。本课后面要做 ICA(第 8 节)和分类(第 14 节起),选 1 Hz。低通方面,运动任务关心的 μ(8–13 Hz)和 β(13–30 Hz)节律都在 40 Hz 以内,选 40 Hz。截止频率是研究设计的一部分,要写进论文方法,不能交给 AI 的默认值。
二、一段提示词:写陷波与带通滤波脚本
打开脑电项目的根目录,新开一个 AI 对话。将以下提示词整段复制发给 AI,让它写滤波、对比出图和留档脚本。
提示词:
在 code 文件夹里写一个脚本 04_filter.py:
1. 读取 data 文件夹中第 4 节保存的 1 号被试握拳任务连续数据 S001R03_raw.fif(用连续数据,不要用第 5 节切好的 S001R03_epo.fif);
2. 本数据在美国采集,工频为 60 Hz:把 raw.info[“line_freq”] 设为 60,并在终端打印采样率、奈奎斯特频率,以及文件里原有的高通、低通记录;
3. 在连续数据上做三种滤波,各存一份副本用于对比:
- A 只陷波:去除 60 Hz 工频(采样率 160 Hz,奈奎斯特频率 80 Hz,不存在 120 Hz 谐波,只陷 60 Hz);
- B 只带通:1–40 Hz 带通;
- C 陷波 + 带通:先陷波 60 Hz,再 1–40 Hz 带通,作为本节最终输出;
全部使用 MNE 默认的零相位 FIR 滤波器,在终端打印陷波和带通两个滤波器的长度(点数与秒数)和过渡带;
4. 量化与出图(保存至 results 文件夹):
- 画 1–40 Hz 带通滤波器的频率响应和冲激响应(results/04_filter_response.png);
- 用 Welch 法计算功率谱(n_fft=1600,频率分辨率 0.1 Hz),把原始、A、B、C 四个版本的全通道平均功率谱叠加在一张图上,频率范围 0.2–80 Hz,标出 60 Hz(results/04_psd_comparison.png);
- 画 F4、C3、C4 三个导联第 20–30 秒的原始与 C 版本时域波形对比(results/04_waveform_comparison.png);
- 在终端打印每个版本:60 Hz 处比 57 Hz 高出多少 dB、0.3 Hz 和 10 Hz 处功率比原始下降多少 dB;
5. 另存、自检与留档:
- 将 C 版本另存为 data/S001R03_filt_raw.fif;
- 用 mne.io.read_raw_fif 重新读入,打印 info 里的 highpass、lowpass 和 line_freq,确认滤波参数已写进文件;
- 导出 results/04_filter_log.csv,记录被试号、段号、陷波频率、带通上下限、滤波器类型与相位、两个滤波器的长度与过渡带、各版本 60 Hz 尖峰高出量、0.3 Hz 和 10 Hz 功率降幅、输出文件路径。
本节只做滤波,不做重参考、ICA 和切片。参数集中写在脚本开头,代码添加详细中文注释。写完后用项目文件夹内的独立虚拟环境运行,把终端输出和结果给我看。
每条要求的用意:
要求
为什么这样写
读连续数据 S001R03_raw.fif,不读 _epo.fif
滤波器要用到每个点前后各 1.65 秒(陷波 3.3 秒)的数据,必须在完整的连续记录上做,见第三部分
显式设定 line_freq = 60
文件没有记录工频,AI 习惯写 50 Hz;写明可避免出错,60 Hz 也随数据写进文件留档
三种滤波各存一份
分开对比,才能看清陷波和带通各自做了什么,并用数据回答“带通之后还要不要陷波”
MNE 默认零相位 FIR
波形不整体延迟,事件时刻不偏移;默认参数可复现,论文方法写得清楚
打印滤波器长度和过渡带
这两个数决定边缘效应有多宽,也是论文方法要报告的内容
功率谱 n_fft=1600
频率分辨率 0.1 Hz,才看得清 0.3 Hz 和 60 Hz 处的变化;默认值的分辨率只有 0.625 Hz
F4、C3、C4 波形对比
F4 是这份数据工频最强的导联;C3、C4 是后面运动任务分析的核心导联
另存 _filt_raw.fif 并读回
FIF 是二进制文件,读回后看 info 里的 highpass、lowpass,证明滤波参数随数据一起保存
不做重参考、ICA、切片
一步一个脚本,每步单独验收;重参考和重新切片放到第 7 节
① S-1 发出提示词

② S-2a AI 先列出工作步骤

② S-2b AI 编写、运行并自查

看点:AI 写完脚本后,自己把滤波器长度与 MNE 的日志对了一遍,并修了图上重叠的标签。这种自查要让它把结果说出来,人再核对。
三、看懂滤波器的代价
1. 滤波器有长度:FIR 滤波器每算一个输出点,都要把它前后一段数据加权平均。按 MNE 默认参数,1–40 Hz 带通滤波器长 529 点(3.3 秒),60 Hz 陷波滤波器长 1057 点(6.6 秒)。截止频率越低、阻带越窄,滤波器越长:0.1 Hz 高通需要约 33 秒。
2. 边缘效应与“先滤波、后切片”:记录两端没有足够的前后数据,MNE 只能用镜像填充补上,这一段的结果不可靠。在 125 秒的连续记录上滤波,只影响首尾几秒;对 5 秒的试次单独滤波,两端各 1.65 秒都不可靠,基线区间 −1~0 秒整段落在里面。所以要先滤波、后切片。第 5 节切好的 S001R03_epo.fif 没有滤波,第 7 节会用本节的滤波数据重新切片替换它。

3. 零相位与预振铃:零相位滤波器前后对称,不让波形延迟,事件时刻不偏移;代价是会把刺激后的变化“抹”一点到刺激前。做 ERP 时,刺激前出现的小波动可能来自滤波,而不是大脑。
4. 高通不要设太高:高通截止越高,越接近信号本身的慢成分。2 Hz 以上的高通会削平慢电位,让 ERP 波形变形。研究关心慢电位时用 0.1 Hz。
5. 滤波去不掉什么:眨眼、咬牙、电极松动造成的伪迹,频率和脑电重叠,滤波压不掉。这份数据滤波后,各导联峰峰值的中位数只从 482 µV 降到 428 µV,大伪迹仍在,要靠第 8 节的 ICA。
四、验收:看代码,看输出,查留档
看代码:
工频:写的是 60 Hz,不是 50 Hz。
作用对象:滤波作用在连续数据 raw 上,没有先切片。
用 MNE 自带方法:用的是 raw.notch_filter() 和 raw.filter(),没有自己用 scipy 拼滤波器。自己拼容易漏掉零相位,截止频率也不会记进 info。
不超前处理:没有顺手做重参考、ICA 或切片。
提示词之外的改动:AI 可能自作主张加参数,要在它的说明里逐条找出来,判断能不能接受。本次实测它加了一项 n_overlap=800(Welch 相邻窗口重叠一半),让功率谱更平滑,可以接受;但参考数值会因此和不重叠时略有差别,要记进日志。
③ S-3 脚本开头的参数区

看点:LINE_FREQ = 60.0;NOTCH_FREQS 只有 60;L_FREQ = 1.0、H_FREQ = 40.0;PSD_N_FFT = 1600,以及 AI 自己加的 PSD_N_OVERLAP = 800。
④ S-4d AI 列出的输出文件与“提示词之外的选择”

看点:三条额外说明都要看懂:Welch 重叠 50%;原始波形只在画图时去均值,数据本身没改;陷波不会写进 info 的 highpass / lowpass,只记在 CSV 日志里。
看输出:
先看终端,再看图:终端里的数字与参考答案对上,再逐张看图;图上看到的现象要能用数字解释。
⑤ S-4a 两个滤波器的长度与过渡带

看点:陷波 1057 点(6.6 秒),带通 529 点(3.3 秒);文件原有记录 highpass = 0、lowpass = 80,说明此前从未滤过波。
⑥ S-4b 各版本量化结果与读回自检

看点:60 Hz 尖峰:原始高出 10.0 dB,只陷波后 −32.6 dB,只带通后 −0.1 dB;0.3 Hz 降 14.7 dB,10 Hz 只降 0.02 dB。读回文件后 highpass = 1、lowpass = 40、line_freq = 60。
⑦ S-4c AI 对结果的解读

看点:AI 的解读和数字一致:带通已经压住 60 Hz,陷波在这里接近多余;0.3 Hz 落在 0–1 Hz 过渡带里,只是部分去除。
⑧ S-5 带通滤波器的冲激响应与频率响应

看点:冲激响应左右对称,总长 3.3 秒,能量集中在中间;频率响应 1–40 Hz 平坦,−6 dB 点约在 0.5 Hz 和 45 Hz,60 Hz 处已低于 −60 dB。
⑨ S-6 四个版本的功率谱对比

看点:橙线(只陷波)只在 60 Hz 挖出一个深坑,其余与原始重合;蓝线和红虚线(只带通、陷波 + 带通)完全重合,40 Hz 以上降到底,1 Hz 以下向下弯;1–40 Hz 四条线重合,脑电节律没有被改动。
⑩ S-7 F4、C3、C4 时域波形对比

看点:红线(滤波后)几乎贴着灰线(原始)走:1–40 Hz 正是脑电的主体,滤波只去掉了细小的高频毛刺和缓慢的基线起伏。灰线已由 AI 去均值以便同轴对比。F4 上几处约 200 µV 的大波形(多半是眨眼伪迹)滤波后仍在,留给第 8 节 ICA。
滤波参考答案(本课实测,Welch n_fft = 1600、50% 重叠):
项目
原始
A 只陷波
B 只带通
C 陷波 + 带通
60 Hz 比 57 Hz 高出
10.0 dB
−32.6 dB
−0.1 dB
−0.3 dB
0.3 Hz 功率下降
—
0 dB
14.7 dB
14.7 dB
10 Hz 功率下降
—
0 dB
0.02 dB
0.02 dB
info 记录 highpass / lowpass
0 / 80 Hz
0 / 80 Hz
1 / 40 Hz
1 / 40 Hz
滤波器参数(MNE 1.13 默认):带通 529 点(3.31 秒),下过渡带 1 Hz(−6 dB 在 0.5 Hz),上过渡带 10 Hz(−6 dB 在 45 Hz);陷波 1057 点(6.61 秒),阻带 59.35–60.65 Hz(−6 dB 在 59.10 / 60.90 Hz)。
B 版本的“−0.1 dB”:指 60 Hz 已经和两侧一样被压到底,尖峰不复存在,不表示 60 Hz 没被处理。
💡 带通之后,还要不要陷波?
实测结论:只做 1–40 Hz 带通,60 Hz 尖峰已经消失;再加陷波,60 Hz 只多降约 0.2 dB。原因是 40 Hz 低通的过渡带在 50 Hz 结束,60 Hz 已落在阻带里,衰减超过 60 dB。
本课的做法:流水线仍保留陷波。它几乎没有成本;以后若把低通调到 60 Hz 以上(例如研究 γ 节律),陷波就是必需的。论文方法里如实报告这两步即可。
⑪ S-8a FIF 留档:data/S001R03_filt_raw.fif 已落盘

看点:二进制 FIF 文件打不开看,落盘只是第一步;存得对不对,看 S-4b 里读回后打印的 highpass = 1、lowpass = 40、line_freq = 60。
⑫ S-8b 滤波日志 results/04_filter_log.csv

看点:一行 32 列,截图是 B–L 列:工频 60、陷波 60、带通 1 / 40 Hz、FIR、零相位、陷波滤波器 1057 点 / 6.606 秒;后面各列是带通滤波器参数、四个版本的量化结果和输出路径。陷波只记在这份 CSV 里,FIF 的 info 不记录它,所以这份日志要和数据一起留档。
论文方法(Methods)写法参考:“Continuous EEG recordings were filtered in MNE-Python (version 1.13) using zero-phase, non-causal FIR filters (windowed design, Hamming window). Power-line interference was attenuated with a 60 Hz notch filter (filter length 1057 samples, 6.6 s), followed by a 1–40 Hz band-pass filter (transition bandwidths 1 Hz and 10 Hz; −6 dB cutoffs at 0.5 Hz and 45 Hz; filter length 529 samples, 3.3 s). Filtering was applied to the continuous data before epoching to avoid edge artifacts.”
五、本节留下的文件
位置
文件名 / 内容
用途与说明
code/
04_filter.py
本节脚本:设定工频、陷波与带通滤波、对比出图、另存与自检
data/
S001R03_filt_raw.fif
陷波 60 Hz + 1–40 Hz 带通后的连续数据,第 7 节从这里重新切片
results/
04_filter_response.png
带通滤波器的频率响应与冲激响应
results/
04_psd_comparison.png
原始、只陷波、只带通、陷波 + 带通四个版本的功率谱对比
results/
04_waveform_comparison.png
F4、C3、C4 滤波前后时域波形对比
results/
04_filter_log.csv
滤波日志:参数、滤波器长度与过渡带、各版本量化结果、输出路径