分布式毫米波雷达生命体征感知:面向鲁棒座舱健康监控的多视角融合方案

单雷达监测心率/呼吸在人体转向侧面时精度骤降。京都大学团队用4个分布式雷达+生理信息多变量变分模态分解(MPVMD),实现任意朝向90%+成功率,16人多场景85%+。直接启示:车内多雷达部署实现360°无死角乘员健康监测。

论文信息

项目 内容
标题 Physiology-Informed Multivariate Variational Mode Decomposition for Orientation-Robust Sensing Using Distributed Millimeter-Wave Radar Systems
arXiv 2510.10542
机构 京都大学
参与者 6人(单雷达对比)+ 16人(多雷达)
雷达数 4台(分布式)
成功率 呼吸 90%+,心率 90%+(4雷达)
多人场景 16人,2雷达,85%+

核心创新

问题:单雷达视角依赖

人体朝向 呼吸检测 心率检测 原因
正面 (0°) ✅ 85% ✅ 78% 胸腹呼吸运动最大
侧面 (90°) ⚠️ 65% ❌ 45% 呼吸运动投影减小
背面 (180°) ⚠️ 60% ❌ 40% 被躯干遮挡

方案:分布式雷达+MPVMD

1
2
3
4台雷达(前/后/左/右)→ 多体表位移信号 →
MPVMD联合分解 → 提取公共呼吸/心率频率 →
谐波约束 + 间隙分量 → 鲁棒估计

MPVMD vs 传统VMD

维度 传统VMD MPVMD
输入 单通道位移 多通道位移
频率估计 独立估计 公共频率参数
谐波约束 无 呼吸+心率谐波
间隙分量 无 填充呼吸-心率间频段
视角鲁棒 弱 强
可解释 中 高(数学模型)

方法详解

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
"""
MPVMD: 多变量生理变分模态分解

论文核心:将多台雷达的多通道位移信号联合分解
- 公共频率:呼吸/心率在所有通道共享
- 谐波约束:呼吸谐波 + 心率谐波
- 间隙分量:填充呼吸和心率之间的噪声频段
"""

import numpy as np
from typing import Tuple, List

class MPVMD:
"""
多变量生理变分模态分解

输入:M个雷达通道的位移信号
输出:呼吸频率、心率频率、各通道的模态分量
"""

def __init__(
self,
num_radars: int = 4,
fs: float = 100, # 采样率 Hz
resp_range: Tuple[float, float] = (0.1, 0.5), # 呼吸频段 Hz
hr_range: Tuple[float, float] = (0.8, 3.0), # 心率频段 Hz
max_harmonics: int = 3,
max_iter: int = 500,
alpha: float = 2000, # 带宽约束
tol: float = 1e-6
):
self.M = num_radars
self.fs = fs
self.resp_range = resp_range
self.hr_range = hr_range
self.K = 2 * max_harmonics + 1 # 呼吸谐波+心率谐波+间隙
self.max_harmonics = max_harmonics
self.max_iter = max_iter
self.alpha = alpha
self.tol = tol

def decompose(self, signals: np.ndarray) -> dict:
"""
多通道信号联合分解

Args:
signals: (M, N) M个雷达通道,N个采样点

Returns:
result: 包含呼吸频率、心率、各模态
"""
M, N = signals.shape
assert M == self.M, f"期望{self.M}通道,得到{M}"

# 初始化
# 各通道的频域表示
S = np.fft.fft(signs, axis=1) # (M, N)

# 模态中心频率初始化
omega = np.zeros(self.K)
omega[0] = 0.2 # 呼吸基频
omega[1] = 0.4 # 呼吸2次谐波
omega[2] = 0.6 # 呼吸3次谐波
omega[3] = 1.5 # 心率基频
omega[4] = 3.0 # 心率2次谐波
if self.K > 5:
omega[5] = 4.5 # 心率3次谐波

# 间隙分量(呼吸-心率之间)
gap_freq = 0.7 # 间隙频率

# 迭代优化
u = np.zeros((self.M, self.K, N), dtype=complex)

for iter in range(self.max_iter):
# 更新各模态
for k in range(self.K):
# 当前模态在所有通道的公共频率
freq_k = omega[k]

for m in range(self.M):
# 排除当前模态
other_u = u[m].sum(axis=0) - u[m, k]
residual = S[m] - np.fft.fft(other_u)

# 带宽约束更新
freqs = np.fft.fftfreq(N, 1/self.fs)
weight = self.alpha / (alpha + (freqs - freq_k)**2)
u[m, k] = np.fft.ifft(weight * residual)

# 更新中心频率(公共参数)
for k in range(self.K):
power = np.zeros(N)
for m in range(self.M):
power += np.abs(np.fft.fft(u[m, k]))**2
omega[k] = freqs[np.argmax(power)]

# 收敛检查
if iter > 0 and np.max(np.abs(omega - omega_old)) < self.tol:
break
omega_old = omega.copy()

# 提取呼吸和心率
resp_freq = omega[0]
hr_freq = omega[3] if self.K > 3 else omega[-1]

return {
'resp_freq': resp_freq,
'resp_rate_bpm': resp_freq * 60,
'hr_freq': hr_freq,
'heart_rate_bpm': hr_freq * 60,
'modes': u,
'converged': iter < self.max_iter - 1,
'iterations': iter
}


# ============ 测试 ============
if __name__ == "__main__":
np.random.seed(42)

# 模拟4台雷达的多通道信号
fs = 100 # 100Hz
duration = 30 # 30秒
t = np.arange(fs * duration) / fs
N = len(t)

# 真实呼吸 0.25Hz (15次/分), 心率 1.2Hz (72bpm)
resp_freq_true = 0.25
hr_freq_true = 1.2

# 4个雷达通道(模拟不同视角的信噪比)
snr_channels = [1.0, 0.7, 0.5, 0.3] # 前方最佳,侧面递减

signals = np.zeros((4, N))
for m in range(4):
snr = snr_channels[m]
# 呼吸分量
resp = snr * np.sin(2 * np.pi * resp_freq_true * t)
# 心率分量
hr = snr * 0.3 * np.sin(2 * np.pi * hr_freq_true * t)
# 噪声
noise = np.random.randn(N) * 0.1
signals[m] = resp + hr + noise

# MPVMD 分解
mpvmd = MPVMD(num_radars=4, fs=fs)
result = mpvmd.decompose(signals)

print("=" * 60)
print("MPVMD 分布式雷达生命体征检测结果")
print("=" * 60)
print(f"真实呼吸频率: {resp_freq_true * 60:.1f} BPM")
print(f"估计呼吸频率: {result['resp_rate_bpm']:.1f} BPM")
print(f"误差: {abs(result['resp_rate_bpm'] - resp_freq_true * 60):.2f} BPM")
print()
print(f"真实心率: {hr_freq_true * 60:.1f} BPM")
print(f"估计心率: {result['heart_rate_bpm']:.1f} BPM")
print(f"误差: {abs(result['heart_rate_bpm'] - hr_freq_true * 60):.2f} BPM")
print(f"\n收敛: {result['converged']} (迭代{result['iterations']}次)")

# 单雷达对比
print("\n--- 单雷达对比 ---")
for m in range(4):
single_result = MPVMD(num_radars=1, fs=fs).decompose(signals[m:m+1])
print(f" 雷达{m+1} (SNR={snr_channels[m]}): "
f"呼吸={single_result['resp_rate_bpm']:.1f}, "
f"心率={single_result['heart_rate_bpm']:.1f}")

实验结果

4雷达 vs 单雷达

指标 单雷达(最佳) 单雷达(最差) 4雷达MPVMD 提升
呼吸成功率 85% 60% 90.3% +5.3pp
心率成功率 78% 40% 90.0% +12.0pp
呼吸误差 0.8 BPM 3.2 BPM 0.5 BPM -37.5%
心率误差 2.1 BPM 8.5 BPM 1.8 BPM -14.3%

多人场景(16人,2雷达)

指标 2雷达MPVMD 单雷达
呼吸成功率 87.5% 62.5%
心率成功率 85.0% 50.0%
人数 16 16

体朝向鲁棒性

朝向 单雷达呼吸 单雷达心率 4雷达呼吸 4雷达心率
正面 0° 85% 78% 95% 93%
45° 72% 55% 92% 90%
90° 65% 45% 90% 88%
135° 62% 42% 91% 89%
180° 60% 40% 90% 88%

IMS 开发启示

1. 车内分布式雷达部署方案

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
# 车内4雷达分布式部署
cabin_radar_config = {
"radars": {
"front": {
"position": "方向盘柱",
"direction": "驾驶员正面",
"primary": "呼吸+心率(最佳信号)"
},
"left": {
"position": "A柱左侧",
"direction": "驾驶员左侧",
"primary": "侧面呼吸+CPD"
},
"right": {
"position": "A柱右侧/后视镜",
"direction": "驾驶员右侧",
"primary": "右侧呼吸+乘员检测"
},
"rear": {
"position": "车顶后部",
"direction": "后排",
"primary": "后排CPD+呼吸"
}
},
"hardware": "TI AWRL6432 60GHz × 4台",
"cost": "$120/车(4×$30)",
"fusion": "MPVMD联合分解",
"advantage": "任意坐姿/朝向均可检测"
}

2. CPD + 生命体征联合检测

3. 部署优先级

优先级 功能 雷达配置 成本 预计精度
🔴 P0 CPD存在检测 1台(车顶后) $30 >95%
🔴 P0 驾驶员呼吸 1台(方向盘柱) $30 >85%
🟡 P1 驾驶员心率 2台(前+侧) $60 >85%
🟡 P1 后排CPD+呼吸 2台(前+后) $60 >90%
🟢 P2 全座舱监控 4台 $120 >90%
🟢 P2 多人健康 4台 $120 >85%

4. 与其他方案对比

方案 检测项 成本 隐私 夜间 穿透衣物
分布式mmWave 呼吸+心率+CPD $120 ✅ ✅ ✅
rPPG摄像头 心率 $50 ⚠️ 需IR ❌
座椅压力 存在+姿态 $30 ✅ ✅ ✅
WiFi CSI 存在+呼吸 $20 ✅ ✅ ✅
红外光谱 酒精+VOC $300 ✅ ✅ N/A

参考文献

  1. 论文: arXiv:2510.10542
  2. VMD原始: Dragomiretskiy & Zosso, 2014
  3. FMCW雷达生理感知: 先前文献
  4. TI AWRL6432: 60GHz量产雷达

发布时间: 2026-08-25 05:30
标签: mmWave, 分布式雷达, 生命体征, MPVMD, CPD, 呼吸, 心率, 多人检测, 鲁棒