Fraunhofer goVISCAN:多光谱非接触生命体征感知新方案

从 1.3 米外同时检测心率、呼吸、血氧——座舱健康监测的新路径

技术信息

核心技术

goVISCAN 传感器规格

参数 规格
尺寸 10 × 7.5 × 2.5 cm
测量距离 70 cm – 1.3 m
检测项 心率、呼吸频率、血氧饱和度 (SpO2)
核心技术 多光谱相机(9个微透镜)
光源 LED 集成照明单元
抗干扰 对环境光和运动鲁棒
测试状态 实验室验证(12人),待临床测试

多光谱成像原理

工作原理

goVISCAN 基于**光电容积脉搏波(PPG)**原理,但从多光谱维度增强:

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
"""
Fraunhofer goVISCAN 多光谱生命体征检测原理

核心原理:
1. 血液每次搏动引起皮肤微小颜色变化(人眼不可见)
2. 多光谱相机在蓝光到近红外多个波段同时采集
3. 9个微透镜各自对应不同光谱范围
4. 多通道分离提取心率、呼吸、血氧

对比传统 rPPG:
- 传统 rPPG: 单波长(绿光)→ 只能提取心率
- goVISCAN: 多波长 → 心率+呼吸+血氧
"""

import numpy as np
from typing import Tuple


class MultiSpectralVitalSigns:
"""
多光谱生命体征提取器

模拟 goVISCAN 的多通道 PPG 处理
"""

# 9个微透镜对应的波长 (nm)
WAVELENGTHS = [
430, # 蓝光 - 血红蛋白吸收峰
470, # 蓝光
500, # 青光
530, # 绿光 - rPPG 传统波长
560, # 绿光
590, # 黄光
660, # 红光 - SpO2 计算波长1
730, # 深红
940, # 近红外 - SpO2 计算波长2
]

def __init__(self, num_wavelengths=9):
self.num_wavelengths = num_wavelengths

def extract_heart_rate(self, multi_spec_signal: np.ndarray,
fps: int = 30) -> float:
"""
从多光谱信号提取心率

多波长融合 PPG:
1. 每个波长通道都有 PPG 信号
2. 不同波长对不同肤色/光照有不同灵敏度
3. 融合多波长提高鲁棒性

Args:
multi_spec_signal: shape=(num_wavelengths, time_steps)
fps: 采样率

Returns:
heart_rate: 心率 (次/分)
"""
# 归一化每个通道
normalized = np.zeros_like(multi_spec_signal)
for i in range(self.num_wavelengths):
channel = multi_spec_signal[i]
normalized[i] = (channel - np.mean(channel)) / \
(np.std(channel) + 1e-8)

# 加权融合(绿光波段权重最高)
weights = np.array([
0.3, 0.5, 0.7, 1.0, 1.0, 0.8, 0.6, 0.5, 0.4
])
fused = np.average(normalized, axis=0, weights=weights)

# 带通滤波 0.8-3.0 Hz (48-180 bpm)
from scipy.signal import butter, filtfilt
b, a = butter(4, [0.8, 3.0], btype='band', fs=fps)
filtered = filtfilt(b, a, fused)

# FFT 找主频
freqs = np.fft.rfftfreq(len(filtered), 1/fps)
spectrum = np.abs(np.fft.rfft(filtered))
dominant_idx = np.argmax(spectrum[1:]) + 1
heart_rate = freqs[dominant_idx] * 60

return heart_rate

def extract_respiratory_rate(self, multi_spec_signal: np.ndarray,
fps: int = 30) -> float:
"""
从多光谱信号提取呼吸频率

呼吸引起的皮肤色调变化频率更低(0.1-0.5 Hz)
"""
# 低频成分提取
from scipy.signal import butter, filtfilt
b, a = butter(4, [0.1, 0.5], btype='band', fs=fps)

# 融合
fused = np.mean(multi_spec_signal, axis=0)
filtered = filtfilt(b, a, fused)

freqs = np.fft.rfftfreq(len(filtered), 1/fps)
spectrum = np.abs(np.fft.rfft(filtered))
dominant_idx = np.argmax(spectrum[1:]) + 1
resp_rate = freqs[dominant_idx] * 60

return resp_rate

def extract_spo2(self, multi_spec_signal: np.ndarray) -> float:
"""
从多光谱信号计算血氧饱和度

使用红光 (660nm) 和近红外 (940nm) 的比值
SpO2 = f(R/IR ratio)

标准公式:
SpO2 = 110 - 25 * (AC_red/DC_red) / (AC_ir/DC_ir)
"""
# 红光通道 (660nm, index 6)
red_channel = multi_spec_signal[6]
# 近红外通道 (940nm, index 8)
ir_channel = multi_spec_signal[8]

# AC 分量(脉动)
red_ac = np.std(red_channel)
ir_ac = np.std(ir_channel)

# DC 分量(基线)
red_dc = np.mean(red_channel)
ir_dc = np.mean(ir_channel)

# 比值
ratio = (red_ac / red_dc) / (ir_ac / ir_dc + 1e-8)

# 经验公式
spo2 = 110 - 25 * ratio

return np.clip(spo2, 70, 100)

def anti_motion_artifact(self, multi_spec_signal: np.ndarray) -> np.ndarray:
"""
运动伪影消除

goVISCAN 的核心优势:
9个微透镜同时采集,可区分运动伪影和真实PPG
真实PPG在所有波长上同步变化
运动伪影在不同波长上变化不同
"""
# 计算各通道间的相关性
corr_matrix = np.corrcoef(multi_spec_signal)

# 使用 PCA 提取主要成分(真实PPG)
# 运动伪影在次要成分中
from numpy.linalg import svd
U, S, Vt = svd(multi_spec_signal, full_matrices=False)

# 第一主成分通常是真实PPG
clean_signal = U[:, 0:1] @ np.diag(S[0:1]) @ Vt[0:1, :]

# 添加次要成分的部分(保留部分信息)
clean_signal += 0.3 * U[:, 1:2] @ np.diag(S[1:2]) @ Vt[1:2, :]

return clean_signal


# ========== 模拟测试 ==========

if __name__ == "__main__":
np.random.seed(42)
extractor = MultiSpectralVitalSigns()

# 模拟多光谱信号
duration = 30 # 30秒
fps = 30
num_frames = duration * fps
t = np.linspace(0, duration, num_frames)

# 真实参数
true_hr = 72 # 心率 72 bpm = 1.2 Hz
true_rr = 16 # 呼吸 16 bpm = 0.267 Hz
true_spo2 = 97 # 血氧 97%

# 生成9通道信号
multi_signal = np.zeros((9, num_frames))
for i in range(9):
# PPG 信号(各波长幅度不同)
ppg = np.sin(2*np.pi*true_hr/60 * t) * (0.5 + 0.5*np.random.rand())
# 呼吸调制
resp = np.sin(2*np.pi*true_rr/60 * t) * 0.2
# 运动伪影
motion = 0.3 * np.sin(2*np.pi*0.7*t + np.random.rand()*2*np.pi)
# 噪声
noise = 0.1 * np.random.randn(num_frames)

multi_signal[i] = ppg + resp + motion + noise

# 提取生命体征
hr = extractor.extract_heart_rate(multi_signal, fps)
rr = extractor.extract_respiratory_rate(multi_signal, fps)
spo2 = extractor.extract_spo2(multi_signal)

print("=== goVISCAN 多光谱生命体征检测 ===")
print(f" 真实心率: {true_hr} bpm, 检测: {hr:.1f} bpm, "
f"误差: {abs(hr-true_hr):.1f}")
print(f" 真实呼吸: {true_rr} bpm, 检测: {rr:.1f} bpm, "
f"误差: {abs(rr-true_rr):.1f}")
print(f" 真实血氧: {true_spo2}%, 检测: {spo2:.1f}%")

# 对比 goVISCAN 实验室精度
print(f"\n=== goVISCAN 实验室精度(论文报告)===")
print(f" 心率误差: 2.8 beats/min")
print(f" 呼吸误差: 1.3 breaths/min")
print(f" 血氧误差: 3.8 percentage points")

实验室精度对比

指标 goVISCAN 误差 医疗级脉搏血氧仪 差距
心率 2.8 bpm ±2 bpm 接近
呼吸 1.3 bpm ±2 bpm 达标
血氧 3.8 pp ±2% ⚠️ 尚未达标

对比现有技术

goVISCAN vs rPPG vs 雷达

技术 心率 呼吸 血氧 距离 抗运动 成本
goVISCAN ✅ 2.8bpm ✅ 1.3bpm ⚠️ 3.8pp 1.3m ✅ 强 中
传统 rPPG ✅ 3-5bpm ⚠️ 弱 ❌ 0.5-1m ⚠️ 弱 低
60GHz 雷达 ⚠️ 弱 ✅ 精确 ❌ 1-2m ✅ 强 中
120GHz 雷达 ✅ 较好 ✅ 精确 ❌ 0.5-1m ✅ 强 中
接触式脉搏 ✅ 精确 ❌ ✅ 精确 接触 - 低

goVISCAN 的独特价值

唯一能从远处非接触检测血氧 (SpO2) 的方案。 这是雷达和传统 rPPG 都做不到的。

座舱应用场景

1. 健康座舱

2. 疲劳检测增强

传统疲劳检测依赖 PERCLOS(闭眼比例)。goVISCAN 可补充生理指标:

指标 疲劳时变化 检测方式
心率变异性 (HRV) 降低 goVISCAN
血氧 轻微下降 goVISCAN
呼吸频率 变慢 goVISCAN/雷达
PERCLOS 升高 摄像头
眨眼频率 变化 摄像头

3. 突发疾病检测

疾病 可检测指标 检测方案
心脏病发作 心率骤变/异常 goVISCAN 心率
呼吸障碍 呼吸骤停 goVISCAN 呼吸
低氧血症 SpO2 < 90% goVISCAN 血氧
中暑 体温+心率 goVISCAN+热成像

对 IMS 开发的启示

1. 多光谱传感器选型

goVISCAN 使用9通道多光谱,但座舱可以简化:

通道数 波长 功能 必要性
1 530nm (绿光) 心率 ✅ 基础
2 +660nm (红光) 心率+SpO2 ✅ 推荐
3 +940nm (近红外) 心率+SpO2 ✅ 推荐
4 +480nm (蓝光) 增强 ⚠️ 可选

推荐配置: 3通道(绿+红+近红外)即可实现心率+SpO2。

2. 与现有 DMS 融合

3. 部署挑战

挑战 现状 解决方案
尺寸 10×7.5×2.5 cm 需小型化到 5×3×1 cm
距离 1.3m 座舱内足够
成本 研究级 需降低到 <$50
环境光 集成LED 需适应车内光照
运动鲁棒性 实验室验证 需道路测试
临床认证 未完成 非医疗用途不需

4. 演进路线建议

阶段 时间 目标 技术方案
Phase 1 0-6月 rPPG 心率 DMS 摄像头 + 绿光 PPG
Phase 2 6-12月 多通道 PPG RGB-IR 摄像头 + 红光/近红外
Phase 3 12-24月 多光谱 SpO2 goVISCAN 方案评估
Phase 4 24月+ 健康座舱 多光谱 + 雷达 + AI

结论

Fraunhofer goVISCAN 代表了多光谱非接触生命体征检测的前沿。其独特价值在于从1.3米外同时检测心率、呼吸和血氧——这是传统 rPPG 和雷达都做不到的。

虽然目前还是实验室阶段,但技术路径清晰。对 IMS 开发而言,从 rPPG 心率起步,逐步扩展到多通道 SpO2 检测,是座舱健康监测的可行演进路线。

goVISCAN 的9微透镜多光谱架构为未来座舱健康传感器提供了设计参考——不需要接触、不需要额外硬件、只需要一个多功能传感器。


参考链接: