可穿戴fNIRS脑监测贴片:实时认知疲劳检测走出实验室

论文信息

  • 标题: Wearable Wireless Functional Near Infrared Spectroscopy System for Cognitive Activity Monitoring
  • 作者: Mauro Victorio, James Dieffenderfer, Tanner Songkakul, Josh Willeke, Alper Bozkurt, Vladimir A. Pozdin
  • 机构: Florida International University, North Carolina State University, Rose-Hulman Institute of Technology
  • 期刊: Biosensors, 2025, 15(2), 92
  • DOI: 10.20944/preprints202501.1283.v1
  • 关键词: fNIRS, wearable, cognitive fatigue, prefrontal cortex, hemodynamic

核心创新

首次实现创可贴大小的无线fNIRS脑监测设备,可在自然环境下实时检测前额叶皮层(PFC)血氧变化,追踪认知疲劳的动态发展过程。设备尺寸约一枚硬币大小,蓝牙传输,续航可达数小时,信号质量可与传统台式NIRS设备媲美。

1. 问题定义

1.1 认知疲劳检测为什么难

检测手段 信号类型 局限性 车载适用性
EEG 脑电波 需电极接触头皮、运动伪影大 差(驾驶员佩戴困难)
fMRI 血氧水平依赖 设备庞大、成本极高 不可用
台式fNIRS 脑血氧变化 需光纤连接、体积大 不可用
摄像头视觉 面部特征/眼动 间接信号、无法直击认知状态 好(但非直接认知检测)
可穿戴fNIRS 脑血氧变化 需贴片+蓝牙 中-好(可集成到头戴设备)

1.2 认知疲劳 vs 视觉疲劳

认知疲劳(cognitive fatigue)是Euro NCAP 2026及Vision 2030路线图中最难突破的检测维度。视觉疲劳可通过PERCLOS量化,但认知疲劳——即大脑在持续注意力消耗后的”电量下降”——目前缺乏车载可用的直接生理标志物。

fNIRS通过监测前额叶皮层的血氧变化,提供了认知疲劳的直接生理窗口。

2. 方法详解

2.1 设备架构

2.2 光学设计

组件 参数 设计考量
LED波长 760nm + 850nm 分别测量oxy-Hb和deoxy-Hb
光源数量 4个LED 覆盖PFC区域
探测器 4个光电二极管 多距离测量
源-探测器距离 8mm, 12mm, 15mm 不同深度穿透
采样率 10 Hz 满足血流动力学响应频率
光学耦合 PDMS透镜 提高皮肤入射光效率
环境光屏蔽 3D打印柔性遮光罩 防止外部光干扰
生物兼容 Parylene-C涂层 皮肤安全接触

2.3 信号处理链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
"""
可穿戴fNIRS认知疲劳检测信号处理框架

复现论文核心信号处理流程 + 扩展车载应用

依赖: numpy>=1.24, scipy>=1.11, pywt>=1.5
"""

import numpy as np
from scipy.signal import butter, filtfilt, detrend
from scipy.stats import pearsonr
import pywt
from typing import Tuple, Dict


class WearableFNIRSProcessor:
"""
可穿戴fNIRS信号处理器

核心功能:
1. 原始光强 → 血氧变化(Modified Beer-Lambert Law)
2. 运动伪影去除(小波域滤波)
3. 认知疲劳指标提取(VLF漂移 + oxy-Hb趋势)
4. 实时分类(正常/轻度疲劳/重度疲劳)
"""

def __init__(self, config: dict):
# 光学参数
self.wavelengths = config.get('wavelengths', [760, 850]) # nm
self.dpf = config.get('dpf', 6.0) # 差分光程因子
self.source_detector_dist = config.get('distance', 0.015) # 15mm

# 滤波参数
self.low_cut = 0.01 # Hz, 0.01 Hz (VLF)
self.high_cut = 0.5 # Hz
self.fs = config.get('sampling_rate', 10) # Hz

# 疲劳指标参数
self.window_sec = config.get('window_sec', 60) # 60秒滑动窗口
self.fatigue_threshold = config.get('fatigue_threshold', 0.3)

def raw_to_hb(
self,
raw_760: np.ndarray,
raw_850: np.ndarray
) -> Dict[str, np.ndarray]:
"""
将原始光强转换为血氧浓度变化

基于Modified Beer-Lambert Law (MBLL)

Args:
raw_760: 760nm波长光强序列
raw_850: 850nm波长光强序列

Returns:
dict: oxy_Hb, deoxy_Hb, total_Hb 变化量 (ΔμM)
"""
# 光密度变化
od_760 = -np.log10(raw_760 / np.mean(raw_760[:100]))
od_850 = -np.log10(raw_850 / np.mean(raw_850[:100]))

# 消光系数 (cm^-1 / M)
# 760nm: oxy=0.484, deoxy=1.492
# 850nm: oxy=1.026, deoxy=0.555
eps_760 = np.array([0.484, 1.492])
eps_850 = np.array([1.026, 0.555])

# MBLL矩阵
# ΔOD = ε * Δc * d * DPF
d = self.source_detector_dist * 100 # 转cm
DPF = self.dpf

# 线性方程组求解
# [ΔOD_760] [ε_760_oxy ε_760_deoxy] [Δc_oxy]
# [ΔOD_850] = [ε_850_oxy ε_850_deoxy] [Δc_deoxy] * d * DPF
eps_matrix = np.array([
[eps_760[0], eps_760[1]],
[eps_850[0], eps_850[1]]
])

# 解线性方程
od_vector = np.array([od_760, od_850]) # (2, N)
delta_c = np.linalg.solve(
eps_matrix * d * DPF,
od_vector
)

return {
'oxy_Hb': delta_c[0],
'deoxy_Hb': delta_c[1],
'total_Hb': delta_c[0] + delta_c[1]
}

def remove_motion_artifact(
self,
signal: np.ndarray,
wavelet: str = 'db4',
threshold: float = 2.0
) -> np.ndarray:
"""
基于小波变换的运动伪影去除

论文方法:高频小波系数阈值化
"""
# 小波分解
coeffs = pywt.wavedec(signal, wavelet, level=6)

# 阈值化高频系数(去运动伪影)
for i in range(1, len(coeffs)):
sigma = np.std(coeffs[i])
adaptive_threshold = threshold * sigma
coeffs[i] = pywt.threshold(
coeffs[i],
adaptive_threshold,
mode='soft'
)

# 重建信号
cleaned = pywt.waverec(coeffs, wavelet)
return cleaned[:len(signal)]

def bandpass_filter(self, signal: np.ndarray) -> np.ndarray:
"""
带通滤波 0.01-0.5 Hz

保留血流动力学响应频段
去除心跳(~1Hz)和呼吸(~0.2Hz)干扰
"""
nyquist = self.fs / 2
low = self.low_cut / nyquist
high = self.high_cut / nyquist

b, a = butter(4, [low, high], btype='band')
return filtfilt(b, a, signal)

def extract_fatigue_features(
self,
oxy_hb: np.ndarray,
window_sec: int = 60
) -> Dict[str, float]:
"""
提取认知疲劳特征

论文发现:
- VLF (<0.02Hz) 漂移与疲劳发展相关
- oxy-Hb 在高认知负荷下先升后降
- 疲劳期VLF漂移持续到休息阶段

Returns:
dict: 疲劳相关特征
"""
window_samples = int(window_sec * self.fs)
features = {}

# 1. VLF漂移 (< 0.02 Hz)
vlf_signal = self._vlf_filter(oxy_hb)
features['vlf_drift'] = np.mean(vlf_signal[-window_samples:])
features['vlf_slope'] = np.polyfit(
np.arange(window_samples),
vlf_signal[-window_samples:], 1
)[0]

# 2. oxy-Hb均值变化
features['oxy_mean'] = np.mean(oxy_hb[-window_samples:])
features['oxy_std'] = np.std(oxy_hb[-window_samples:])

# 3. 氧合指数 (oxy_Hb / total_Hb)
total = np.abs(oxy_hb[-window_samples:]).sum() + 1e-6
features['oxygenation_index'] = np.mean(oxy_hb[-window_samples:]) / total

# 4. 认知负荷波动
features['oxy_range'] = np.ptp(oxy_hb[-window_samples:])

return features

def _vlf_filter(self, signal: np.ndarray) -> np.ndarray:
"""超低频滤波 (< 0.02 Hz)"""
nyquist = self.fs / 2
low = 0.002 / nyquist
high = 0.02 / nyquist
b, a = butter(2, [low, high], btype='band')
return filtfilt(b, a, signal)

def classify_fatigue(
self,
features: Dict[str, float]
) -> Tuple[str, float]:
"""
认知疲劳分类

基于论文发现:
- VLF漂移方向和幅度区分疲劳程度
- oxy-Hb从上升转为下降标志疲劳临界点

Returns:
level: "alert" / "mild_fatigue" / "severe_fatigue"
confidence: 0-1
"""
vlf = features['vlf_drift']
slope = features['vlf_slope']

# 简化分类逻辑(实际应使用训练好的ML模型)
if slope > 0.001 and vlf > 0:
return "alert", 0.8
elif -0.005 < slope <= 0.001:
return "mild_fatigue", 0.7
else:
return "severe_fatigue", 0.75

def process_stream(
self,
raw_760: np.ndarray,
raw_850: np.ndarray
) -> Dict:
"""
完整信号处理管线

输入: 原始双波长光强序列
输出: 疲劳评估结果
"""
# 1. 原始→血氧
hb = self.raw_to_hb(raw_760, raw_850)

# 2. 运动伪影去除
oxy_clean = self.remove_motion_artifact(hb['oxy_Hb'])

# 3. 带通滤波
oxy_filtered = self.bandpass_filter(oxy_clean)

# 4. 特征提取
features = self.extract_fatigue_features(oxy_filtered)

# 5. 分类
level, confidence = self.classify_fatigue(features)

return {
'fatigue_level': level,
'confidence': confidence,
'features': features,
'oxy_hb_filtered': oxy_filtered
}


# 测试
if __name__ == "__main__":
# 模拟fNIRS数据
fs = 10 # 10 Hz
duration = 300 # 5分钟
t = np.arange(0, duration, 1/fs)

# 模拟正常状态→认知负荷→疲劳的血氧变化
# 正常阶段 (0-120s): 稳定波动
normal = 0.1 * np.sin(2 * np.pi * 0.05 * t[:120*fs])

# 认知负荷阶段 (120-240s): oxy-Hb上升
load = 0.3 * np.sin(2 * np.pi * 0.05 * t[120*fs:240*fs]) + 0.5 * np.linspace(0, 1, 120*fs)

# 疲劳阶段 (240-300s): oxy-Hb下降 + VLF漂移
fatigue = -0.2 * np.sin(2 * np.pi * 0.05 * t[240*fs:]) + np.linspace(0.5, -0.3, 60*fs)

oxy_hb_true = np.concatenate([normal, load, fatigue])

# 添加噪声和运动伪影
noise = np.random.normal(0, 0.05, len(t))
motion = np.zeros_like(t)
motion[150*fs:155*fs] = 2.0 # 突发运动伪影

raw_850 = 10**(-oxy_hb_true + noise + motion) * 1e-3
raw_760 = 10**(-0.5 * oxy_hb_true + noise + motion) * 1e-3

# 处理
processor = WearableFNIRSProcessor({'sampling_rate': fs})
result = processor.process_stream(raw_760, raw_850)

print(f"疲劳等级: {result['fatigue_level']}")
print(f"置信度: {result['confidence']:.2f}")
print(f"VLF漂移: {result['features']['vlf_drift']:.4f}")
print(f"VLF斜率: {result['features']['vlf_slope']:.6f}")

3. 实验验证

3.1 论文实验设计

实验类型 任务 持续时间 测量指标
动脉阻塞测试 袖带充气阻断血流 3分钟 oxy/deoxy-Hb下降与恢复
屏气测试 屏住呼吸 30秒 血氧变化响应
算术认知任务 连续减法运算 5分钟 PFC血氧动态
疲劳发展观察 持续高负荷计算 多轮 VLF漂移趋势

3.2 关键发现

  1. 认知负荷→疲劳转变可检测:部分被试在任务中途从oxy-Hb上升转为下降,标志认知疲劳发生
  2. VLF漂移是疲劳标志:疲劳期VLF(<0.02Hz)成分持续偏移,且延伸到休息期
  3. 实时性:变化无需后处理即可观察到,适合边缘计算
  4. 个体差异:不同被试血氧响应模式不同(升 vs 降),需个性化基线

4. IMS车载应用启示

4.1 集成方案

集成位置 实现方式 优势 挑战
驾驶员头戴 fNIRS贴片嵌入帽子/头带 直接PFC信号 驾驶员接受度
座椅头枕 头枕内嵌fNIRS传感器 无需佩戴 接触稳定性
后视镜集成 后视镜背面IR LED+探测器 隐蔽 距离较远,信号弱
方向盘 方向盘顶部fNIRS 近距离 需手握,额头距离不确定

4.2 与现有DMS融合

4.3 开发路线建议

阶段 任务 时间 产出
Phase 1 fNIRS信号采集验证 3个月 原型+驾驶员数据
Phase 2 认知疲劳分类模型训练 3个月 个性化疲劳模型
Phase 3 多模态融合(fNIRS+视觉) 6个月 融合算法+原型
Phase 4 车载集成测试 6个月 封装+实车验证

5. 与Neurable One的互补分析

维度 可穿戴fNIRS贴片 Neurable One EEG耳机
信号类型 脑血氧(血流动力学) 脑电波(神经电活动)
时间分辨率 ~1秒 毫秒级
空间分辨率 前额叶区域 颞叶(耳周)
认知指标 疲劳/负荷趋势 注意力/认知速度
佩戴方式 贴片(前额) 耳机(耳垫传感器)
成本 <$50(组件级) $499(消费级)
车载适用 头带/帽子集成 驾驶员耳机
互补价值 慢漂移疲劳趋势 快速注意力变化

建议: fNIRS适合检测”渐进性认知疲劳”,EEG适合检测”瞬时注意力下降”。两者融合可覆盖Euro NCAP要求的认知分心检测全频段。

6. 结论

可穿戴fNIRS从实验室走向消费级产品,为车载认知疲劳检测提供了第一个直接生理标志物。相比视觉间接指标(PERCLOS/眼动),fNIRS血氧变化是认知负荷的因果链上直接信号。

对IMS而言,这意味着认知分心——Euro NCAP 2026最难突破的模块——有了可检测的技术路径。建议在研发路线中增加fNIRS原型验证,与现有视觉DMS形成多模态融合。


参考来源: