信息速览
做伪影去除的人都有一个共同的尴尬:手上永远缺一条“本来应该是干净的”参考信号。滤波、小波、经验模态分解、典型相关分析、自适应回归,每一种方法都能把波形修得顺眼些,可“顺眼”不是指标——把一段干净数据过度平滑,同样能得到一条漂亮曲线。于是这个领域长期依赖仿真:取一段干净脑电,叠上一段人造的运动伪影,再让算法去还原,用还原结果与原始干净段之间的差当分数。仿真给出的分数很精确,代价是它只证明算法在你假定的那个伪影模型下成立。
Motion Artifact Contaminated fNIRS and EEG Data 换了一条路:不造仿真,直接造参考。办法朴素得近乎粗暴——在同一个人额头上贴两只探头,间距几厘米,让它们同时看同一片皮层;实验者每隔两分钟伸手拉一下其中一只的线缆,另一只原地不动。于是同一时刻,一条通道被扰动,另一条充当“本来应该是干净的”那条。两只探头各挂一颗三轴加速度计,把“谁动了、什么时候动、动了多久”另存成一路机械信号。这就是 fNIRS 与 EEG 运动伪差对照库,2014 年 3 月由爱尔兰梅努斯国立大学(NUI Maynooth)的 Kevin Sweeney 与同事交给 PhysioNet,版本 1.0.0,此后十二年没有再改过。
它的价值与它的体量成反比。32 条记录、十名上下的被试、每次不到十分钟、只覆盖额叶两个位置、被试闭眼静坐不做任何任务——当训练集它几乎一无是处;当评测尺,它提供的东西在公开数据里仍属罕见:一条与污染信号同步采集、且确实没被扰动过的对照通道,外加一路独立于生理信号的机械证据。下面先给规模,再拆结构,最后说清楚它在什么情况下会骗人。
一屏速览如下,规模、结构、边界三类数字一次给全,逐项的出处见附录 A。
| 维度 | 内容 |
|---|---|
| 全名 | Motion Artifact Contaminated fNIRS and EEG Data |
| 发布方 | PhysioNet(数据由爱尔兰梅努斯国立大学 Sweeney 等贡献,合作方含德雷塞尔大学) |
| 首次发布 | 2014 年 3 月 3 日,版本 1.0.0 |
| 最近改动 | 仍为 1.0.0;2019 年 2 月 20 日补入 SHA256SUMS.txt 校验清单 |
| 记录数 | 32 条(23 条 EEG + 9 条 fNIRS) |
| 被试数 | fNIRS 10 人、EEG 6 人(论文口径,官方页面未列人群表) |
| 单条时长 | 480 秒或 540 秒(头文件采样点 ÷ 采样率) |
| 通道数 | EEG 记录 10 路,fNIRS 记录 12 路 |
| 采样率 | EEG 记录 2048 Hz,fNIRS 记录 200 Hz(同一记录内全部通道统一) |
| 位数与增益 | 16 位有符号整数;EEG 通道 1000/mV,其余 1000/nd |
| 生理通道 | EEG 2 导(额叶);fNIRS 4 路(2 通道 × 690/830 纳米) |
| 机械通道 | 每条记录 2 颗三轴加速度计,共 6 路 |
| 标注方式 | 触发沿:R 标记上升沿,F 标记下降沿(污染区间起点) |
| 文件格式 | WFDB:.hea / .dat / .trigger;另有两个 CSV 压缩包 |
| 体积 | 解压后 649.9 MB;EEG-csv.zip 145.4 MB,fNIRS-csv.zip 13.9 MB |
| 许可 | Open Data Commons Attribution License v1.0(ODC-By 1.0),可商用需署名 |
| DOI | 10.13026/C2988P(仅 1.0.0 一个版本) |
| 典型用途 | 伪影去除算法的成对评测、加速度计辅助去噪、多模态同步采集教学 |
§1 它要解决的具体麻烦
1.1 伪影去除评测的三层困境
第一层是没有真值。临床上拿到的脑电、近红外信号,本身就是脏的;你知道它脏,却不知道脏在哪些时刻、脏了多少幅度。用一条“看起来很干净”的片段当参考,等于用算法的输出当算法的答案。
第二层是仿真不可信。仿真需要假设伪影的波形形态:阶跃、指数衰减、低频漂移、宽带脉冲。真实运动伪影的形态取决于电极与皮肤的耦合方式、线缆的受力方向、被试的动作习惯,几乎不可能用一个参数族覆盖。用仿真训出来或评出来的方法,换到真人身上经常失效。
第三层是“干净”本身没有定义。即便有一段确实没被扰动的记录,你怎么证明它干净?多数公开数据的做法是请有经验的技师目视挑段,这既不可复现,也无法量化。这个库的回答是把“干净”变成一个物理事实:同一时刻、同一片皮层、另一只没有被碰过的探头。三轴加速度计给出的是这个事实的旁证——被扰动的那只加速度计出现尖峰,另一只保持平稳。
还有第四层,是关于指标本身的。伪影去除常用三类指标:信噪比提升、与参考信号的相关系数、以及下游任务的准确率。信噪比需要知道噪声功率,而这个量在真实记录里根本不可得,于是只能用“伪影段功率除以干净段功率”去凑,凑出来的数字随分段方式变化,跨研究不可比。相关系数只需要两条信号,正好对上这个库的设计:一条当作参考,一条当作待评估,无论算法怎么处理,最后都落回“处理后的信号与参考有多接近”。下游任务准确率在这个库上没法用,因为它没有任务标签。
这三类指标里,只有相关系数能在这个库上干净地算出来。这也是为什么它的引用集中在方法学论文,而不是应用论文:应用论文要的是准确率,方法学论文要的是保真度。
1.2 三条常见的错误期待
期待它是训练集。 32 条记录、十几名被试、单一部位,任何带参数的模型几轮就能记住全部样本。想靠数据量换性能的项目,用它做训练会立刻过拟合;它的正确位置是测试集或评测台。
期待它覆盖真实场景。 被试闭眼静坐,头不动,眼不眨,任务为零。真实可穿戴场景里的伪影来自走路、咀嚼、转头、出汗、电极脱落,这个库一个都没有。它复现的是“电极被线缆拉了一下”这一类最纯粹的机械扰动。
期待它有生理或临床标签。 没有睡眠分期、没有认知任务、没有疾病诊断,也没有被试编号字段。它是一套物理实验记录,不是一套临床队列。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 评测一个去伪影算法在真实伪影上的效果 | 每条记录都有同步的干净对照通道 | 够,这是它存在的主要理由 |
| 训练一个伪影检测器 | 32 条记录、触发沿标注、加速度计 | 只能做小样本演示,不能做泛化训练 |
| 检验算法在“伪影幅度大”时的退化 | 每次扰动 10–25 秒,幅度由拉线力度决定 | 够做定性,缺幅度分级标签 |
| 研究多模态同步采集的时间对齐 | 生理与加速度分属两套系统,靠触发沿对齐 | 够,且能看清对齐误差的量级 |
| 做睡眠分期、情绪识别、BCI 解码 | 无任务、无标签、单部位 | 不够,完全不够 |
| 覆盖全身或全头皮 | 只取额叶,EEG 仅 FPz 与 FP1h | 不够 |
| 做跨人群泛化 | 被试 6–10 人,年龄二十几岁 | 不够 |
| 复现论文里的相关系数 | 论文给的是筛选后子集,发布的是另一个子集 | 部分够,数值不能直接套(§7.3) |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你写了一个新的去噪网络,审稿人问“有没有在真实伪影上验证” | 提供成对的污染与对照通道,可直接算保真度指标 | 用同一段干净期的相关系数做上界,报告去除前后的相对恢复 |
| 你在做加速度计辅助的自适应滤波 | 6 路加速度与生理信号严格同步,参考通道现成 | 用被扰动那只的三轴做参考,另一只做目标,先跑最小二乘 |
| 你要论证“仿真评测高估了算法性能” | 同一算法在仿真与真实伪影上的差可以直接摆出来 | 用同一段干净数据造仿真伪影,再与真实伪影段并列比较 |
| 你在搭多设备同步采集的实验台 | 触发沿对齐的完整做法写在数据里 | 照抄“软件触发 + 双系统各记一路”的方案,别用系统时钟硬对 |
| 你要教生理信号处理课 | 一条曲线讲清伪影、参考、机械证据三件事 | 取 eeg_1 的前两分钟做演示,足够直观 |
| 你在给算法做失败分析 | 逐条记录都能定位到哪一次扰动没修好 | 按扰动区间切片,逐段比对,而不是只看整段相关系数 |
1.5 一句话判断
它是一件测量仪器,不是一堆样本:仪器只告诉你“这条曲线离真值有多远”,不告诉你怎么把曲线修好,更不负责让修好的曲线在别的场景里依然成立。
1.6 不适合谁:四条边界
不适合当主力训练集。 样本量与多样性都不支持参数化模型。哪怕只做一个小型卷积网络,也需要额外的数据增强与严格的留一被试划分,否则测试分数没有意义。
不适合研究自发脑活动。 被试闭眼静坐,没有任务,额叶两导的生理信息量本来就低;去除伪影之后剩下的那点信号,不足支撑认知或情绪类结论。
不适合推断人群差异。 6 名 EEG 被试、10 名 fNIRS 被试,两批人还是分开采集的,年龄集中在二十几岁。任何按性别、年龄做的比较都会落到个位数样本上。
不适合直接搬用到可穿戴场景。 这里的伪影是“被拉了一下线”,不是“走了两步”。把在此库上调好的参数直接用到腕式或耳戴设备上,通常要重新标定。
§2 数据构成与规格
2.1 32 条记录、96 个信号文件、5 个附属文件
官方目录一共列出 101 个文件。其中 96 个是记录文件:32 条记录,每条三个同名文件(.hea 头文件、.dat 信号、.trigger 注释)。剩下 5 个是附属物:RECORDS 记录清单、ANNOTATORS 注释角色说明、SHA256SUMS.txt 校验清单、EEG-csv.zip、fNIRS-csv.zip。
| 文件类别 | 数量 | 单件体积 | 作用 |
|---|---|---|---|
eeg_*.hea |
23 | 486–508 B | 声明 10 路信号、2048 Hz、各通道增益与名称 |
eeg_*.dat |
23 | 18.8 或 21.1 MiB | 交错存放 10 路 16 位整数 |
eeg_*.trigger |
23 | 58–74 B | 触发沿注释,只有起止两处 |
fnirs_*.hea |
9 | 631–648 B | 声明 12 路信号、200 Hz |
fnirs_*.dat |
9 | 2.2 或 2.5 MiB | 交错存放 12 路 16 位整数 |
fnirs_*.trigger |
9 | 58–68 B | 触发沿注释,含每个污染区间的起止 |
RECORDS |
1 | 224 B | 32 行记录名,末行无换行 |
ANNOTATORS |
1 | 50 B | 一行说明:trigger 的角色 |
SHA256SUMS.txt |
1 | 7.5 KB | 逐文件哈希,2019 年补入 |
EEG-csv.zip |
1 | 145.4 MB | 23 个 CSV 原始表 |
fNIRS-csv.zip |
1 | 13.9 MB | 9 个 CSV 原始表 |
体积比值得单独说一句:EEG 记录的单文件是 fNIRS 的八到九倍,原因全在采样率——2048 Hz 对 200 Hz,通道数只差两路。
两个 CSV 压缩包与 WFDB 版本并存,是这类老数据集的常见形态。CSV 是采集现场导出的原始表格,带着采集软件的列顺序与刻度;WFDB 是为了让 PhysioNet 工具链能读而重新打包的版本,做了时间对齐、重采样与裁剪。两者内容同源,但并非逐位等价:WFDB 版砍掉了触发沿之外的头部与尾部,fNIRS 从 25 Hz 重采样到 200 Hz,EEG 记录的加速度从 200 Hz 重采样到 2048 Hz。想要最接近采集现场的数据,用 CSV;想省掉对齐麻烦、直接用标准工具读,用 WFDB。两条路得到的相关系数不会完全一致,报结果时要写明走的哪条路。
2.2 字段字典:头文件里的十三项
WFDB 头文件是纯文本,第一行四个字段,之后每路信号一行。下表按出现顺序逐项拆开,示例取自 eeg_1 与 fnirs_1。
| 信息项 | 位置 | 示例 | 含义 | 使用注意 |
|---|---|---|---|---|
| 记录名 | 第 1 行第 1 字段 | eeg_1 |
文件名前缀 | 与 RECORDS 一致 |
| 信号条数 | 第 1 行第 2 字段 | 10 或 12 |
通道数 | EEG 10、fNIRS 12,没有例外 |
| 采样率 | 第 1 行第 3 字段 | 2048 或 200 |
每秒采样点数 | 一条记录内所有通道共用同一个值 |
| 采样点数 | 第 1 行第 4 字段 | 1106064 或 108006 |
总长度 | 除以采样率得秒数 |
| 数据文件 | 信号行第 1 字段 | eeg_1.dat |
信号所在文件 | 全部通道共用一个 .dat |
| 存储格式 | 信号行第 2 字段 | 16 |
16 位有符号整数 | 不是浮点,读进来是整数 |
| 增益 | 信号行第 3 字段 | 1000/mV |
每毫伏对应的整数单位 | 见下方关于 nd 的说明 |
| 位分辨率 | 信号行第 4 字段 | 16 |
ADC 位数 | 与存储格式同值 |
| ADC 零值 | 信号行第 5 字段 | 0 |
零电平对应整数 | 换算物理量时先减 |
| 初始值 | 信号行第 6 字段 | 3349 |
首采样点整数值 | 可用来快速校验读取是否正确 |
| 校验和 | 信号行第 7 字段 | 21358 |
采样点累加和 | 校验 .dat 是否完整 |
| 块大小 | 信号行第 8 字段 | 0 |
每帧字节数 | 0 表示由读取库自动推算 |
| 通道名 | 信号行第 9 字段 | EEG1、ACC_x1 |
通道标识 | 名称不统一,见 §5.6 |
1000/nd 里的 nd 是无量纲(non-dimensional)的写法。EEG 两导用 1000/mV,可以换算成毫伏;加速度与触发通道一律 nd,意味着头文件没有给出“每单位对应多少 g”的换算系数。论文里写了加速度计量程 ±2 g、芯片型号 ADXL327,但数据文件本身没带标定,想还原成 g 必须自己假设满量程对应关系。
2.3 一条 EEG 记录的完整解剖
eeg_1.hea 全文如下(省略重复的信号行):
eeg_1 10 2048 1106064
eeg_1.dat 16 1000/mV 16 0 3349 21358 0 EEG1
eeg_1.dat 16 1000/mV 16 0 3285 22946 0 EEG2
eeg_1.dat 16 1000/nd 16 0 650 11680 0 EEG_tr
eeg_1.dat 16 1000/nd 16 0 -6250 9669 0 ACC_x1
eeg_1.dat 16 1000/nd 16 0 488 685 0 ACC_y1
eeg_1.dat 16 1000/nd 16 0 -1758 -8726 0 ACC_z1
eeg_1.dat 16 1000/nd 16 0 -732 24248 0 ACC_x2
eeg_1.dat 16 1000/nd 16 0 5664 6201 0 ACC_y2
eeg_1.dat 16 1000/nd 16 0 6396 -24815 0 ACC_z2
eeg_1.dat 16 1000/nd 16 0 674 -23330 0 ACC_tr
第一行读完就知道全部规模:10 路、2048 Hz、1106064 点,除以 2048 得 540.07 秒。之后十行是十路信号,顺序固定为:通道一、通道二、生理触发、加速度计一的 X/Y/Z、加速度计二的 X/Y/Z、加速度触发。
十路信号共用一个采样率,这一点比想象中重要。原始采集时 EEG 是 2048 Hz、加速度计是 200 Hz,两套系统各自记录;进入 WFDB 版本后,官方把加速度计重采样到 2048 Hz,才让一条记录只有一个采样率。代价是加速度通道的点数是插值出来的,相邻点之间并不独立——做频谱分析时,加速度的有效带宽仍是原来的 100 Hz 以内,不能因为看到 2048 Hz 就以为高频信息存在。
顺带记一个能省时间的读法:把每行的第 6 字段(初始值)和 .dat 的第一个采样点对一下,数值相同就说明读取顺序没错。这个技巧在两套系统交错存放通道的文件上特别管用,因为一旦把通道顺序搞反,第一路读到的是加速度而不是脑电,波形看起来仍然“像信号”,肉眼很难发现。
2.4 一条 fNIRS 记录的完整解剖
fnirs_1.hea 是 12 路、200 Hz、108006 点,折合 540.03 秒:
fnirs_1 12 200 108006
fnirs_1.dat 16 1000/nd 16 0 10420 -8006 0 fNIRS-690_1
fnirs_1.dat 16 1000/nd 16 0 -17786 13849 0 fNIRS1-830_1
fnirs_1.dat 16 1000/nd 16 0 16590 3821 0 fNIRS-690_2
fnirs_1.dat 16 1000/nd 16 0 15726 -30102 0 fNIRS-830_2
fnirs_1.dat 16 1000/nd 16 0 668 7388 0 fNIRS_tr
fnirs_1.dat 16 1000/nd 16 0 -3223 22956 0 ACC_x1
fnirs_1.dat 16 1000/nd 16 0 293 -20650 0 ACC_y1
fnirs_1.dat 16 1000/nd 16 0 -3467 14039 0 ACC_z1
fnirs_1.dat 16 1000/nd 16 0 244 4554 0 ACC_x2
fnirs_1.dat 16 1000/nd 16 0 4639 11109 0 ACC_y2
fnirs_1.dat 16 1000/nd 16 0 3564 20626 0 ACC_z2
fnirs_1.dat 16 1000/nd 16 0 674 -10426 0 ACC_tr
四路生理通道的排列是“先按波长、再按通道”:690 纳米的一号、830 纳米的一号、690 纳米的二号、830 纳米的二号。被扰动的是二号探头,所以在成对比较里,fNIRS-690_1 与 fNIRS-690_2 是一对,fNIRS-830_1 与 fNIRS-830_2 是另一对。
这里有一个必须记住的命名瑕疵:第二路的通道名写作 fNIRS1-830_1,比同族其他名字多了一个 1、少了一个连字符。按位置顺序读不会错,按名字做字符串匹配就会漏掉这一路。
2.5 三类通道各自的物理含义
| 通道名 | 家族 | 记录内采样率 | 单位 | 物理含义 | 常见误用 |
|---|---|---|---|---|---|
EEG1 / EEG2 |
生理 | 2048 Hz | 1000/mV |
额叶两点电位差 | 当成全头皮脑电做空间分析 |
fNIRS-690_1 等 |
生理 | 200 Hz | nd |
690 或 830 纳米的光强 | 当成已换算的血氧浓度 |
EEG_tr / fNIRS_tr |
触发 | 同记录 | nd |
实验起止与污染区间标记 | 当成生理信号滤波 |
ACC_x1–ACC_z1 |
机械 | 同记录 | nd |
一号探头的三轴加速度 | 直接当参考通道而不做延迟补偿 |
ACC_x2–ACC_z2 |
机械 | 同记录 | nd |
二号探头的三轴加速度 | 与一号混用,忘记哪只被扰动 |
ACC_tr |
触发 | 同记录 | nd |
加速度系统的同步标记 | 与生理触发错配,导致整体时移 |
三类通道的性质完全不同,处理方式也必须分开。生理通道可以滤波、可以去趋势;触发通道只能取沿,任何滤波都会把沿的位置抹开;加速度通道是机械量,与生理信号之间存在未知的延迟(皮肤位移到光强或电位变化需要时间),做自适应滤波时必须留出延迟搜索范围,否则参考信号会“提前”或“滞后”,滤波效果被系统性低估。
2.6 与同类资源的字段差异
| 维度 | 本库 | MACECGDB(运动伪迹心电) | MR-ART(运动伪影 MRI) | 普通临床 EEG 库 |
|---|---|---|---|---|
| 模态 | fNIRS 与 EEG | 心电 | 磁共振图像 | 脑电 |
| 对照方式 | 双探头同步,一净一污 | 单人心电,无同步对照 | 同一人三种运动等级配对 | 无对照 |
| 机械证据 | 三轴加速度计 | 无 | 扫描期间的位移估计 | 无 |
| 记录规模 | 32 条 | 27 条 | 148 人 × 3 套 | 数百至数千条 |
| 单条时长 | 8–9 分钟 | 8 秒 | 一次扫描 | 数分钟至数十小时 |
| 标注 | 触发沿 | 无 | 运动等级标签 | 事件与发作标注 |
| 主要用途 | 伪影去除评测 | 单导心电鲁棒性 | 图像重建鲁棒性 | 临床判读与检测 |
四者放在一起看,能看清这个库的定位:它不是“更多数据”,而是“另一种测量方式”。同样处理伪影问题,心电库给你一条脏信号,图像库给你一个运动等级标签,只有它给你一条同时刻的干净对照。
§3 它是谁的数据
3.1 贡献者与两个机构
| 角色 | 姓名 | 机构 | 贡献 |
|---|---|---|---|
| 第一作者 | Kevin T. Sweeney | 梅努斯国立大学电子工程系 | 实验设计、采集、方法验证 |
| 通讯方向 | Seán F. McLoone | 梅努斯国立大学电子工程系 | 方法框架、信号处理 |
| 合作 | Tomás E. Ward | 梅努斯国立大学电子工程系 | 信号处理与建模 |
| 合作 | Hasan Ayaz | 德雷塞尔大学生物医学工程系 | fNIRS 实验与光极布置 |
| 合作 | Meltem Izzetoglu | 德雷塞尔大学生物医学工程系 | fNIRS 系统与信号质量 |
| 合作 | Banu Onaral | 德雷塞尔大学生物医学工程系 | 项目指导 |
这个组合解释了两件事。第一,为什么一个数据集里同时有 fNIRS 和 EEG:两套设备分属两个机构,fNIRS 一侧来自德雷塞尔的认知神经工程团队,EEG 一侧由梅努斯完成。第二,为什么实验设计如此“工程化”:整套方法关注的是“怎么造出可验证的参考”,而不是“怎么采集有临床价值的信号”。资助来源是爱尔兰研究理事会与爱尔兰科学基金会的前沿项目,属于方法学研究经费,不是临床队列经费。
3.2 时间线
| 时间 | 事件 | 依据 |
|---|---|---|
| 2012 年 2 月 | 论文投稿 | 论文页首收稿日期 |
| 2012 年 7 月 | 论文在线发表 | 论文页首出版日期 |
| 2012 年 9 月 | 正式刊于 IEEE TITB 第 16 卷第 5 期 | 期刊卷期页码 |
| 2013 年 1 月 | 后续论文刊于 IEEE TBME,同一批数据再用于验证新方法 | 官方参考文献第二条 |
| 2014 年 2 月 27–28 日 | 数据文件打包上传 | 目录中的文件修改时间 |
| 2014 年 3 月 3 日 | PhysioNet 正式发布 1.0.0 | 项目页发布日期 |
| 2019 年 2 月 20 日 | 补入 SHA256SUMS.txt |
该文件修改时间 |
十二年只有一个版本,这在 PhysioNet 上不算常见。多数库会经历头文件修订、单位统一、注释重算;这个库什么都没动,说明两件事:数据本身没有再加工的价值,或者维护者认为没有必要。对使用者而言这是好事——任何年份下载的副本内容一致,除了校验清单是后补的。
3.3 采集场景:闭眼静坐与拉线
实验过程在论文里写得很细。fNIRS 一侧取 10 名健康被试(4 男 6 女,平均 29 岁,标准差 5.62 岁),光极贴在左前额,光源与探测器间距 30 毫米,两只探测器彼此相距约 20 毫米,两个测量体积的中心相距约 10 毫米——这组数字决定了“两个通道看到的是同一片皮层”这个前提是否成立。EEG 一侧取 6 名健康被试(3 男 3 女,平均 27 岁,标准差 4.29 岁),分四次实验,电极固定在 256 导电极帽的 FPz 与 FP1h 位置,帽子的织物结构让单个电极可以被拉动而不带动邻居。
被试的任务是“没有任务”:闭眼,头保持不动,尽量不眨眼。这一点常被忽略——它意味着数据里几乎没有眼电与眨眼伪影,也没有咀嚼与转头。伪影来源被压缩到唯一一种:实验者伸手拉线缆。
扰动的时间结构是固定的:每两分钟一次,每次持续 10 到 25 秒之间的随机长度。9 分钟的记录里因此有四次左右的扰动。落盘文件却有两种长度:540 秒与 480 秒。官方只说明裁掉了触发第一次上升之前与最后一次下降之后的短片段;按这个口径,540 秒那一批与“9 分钟实验”基本对得上,480 秒那一批则差了一整分钟,要么实验本身更短,要么头尾裁得更多。公开材料没有交代是哪一种,这里按未核验处理,不做推断。
3.4 数据来源的三个层次
| 层次 | 内容 | 可信度 | 用途 |
|---|---|---|---|
| 设备层 | TechEn CW6 近红外系统、BioSemi Active-Two 脑电系统、ADXL327 加速度计 | 论文明确 | 判断信号带宽与噪声底 |
| 协议层 | 闭眼静坐、每两分钟拉线 10–25 秒、单次 9 分钟 | 论文明确 | 判断伪影的时间结构 |
| 落盘层 | 32 条记录、480 或 540 秒、200 与 2048 Hz | 头文件可核 | 直接决定代码怎么写 |
| 人群层 | 6 人与 10 人两批,二十几岁,健康 | 论文明确,官方页未列 | 判断能否做人群推断 |
| 筛选层 | fNIRS 侧按干净期相关系数 0.65 剔除,20 次留 16 次 | 论文明确 | 解释为什么发布的是 9 条 |
§4 它最独特的东西
4.1 配对设计为什么稀缺
生理信号领域缺的从来不是数据,是“同一时刻的两种状态”。临床数据里,一次记录只有一种状态,想要对照只能换时间、换人、换设备,于是所有差异都混在一起:状态差异、个体差异、设备差异、日间差异。
这个库用一个物理动作把变量压到最小:同一被试、同一时刻、同一片皮层、同一套采集参数,唯一被改变的是“有一只探头被拉了一下”。在这种设计下,两条通道的差就是伪影本身,两条通道的相似度就是信号保真度的上界。这是它最硬的一点,也是任何靠仿真拼出来的数据集给不了的。
代价藏在“压到最小”这四个字里。把变量控住的同时,也把外推空间控没了:你没法从这个设计里知道伪影在其他部位长什么样,也没法知道被试走动时它怎么变。更麻烦的是“唯一被改变”只是个近似——拉一只探头时,头皮与帽体难免有轻微联动,另一只探头也会感受到一点位移,只是幅度小。论文用两只加速度计分别记录的正是这个联动,所以严格说参考通道不是“绝对干净”,而是“相对干净”。做高精度分析时,这一点应当写进方法的局限里。
4.2 差异化证据
| 对比维度 | 纯仿真评测 | 只有脏数据的真实库 | 本库 |
|---|---|---|---|
| 参考信号来源 | 人造模型 | 无 | 同步采集的第二只探头 |
| 伪影时间定位 | 精确已知 | 靠目视或算法猜 | 触发沿加加速度计双证 |
| 伪影形态真实性 | 取决于模型 | 真实但不可分 | 真实且可与参考分离 |
| 可复现性 | 高 | 低 | 高(数据固定、版本唯一) |
| 规模 | 任意 | 大 | 极小 |
| 结论外推性 | 弱 | 中 | 弱(场景单一) |
这张表的读法是:它把“真实性”和“可分离性”这两个通常互斥的属性同时拿到了,代价是牺牲了规模与外推性。
4.3 具体案例:一次二十秒的扰动留下什么
论文给了两组可以直接引用的相关系数,都是筛选后子集上的值。fNIRS 侧,干净期的通道间平均相关为 0.77(标准差 0.2),整段(含伪影)降到 0.58(标准差 0.16);单条示例记录上,干净期为 0.87、运动期为 0.31。EEG 侧,干净期 0.83(标准差 0.2),整段 0.40(标准差 0.19);示例记录上干净期 0.83、运动期 0.09。
| 指标 | fNIRS | EEG | 出处 |
|---|---|---|---|
| 干净期通道间相关 | 0.77(0.2) | 0.83(0.2) | 2012 年论文 |
| 整段通道间相关 | 0.58(0.16) | 0.40(0.19) | 2012 年论文 |
| 示例记录干净期相关 | 0.87 | 0.83 | 论文图注 |
| 示例记录运动期相关 | 0.31 | 0.09 | 论文图注 |
| 伪影占整段比例 | 19.75% | 15.74% | 2012 年论文 |
| 筛选阈值 | 干净期相关低于 0.65 剔除 | 未提剔除 | 2012 年论文 |
EEG 的运动期相关系数掉到 0.09,这个数字值得停一下:它意味着在扰动期间,两条通道几乎不再相关,参考通道提供的信息接近于零。也就是说,伪影不是“叠加了一层噪声”,而是把信号本身淹没了。任何线性滤波在这种区间都救不回来,只能靠参考通道或先验模型重建。
4.4 标注粒度:触发沿而不是区间
| 文件 | 内容 | 粒度 | 能否直接当标签用 |
|---|---|---|---|
eeg_*.trigger |
起点与终点两个沿 | 记录级 | 不能,中间没有分界 |
fnirs_*.trigger |
每个污染区间的起止 | 区间级 | 可以,但要核对方位 |
ANNOTATORS |
一行文字说明 | 说明性 | 不能,且与正文有出入 |
| 加速度通道 | 连续三轴信号 | 采样点级 | 可以,需自己定阈值 |
| CSV 包 | 原始未对齐表 | 列级 | 需自行对齐 |
粒度这件事上,两类记录并不对等。fNIRS 的触发信号带中间的翻转,所以 .trigger 里能读出“第几分钟开始脏、第几分钟恢复”;EEG 的触发信号只有起止两个沿,中间是平的,伪影区间必须从加速度通道或信号本身的突变去推。官方页面在 CSV 一节把这件事讲清楚了,但在 WFDB 一节没有重复提醒,很容易看漏。
4.5 边界条件
| 边界 | 具体值 | 影响 |
|---|---|---|
| 部位 | fNIRS 左前额;EEG FPz 与 FP1h | 不能代表枕区、中央区、颞区 |
| 任务 | 无,闭眼静坐 | 无认知或运动相关成分 |
| 伪影类型 | 拉线造成的探头或电极位移 | 不含眨眼、咀嚼、行走、出汗 |
| 时长 | 单次 8–9 分钟 | 不足以研究长时漂移 |
| 被试 | 6 人与 10 人,二十几岁健康 | 不能做年龄或疾病分层 |
| 采样 | EEG 2048 Hz、fNIRS 200 Hz | fNIRS 原始 25 Hz 已上采样,高频无信息 |
| 单位 | 加速度为无量纲 | 无法直接换算成 g |
| 许可 | ODC-By 1.0 | 可商用,须署名 |
§5 怎么拿到
5.1 目录结构与下载面
| 入口 | 地址 | 适合 |
|---|---|---|
| 项目页 | https://physionet.org/content/motion-artifact/1.0.0/ |
看说明、许可、DOI |
| 文件树 | https://physionet.org/files/motion-artifact/1.0.0/ |
逐文件下载 |
| 整包 | 项目页的 Download ZIP | 一次拿全 649.9 MB |
| S3 | s3://physionet-open/motion-artifact/1.0.0/ |
云端批量同步 |
| 子集 | EEG-csv.zip 或 fNIRS-csv.zip |
只要原始 CSV 时 |
不需要注册,不需要签署数据使用协议,点开就能下。这一点与很多需要申请访问的临床库不同,原因是数据来自健康志愿者的短时实验,不含受保护健康信息。
5.2 批量下载
#-- 整库递归下载,保留目录结构,已存在则跳过
wget -r -N -c -np https://physionet.org/files/motion-artifact/1.0.0/
#-- 只取 WFDB 三个文件,不碰两个大 CSV 包
wget -r -N -c -np -A 'eeg_*.dat,eeg_*.hea,eeg_*.trigger' \
https://physionet.org/files/motion-artifact/1.0.0/
#-- 云端同步,适合放进计算节点
aws s3 sync --no-request-payer s3://physionet-open/motion-artifact/1.0.0/ ./motion-artifact/
#-- 校验完整性
cd motion-artifact && sha256sum -c SHA256SUMS.txt
第一条命令会把 650 MB 全拉下来,其中 159 MB 是 CSV 压缩包。如果只用 WFDB 版本,第三条的 S3 同步配合 --exclude 会更省事:
aws s3 sync --no-sign-request s3://physionet-open/motion-artifact/1.0.0/ ./ma/ \
--exclude "*" --include "*.hea" --include "*.dat" --include "*.trigger"
5.3 用 wfdb 直接流式读取
import wfdb
import numpy as np
#-- 远程直读;pn_dir 也可以用 'motion-artifact/1.0.0'
rec = wfdb.rdrecord('eeg_1', pn_dir='motion-artifact')
print(rec.fs, rec.sig_len, rec.sig_name)
#-- 前两路是生理通道,后八路是触发与加速度
eeg = rec.p_signal[:, :2]
acc = rec.p_signal[:, 3:9]
#-- 触发注释:R 为上升沿,F 为下降沿
ann = wfdb.rdann('eeg_1', 'trigger', pn_dir='motion-artifact')
print(list(zip(ann.sample, ann.symbol)))
p_signal 已按增益换算;EEG 两路得到的是毫伏量级的浮点数,加速度那几路因为增益写的是 1000/nd,换算后仍然是无量纲数,别指望它直接是 g。
5.4 转成可训练的表
import wfdb
import numpy as np
import pandas as pd
def load(name, pn_dir='motion-artifact'):
rec = wfdb.rdrecord(name, pn_dir=pn_dir)
df = pd.DataFrame(rec.p_signal, columns=rec.sig_name)
df.insert(0, 't', np.arange(len(df)) / rec.fs)
return df, rec.fs
df, fs = load('fnirs_1')
#-- 四路生理通道改名,便于成对取用
pairs = {'690': ('fNIRS-690_1', 'fNIRS-690_2'),
'830': ('fNIRS1-830_1', 'fNIRS-830_2')}
#-- 每两分钟切一段,与实验的扰动节奏对齐
for k in range(0, 4):
seg = df.iloc[k * 120 * fs:(k + 1) * 120 * fs]
print(k, len(seg), seg['ACC_x2'].std(), seg['ACC_x1'].std())
最后一行的读法,是这个库里最省事的“有没有被扰动”判据:被拉的那只数值明显更大。
CSV 包要不要用,取决于你想复现哪一步。如果你要复现论文里的处理流程,用 CSV 更接近原状,因为官方的重采样发生在打包成 WFDB 的时候;如果你只是要一个能跑通的基线,用 WFDB 版本省掉同步这一步,代价是接受官方的插值。两种选择都要在论文里写清楚,否则同一段信号在不同人手里会算出不同的相关系数,而这差距并非来自算法。
CSV 还有一处需要注意:列头里写了三组不同的采样率(25 Hz、200 Hz、2048 Hz),但一张表只能有一个行索引。这意味着至少有一组列在表里是被重复填写或按行对齐过的,具体规则官方没有写明。用之前先看行数:如果行数接近 200 Hz 乘以时长,说明整张表按加速度的节奏展开;如果接近 25 Hz 乘以时长,说明按光强的节奏展开。这一步不做,后面所有对齐都是错的。
5.5 注释映射:R 与 F 的方位之辨
| 符号 | 官方正文的说法 | ANNOTATORS 文件的说法 |
实践建议 |
|---|---|---|---|
R |
触发信号上升沿 | 写作“stop” | 按正文理解,用波形核对 |
F |
触发信号下降沿,即污染区间起点 | 写作“start” | 按正文理解,用加速度核对 |
官方 ANNOTATORS 只有一行:trigger start (F) and stop (R) of motion artifact。而项目页正文写的是“R 标注触发信号的上升,F 标注下降(污染区间的起点)”。两处措辞对不上:一处把 F 说成起点、把 R 说成终点,另一处只描述沿的方向,没有说哪个是起点。由于触发信号在污染时下降、在干净时回升,F 确实是污染区间的起点,R 是终点——正文与物理过程一致,ANNOTATORS 的括号写法把两个字母的语义写反了。
稳妥做法是不背结论:取一条记录,把 ann.sample 标在生理通道与加速度通道上,看一眼就明白。用加速度计的高方差区间去对照,是唯一不会错的核对方式。
5.6 五个最容易出错的地方
| 坑 | 现象 | 原因 | 处理 |
|---|---|---|---|
| 通道名不统一 | fNIRS1-830_1 匹配不上 fNIRS-830_* |
上传时的命名笔误 | 按列序号取,不按名字匹配 |
| 采样率被误解 | 以为加速度有 2048 Hz 的带宽 | 重采样只改变了点数 | 分析加速度前先降采样回 200 Hz |
| 触发语义反向 | 把 F 当终点 |
ANNOTATORS 与正文矛盾 |
用加速度或波形核对一次 |
| EEG 无区间标注 | eeg_*.trigger 只有两个沿 |
原始触发信号没有中间翻转 | 用加速度通道自己划区间 |
| 单位缺失 | 加速度换不出 g | 增益写作 1000/nd |
只做相对比较,或按满量程反推 |
这五条里,第四条影响最大。很多人拿到 EEG 记录,以为 .trigger 里有完整的伪影区间,结果发现只有两个点,于是要么放弃分段评测,要么从相关系数里硬切,两种做法都会把结论带偏。
§6 与库内条目的关系
6.1 关系图谱
| 站内词条 | 关系 | 差异要点 |
|---|---|---|
| mr-art | 同主题,不同模态 | 那是 148 人的配对 T1 脑 MRI,伪影来自扫描期运动,按图像分级 |
| realnoisemri | 同主题,不同模态 | 运动退化的脑 MRI 重建挑战,评价对象是图像质量 |
| macecgdb | 同主题,最近亲 | 同为 PhysioNet 的运动伪迹库,但为单人心电、8 秒片段、无配对参考 |
| mental-fnirs | 同模态 | 那是 n-back 任务下的 fNIRS 与经颅多普勒,关注血流响应而非伪影 |
| stroke-eeg-fnirs | 同模态组合 | 卒中康复的 EEG 与 fNIRS 纵向记录,有临床标签但无干净对照 |
| tuev | 同模态 | 六类脑电事件的逐通道标注,规模大、有事件标签、无配对设计 |
| tuab | 同模态 | 临床正常与异常二分类,反映真实临床噪声而非可控伪影 |
| chb-mit-scalp-eeg | 同模态 | 长程癫痫监测,含大量运动伪影但没有对照通道 |
| scientisst-move | 同问题域 | 自由活动中的可穿戴多模态信号,伪影真实但不可分离 |
| accelerometry-walk-climb-drive | 同传感模态 | 纯加速度数据,可用于构造机械参考,但没有同步生理通道 |
6.2 检索路径
想找“带干净参考的伪影数据”,可以从三个方向切进来。按伪影类型切,artifact 标签下这条是唯一同时覆盖光学与电生理的;按配对设计切,全站目前只有它与 MR-ART 采用“同一时刻两套采集”的思路,一个在时间序列上,一个在图像上;按模态组合切,fnirs 与 eeg 的交集里,这条最老、最小,也最像实验台记录。
如果目标是训练而不是评测,检索应当反向走:先找有事件标签的库,再用这个库做鲁棒性测试。这个顺序不能颠倒,颠倒的后果是把评测集当训练集,分数好看但没有意义。
6.3 分工判据
| 你的问题 | 该用哪个 | 判据 |
|---|---|---|
| 伪影去除算法在真实数据上是否有效 | 本库 | 有同步干净对照,能算保真度 |
| 伪影检测器能否泛化到临床 | TUAB 或 TUEG 系列 | 需要真实临床噪声与多样性 |
| 运动伪影是否影响图像重建 | MR-ART 或 RealNoiseMRI | 评价对象是图像 |
| 单导心电在运动时是否可靠 | MACECGDB | 心电模态、无对照 |
| 自由活动下的多模态伪影长什么样 | ScientISST MOVE | 场景真实、可穿戴 |
| 加速度能否作为生理信号的参考 | 本库加加速度库 | 本库提供同步配对,加速度库提供多样动作 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评分针对的是“作为伪影评测台”的用途,不是“作为通用生理数据集”。用训练集的标准衡量它,每一项都会不及格;用评测台的标准衡量,它的核心项接近满分。下面的分数只在后一种口径下成立。
7.1 五维评分
| 维度 | 分数 | 依据 | 扣分原因 |
|---|---|---|---|
| 规模 | 2 / 5 | 32 条记录、十几名被试 | 无法支撑参数化模型训练 |
| 结构 | 5 / 5 | 通道分工清晰,触发与加速度齐全 | 命名有笔误,单位缺失 |
| 标注 | 3 / 5 | 有触发沿与机械旁证 | EEG 缺区间标注,ANNOTATORS 有矛盾 |
| 文档 | 3 / 5 | 项目页把 CSV 与 WFDB 两套格式都讲了 | 人群信息、时长、版本差异全靠论文补 |
| 可复现 | 4 / 5 | 版本唯一、有哈希清单、许可清晰 | 论文口径与发布子集不完全对应 |
| 场景真实度 | 3 / 5 | 真实人体、真实位移 | 单一伪影类型,闭眼静坐 |
7.2 标注质量的两层
第一层是触发沿。它由软件在采集时写入,位置精确到采样点,可靠性接近硬件级——前提是两套系统的触发确实同步。官方为此专门说明:生理与加速度分属独立系统,靠软件触发对齐,R/F 沿的位置就是对齐依据。这意味着触发沿的精度取决于两套系统的采样时钟一致性,而不是人工标注。
第二层是污染区间的判定。加速度只能证明“探头动了”,不能直接证明“这一段信号被污染了”。中间隔着机械位移到信号变化的传递过程:光极被拉动后,光强变化有延迟;电极被拉动后,电位跳变几乎瞬时。所以同一个“动了”的区间,在 fNIRS 与 EEG 上对应的污染起止并不相同。论文用加速度数据配合简单的标记算法划定区间,这个区间是“机械事件区间”,不是“信号劣化区间”。
由此带来一个实操上的选择:污染区间该由谁定义。三种做法各有代价。按加速度定,起止清楚、可复现,但会把信号还没坏的几秒也算进去;按两条通道的差定,直接反映信号劣化,但差本身受伪影影响,存在循环论证;按触发沿定,最接近实验设计,但 EEG 记录只有起止,中间拿不到。比较稳妥的是以加速度为主、用差信号校核,并在方法里写明阈值怎么取。
7.3 可枚举的偏差
| 偏差 | 具体表现 | 后果 |
|---|---|---|
| 场景偏差 | 闭眼静坐、额叶单点 | 结论不能外推到可穿戴与全头皮 |
| 伪影类型偏差 | 只有拉线位移 | 不含眨眼、肌电、出汗、电极脱落 |
| 幅度偏差 | 拉线力度由实验者控制 | 无分级标签,无法做剂量反应分析 |
| 子集偏差 | 论文 fNIRS 侧 20 次筛选留 16 次,发布 9 条 | 论文相关系数不能直接套到发布数据上 |
| 数量偏差 | 论文 EEG 24 次,发布 23 条 | 少的那一条无说明,不能假设随机缺失 |
| 人群偏差 | 二十几岁健康人,6 与 10 两批 | 不能做年龄或疾病分层 |
| 单位偏差 | 加速度无量纲 | 无法做绝对幅度比较 |
| 对齐偏差 | 两套系统靠触发沿对齐 | 存在采样级时移,做延迟敏感分析要估 |
子集偏差与数量偏差这两条,是最容易在论文里写错的地方。引用 0.77 与 0.83 这两个相关系数时,必须说明它们来自论文的筛选子集,而不是 PhysioNet 上的 9 条 fNIRS 与 23 条 EEG。
7.4 外部验证矩阵
| 验证方向 | 可行的做法 | 本库能提供什么 | 缺什么 |
|---|---|---|---|
| 算法间横向比较 | 同一批记录跑多种方法,比保真度 | 统一的输入与参考 | 没有公认基线分数 |
| 与仿真比较 | 用干净段造仿真伪影,再与真实伪影段并列 | 干净段现成 | 仿真参数需自定 |
| 跨被试泛化 | 留一被试交叉验证 | 6 与 10 名被试 | 人数太少,方差大 |
| 跨模态迁移 | 在 EEG 上调参,迁到 fNIRS | 两种模态同源方法 | 采样率与物理机制不同 |
| 跨库迁移 | 在临床库上训练,在此库测试 | 干净的评测条件 | 场景差异过大,掉分不可避免 |
| 端到端任务验证 | 去伪影后做下游分类 | 无任务标签 | 无法评估下游收益 |
7.5 它为何能持续
十二年没有更新,引用却一直在。原因不是数据有多好,而是“配对 + 机械旁证”这个组合太少见。新方法层出不穷,每一种都需要一个不依赖仿真假设的评测台;建一个新评测台的成本远高于复用旧的。它的持续存在,本质上是一个供给缺口的结果,而不是一次成功的数据工程。
§8 生态位与历史
8.1 沿革
2012 年的论文提出的是一个方法论:用贴近放置的第二只探头制造“经验性真值”,把伪影去除的评价从模型依赖转成测量依赖。论文里用它评测了当时常见的几类方法——自适应滤波、典型相关分析、经验模态分解一类——目的是证明这个评测台能用。2013 年的后续论文提出一种把集合经验模态分解与典型相关分析结合的新方法,仍然用同一批数据验证。2014 年,数据本身被交给 PhysioNet 公开托管,从此脱离论文存在。
这条路径在生理信号领域很典型:方法论文先造数据,数据再独立成库。区别在于,多数这类库在公开时会被整理成“更大的版本”,这个库没有——发布的就是论文里用过的那批记录,连命名瑕疵都原样保留了。
8.2 与挑战赛的关系
| 对照项 | 本库 | 典型的挑战赛数据 |
|---|---|---|
| 组织方式 | 单个实验室贡献 | 会议或学会组织 |
| 评价指标 | 使用者自定 | 官方统一 |
| 排行榜 | 无 | 有 |
| 数据划分 | 无官方划分 | 训练/验证/测试固定 |
| 更新节奏 | 一次发布,不再改 | 每年或每届更新 |
| 参与者规模 | 零散引用 | 数十至数百队 |
它没有办过挑战赛,也没有官方基线。这既是缺点也是优点:没有排行榜意味着没有“刷榜式”过拟合,也意味着每个使用者都要自己定义指标,结果之间不可直接比较。
8.3 生态位
在“伪影去除”这条链上,它站在评测端,不在训练端。上游是各种采集设备与临床库,下游是各种去噪方法与下游任务。它的位置很窄:只服务“我需要一个不靠仿真假设的真实参考”这一种需求。但这一种需求恰好是方法论文的刚需——任何声称“在真实伪影上有效”的方法,都需要一个能算出保真度的地方。
它没有被取代,还有一个结构性原因:后来出现的运动伪影数据集,大多换了思路。一类走大规模路线,用成千上万条临床记录配弱标签,靠统计而非配对来定义 “干净”;另一类走可穿戴路线,用惯性单元配生理信号,场景真实但同样没有同时刻的干净对照。前者解决了泛化,后者解决了真实性,谁都没解决“同一时刻的参考”。这个空缺不大,却很难补,因为要补它,就必须回到实验台上做一次刻意设计的采集。
8.4 谁在用它
| 使用者类型 | 典型用法 | 关注点 |
|---|---|---|
| 方法研究者 | 新去噪方法的对照实验 | 保真度指标是否公平 |
| 可穿戴工程师 | 验证加速度辅助滤波 | 参考通道的延迟补偿 |
| 教学人员 | 讲解伪影、参考、机械证据 | 波形是否直观 |
| 复现研究者 | 复现论文中的相关系数 | 子集口径差异 |
| 多模态融合研究者 | 研究两套系统的同步 | 触发沿对齐精度 |
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 第三步 |
|---|---|---|---|
| 方法研究者 | 下载 WFDB 版本,读 eeg_1 |
用加速度划出污染区间 | 算干净期与污染期的通道间相关 |
| 工程师 | 先看 fnirs_1.hea 的通道顺序 |
确认哪两路成对 | 用被扰动那只的三轴做参考 |
| 教学者 | 取 eeg_1 前两分钟 |
画两路生理加两路加速度 | 让学生自己找扰动起点 |
9.2 一条最短的可用流程
先只取一条 EEG 记录,把四件事做完:读头文件确认 10 路与 2048 Hz;用 ACC_x2 的滑动标准差找扰动区间;用 ACC_x1 确认另一只没动;算干净期与污染期的两路相关系数。四步走完,你就有了这个库能给出的全部基本事实。
import wfdb
import numpy as np
rec = wfdb.rdrecord('eeg_1', pn_dir='motion-artifact')
fs = rec.fs
eeg1, eeg2 = rec.p_signal[:, 0], rec.p_signal[:, 1]
acc1, acc2 = rec.p_signal[:, 3:6], rec.p_signal[:, 6:9]
#-- 用被扰动那只的合加速度做滑动标准差
mag2 = np.linalg.norm(acc2, axis=1)
win = int(2 * fs)
sd2 = np.convolve(mag2, np.ones(win) / win, mode='same')
thr = np.median(sd2) + 3 * np.median(np.abs(sd2 - np.median(sd2)))
mask = sd2 > thr
#-- 干净段与污染段的相关,注意避开卷积边缘
edge = win
clean = mask[edge:-edge] == False
dirty = mask[edge:-edge] == True
r_clean = np.corrcoef(eeg1[edge:-edge][clean], eeg2[edge:-edge][clean])[0, 1]
r_dirty = np.corrcoef(eeg1[edge:-edge][dirty], eeg2[edge:-edge][dirty])[0, 1]
print(r_clean, r_dirty, dirty.mean())
最后打印的三个数,就是这次实验的保真度上界、污染期的退化程度、以及被判为污染的采样点比例。第三个数字只用于自检阈值是否合理,不要当成官方统计——官方从未给出逐条记录的比例。
9.3 引用方式
| 引用对象 | 内容 |
|---|---|
| 数据 | Motion Artifact Contaminated fNIRS and EEG Data, version 1.0.0. PhysioNet. 2014. |
| 方法论文 | Sweeney KT 等,IEEE Trans Info Tech Biomed 16(5):918–926, 2012 |
| 后续论文 | Sweeney KT 等,IEEE Trans Biomed Eng 60(1):97–105, 2013 |
| 平台 | PhysioNet 平台综述,2026 年发表于 Nature Health |
| DOI | 10.13026/C2988P |
论文里建议同时写明:用的是 WFDB 版本还是 CSV 版本、用了哪几条记录、成对通道如何取、污染区间用触发沿还是加速度划定。这四项直接决定结果能否被别人复现。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 由 AI 辅助撰写,结构与事实由编辑核对 |
| 数字来源 | 规模、结构、边界三类数字来自官方项目页、文件树、头文件与已发表论文 |
| 文件核验 | RECORDS、ANNOTATORS、32 个头文件、文件清单均经直接访问确认 |
| 论文信息 | 已读 2012 年论文全文(PDF),2013 年论文仅据官方参考文献著录 |
| 不一致说明 | ANNOTATORS 与正文对 R/F 的描述相反,已在 §5.5 标出 |
| 未核验内容 | 各记录的扰动次数与逐条伪影占比;CSV 包内部的列对齐细节;第 24 条 EEG 记录的去向 |
| 图像 | 无配图;封面为生成式提示词,不含真实信号波形 |
| 免责 | 不构成临床建议;使用须遵守 ODC-By 1.0 的署名条款 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是一个大型脑电数据集」 | 23 条 EEG、9 条 fNIRS,合计 32 条 | RECORDS 共 32 行 |
| 「它是 MRI 运动伪影数据」 | 是 fNIRS 与 EEG 的时间序列,与脑 MRI 无关 | 项目页摘要与通道名 |
| 「每条记录都有完整的伪影区间标注」 | EEG 记录的触发只有起止两个沿 | eeg_1.trigger 仅 66 字节 |
| 「加速度能直接换算成 g」 | 增益写作 1000/nd,无标定系数 |
eeg_1.hea 第 4 行起 |
| 「fNIRS 是 25 Hz 采的,所以只有 25 Hz 信息」 | 落盘为 200 Hz,但原始确为 25 Hz | 项目页脚注与头文件 |
| 「采样率 2048 Hz 意味着加速度也有高频」 | 加速度原为 200 Hz,上采样得到 | 项目页说明 |
| 「它是训练集」 | 32 条、十几人,训练必然过拟合 | 记录与被试规模 |
| 「论文里的相关系数可以直接引用到这份数据」 | 论文用的是筛选后子集,发布的是另一子集 | 论文筛选阈值 0.65 |
「F 是伪影结束」 |
正文说 F 是污染区间起点 |
项目页 Data Description |
| 「两个 CSV 包可以直接拼成一张宽表」 | 各列采样率不同,需先对齐 | 项目页列说明 |
FAQ
Q1:它到底有多少条记录,为什么有人说 32 条有人说 23 条?
32 条是全部记录,其中 23 条是 EEG(eeg_1 到 eeg_23),9 条是 fNIRS(fnirs_1 到 fnirs_9)。说 23 条的人通常只数了 EEG 那一半,因为说明文字里先讲 EEG。两类的采样率、通道数、触发语义都不同,处理代码不能混用。
Q2:为什么叫“运动伪差”,伪影是怎么造出来的?
不是被试自己动,是实验者每隔两分钟伸手拉一下其中一只探头的线缆,持续 10 到 25 秒。这样伪影的起点、终点、时长都由实验者控制,另一只探头保持不动,充当参考。所以这里的“运动”指探头与皮肤的相对位移,不是整个人在走动。
Q3:两条通道真的看到同一片皮层吗?
fNIRS 侧,光源与两只探测器的间距都是 30 毫米,两只探测器彼此相距约 20 毫米,测量体积中心相距约 10 毫米,重叠度很高。EEG 侧,两个电极固定在电极帽的相邻位置,间距由帽体固定为 20 毫米。重叠是设计的核心,但它只是“高度相关”,不是“完全相同”,论文给的干净期相关 0.77 与 0.83 就是重叠度的量化。
Q4:能用它训练去噪模型吗?
能训,但不建议当主力。32 条记录、十几名被试,任何带参数的模型都会记住个体特征。如果一定要训,至少按被试划分,并且只用它做微调或做域适应,主训练集另找。更常见的用法是把它留作测试集,专门检验方法在真实伪影上的表现。
Q5:EEG 记录没有伪影区间标注,怎么办?
两条路。第一条用加速度:被扰动那只的三轴合加速度在扰动期明显抬升,取滑动标准差加阈值即可划出区间,这是最稳的做法。第二条用信号本身的突变:在两条通道的差上做滑窗方差,突变处就是扰动起点。两条路都要用另一只加速度计做交叉验证,确认不是两只一起动了。
Q6:为什么文件时长是 480 或 540 秒,而论文说 9 分钟?
540 秒正好九分钟,与论文口径吻合;480 秒那一批短了一分钟。官方只说明裁掉了触发沿之外的头部与尾部,按这个说明能解释前一种,解释不了后一种——要么那几次实验本身只有八分钟,要么裁剪范围更大,公开材料没写。实际做法是按头文件的采样点数算时长,不要按论文的“9 分钟”去推,否则采样点位置会整体错位。
Q7:ANNOTATORS 和正文说法相反,该信哪个?
信正文,也就是 F 是触发下降沿、对应污染区间起点,R 是上升沿、对应终点。理由是这与触发信号的物理设计一致:污染时信号被拉低,干净时回升。但不要只信文字,取一条记录把注释点画到加速度通道上,一眼就能确认。这类文件级说明与正文冲突的情况,在老旧数据集里并不少见。
Q8:许可允许商用吗?
ODC-By 1.0 允许商用,条件是署名。署名至少要包含数据集名称、版本号、PhysioNet 来源,以及原始方法论文。若二次分发,建议保留 SHA256SUMS.txt 与许可说明,方便下游核对版本。
术语表
| 术语 | 解释 |
|---|---|
| fNIRS | 功能性近红外光谱,用近红外光测皮层血流动力学变化 |
| 光极 | 贴在头皮上的光源或探测器,fNIRS 的探头 |
| 690 / 830 纳米 | 两个常用波长,分别对应脱氧与氧合血红蛋白的吸收差异 |
| 通道 | 一路独立的测量信号,本库中生理、触发、加速度都算通道 |
| 运动伪差 | 探头与皮肤相对位移造成的信号畸变 |
| 干净期 | 未被扰动的时段,本库中由未受扰动那只探头定义 |
| 保真度 | 处理后信号与参考信号的接近程度,常用相关系数衡量 |
| 触发信号 | 软件生成的方波,用来标记实验起止与污染区间 |
| 上升沿 / 下降沿 | 触发信号由低到高或由高到低的跳变点 |
| WFDB | PhysioNet 的波形数据格式,含头文件、信号、注释 |
.hea |
纯文本头文件,声明采样率、通道、增益 |
.dat |
二进制信号文件,通道交错存放 |
.trigger |
WFDB 注释文件,存放触发沿位置 |
| 注释符号 | 注释文件中标记事件类型的单字符,本库用 R 与 F |
| 增益 | 每个物理单位对应的整数刻度,形如 1000/mV |
nd |
无量纲,表示该通道没有给出物理单位 |
| 重采样 | 改变采样率,本库用于统一生理与加速度的时间轴 |
| 配对设计 | 同一时刻采集两路可比信号,一路受扰一路不受 |
| ODC-By | 开放数据共享署名许可,允许商用需署名 |
| DOI | 数字对象标识符,本库为 10.13026/C2988P |
附录 A:核心数字核对表
| 数字 | 出处 |
|---|---|
| 32 条记录 | RECORDS 共 32 行;项目页文件树 |
| 23 条 EEG | 记录名 eeg_1 至 eeg_23 |
| 9 条 fNIRS | 记录名 fnirs_1 至 fnirs_9 |
| 101 个文件 | 项目页文件树逐行计数 |
| 96 个记录文件 | 32 条 × 3 个同名文件 |
| 649.9 MB 解压体积 | 项目页 Files 区域 |
| 145.4 MB / 13.9 MB | 两个 CSV 压缩包体积 |
| 10 路 / 12 路 | eeg_1.hea 与 fnirs_1.hea 第 1 行 |
| 2048 Hz / 200 Hz | 同上 |
| 1106064 / 108006 点 | 同上,折合 540 秒 |
| 480 秒 | 如 eeg_2 的 983143 点除以 2048 |
| 16 位整数 | 头文件信号行第 2 字段 |
1000/mV 与 1000/nd |
头文件信号行第 3 字段 |
| 58–74 字节 | .trigger 文件体积区间 |
| 10 人 / 6 人 | 2012 年论文实验协议一节 |
| 29 岁 / 27 岁 | 同上,两批被试平均年龄 |
| 10–25 秒 | 同上,每次扰动时长 |
| 0.77 / 0.58 / 0.83 / 0.40 | 同上,通道间相关系数 |
| 19.75% / 15.74% | 同上,伪影占整段比例 |
| 0.65 | 同上,fNIRS 干净期相关的筛选阈值 |
| ODC-By 1.0 | 项目页 License 区域 |
| 10.13026/C2988P | 项目页 DOI 区域 |
| 2014-03-03 | 项目页发布日期 |
| 2019-02-20 | SHA256SUMS.txt 修改时间 |
附录 B:数字的来源分层
第一层是官方项目页与文件树。记录数、文件数、体积、采样率、通道数、许可、DOI、日期,都出自这里。这一层的数字可以直接引用,因为它们既在说明文字里,也在可下载的文件里,能够互相印证。
第二层是头文件。单条记录的确切点数、增益写法、通道名、初始值、校验和,只能从头文件读。项目页说的“2048 Hz”“200 Hz”是概括,逐条核实时仍要看头文件,因为记录之间点数并不相同。
第三层是论文。被试人数、年龄、扰动时长、相关系数、筛选阈值,都来自 2012 年的论文。它们不是官方页面数字,引用时必须注明是论文口径,并且要说明论文用的是筛选后子集。
第四层是未核验。逐条记录的扰动次数、CSV 包内部的列对齐方式、第 24 条 EEG 记录为何未发布,这三项在公开材料里没有明确答案,正文中凡涉及处都只做定性表述。
附录 C:参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | Motion Artifact Contaminated fNIRS and EEG Data v1.0.0 | https://physionet.org/content/motion-artifact/1.0.0/ | 全部规模、结构与许可数据 |
| 2 | 该项目文件目录 | https://physionet.org/files/motion-artifact/1.0.0/ | 文件清单、头文件、注释说明 |
| 3 | Sweeney KT 等,2012,IEEE TITB 16(5):918–926 | https://doi.org/10.1109/TITB.2012.2207400 | 实验协议、相关系数、筛选阈值 |
| 4 | Sweeney KT 等,2013,IEEE TBME 60(1):97–105 | 官方参考文献第二条 | 后续方法与同一批数据的二次使用 |
| 5 | PhysioNet 平台综述,2026,Nature Health | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
| 6 | ODC-By 1.0 许可全文 | https://opendatacommons.org/licenses/by/1-0/ | 署名与商用条款 |
附录 D:一段可复现的成对实验
下面这段代码把“造仿真”与“用真实伪影”放在一起比较,是这个库最典型的用法。它只用一条记录,跑完就能看出两种评测口径的差距。
import wfdb
import numpy as np
rec = wfdb.rdrecord('eeg_1', pn_dir='motion-artifact')
fs = rec.fs
x1, x2 = rec.p_signal[:, 0], rec.p_signal[:, 1]
acc2 = rec.p_signal[:, 6:9]
mag = np.linalg.norm(acc2, axis=1)
win = int(2 * fs)
sd = np.convolve(mag, np.ones(win) / win, mode='same')
thr = np.percentile(sd, 90)
dirty = sd > thr
#-- 伪影段取中位数,作为“人造伪影”的模板
seg = x2[dirty]
template = np.median(seg) - np.median(x2[~dirty])
#-- 口径一:在干净段上人为叠加阶跃
y_sim = x1.copy()
y_sim[dirty] += template
#-- 口径二:真实受扰段
y_real = x2.copy()
#-- 用同一把尺量:与参考通道的相关系数
def r(a, b, m):
return np.corrcoef(a[m], b[m])[0, 1]
print('干净段 ', r(x2, x1, ~dirty))
print('仿真伪影', r(y_sim, x1, dirty))
print('真实伪影', r(y_real, x1, dirty))
三个数字的读法:第一个是保真度上界,第二个说明人造阶跃把相关拉到什么程度,第三个说明真实伪影把相关拉到什么程度。若后两者相差很远,就说明人造阶跃只改变了幅度基准,而真实伪影把两条通道的关系整体打乱了——这正是“仿真评测会高估算法”的量化入口。差异有多大,取决于这条记录被扰动的那几次有多剧烈,逐条跑一遍比看一个数更有意义。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 32 条记录:23 条 EEG、9 条 fNIRS | 决定你能做多大规模的实验 |
| 2 | 一净一污的配对设计 | 这是它唯一不可替代的地方 |
| 3 | EEG 触发没有区间标注 | 不处理这一点,分段评测就无从谈起 |
| 4 | 加速度无量纲、fNIRS 已上采样 | 两个直接影响数值解释的坑 |
| 5 | 论文系数不等于发布数据的系数 | 引用时必须说明子集口径 |
编辑说明
本篇的核对时间为 2026 年 10 月 28 日。核对方式为直接访问项目页与文件树,逐一确认 RECORDS、ANNOTATORS、32 个头文件、.trigger 文件体积与两个 CSV 包的存在与体积;论文侧下载并通读了 2012 年的 PDF 全文。发现的主要不一致有两处:ANNOTATORS 对 R/F 的括注与正文相反;论文的 fNIRS 16 次、EEG 24 次与发布的 9 条、23 条不是同一批子集。未覆盖的内容包括逐条记录的扰动次数、CSV 包内部的列对齐细节、以及缺失那一条 EEG 记录的去向,这些在正文相应位置都做了限定表述。全文数字只收规模、结构、边界三类,未对下载数据做任何分布性统计。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- mr-art · 共享标签:生理信号 / 伪影去除 / 配对采集
- realnoisemri · 共享标签:伪影去除 / 运动退化 / 挑战赛数据集
- macecgdb · 共享标签:生理信号 / 运动伪迹 / 波形
- mental-fnirs · 共享标签:近红外光谱 / 生理信号
- stroke-eeg-fnirs · 共享标签:近红外光谱 / 脑电信号 / 多模态
- tuev · 共享标签:脑电信号 / 人工标注
- tuab · 共享标签:脑电信号 / 临床语料
- chb-mit-scalp-eeg · 共享标签:脑电信号 / 长程记录
- scientisst-move · 共享标签:可穿戴 / 多模态 / 运动
- accelerometry-walk-climb-drive · 共享标签:加速度 / 时序信号
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

