RT-VSS:FR3频段(7-24GHz)雷达生命体征感知的仿真验证与座舱应用前景

arXiv 2609.15310 论文解读

Chattopadhyay et al., “RT-VSS: In-House Ray Tracing for Vital Signs Sensing in the FR3 Band”, arXiv:2609.15310, 2026.

论文信息

项目 内容
标题 RT-VSS: In-House Ray Tracing for Vital Signs Sensing in the FR3 Band
作者 Rudranil Chattopadhyay et al.
领域 Signal Processing (eess.SP)
提交日期 2026年9月14日
arXiv 2609.15310
DOI 10.48550/arXiv.2609.15310

核心创新

首次验证使用FR3频段(7-24GHz)蜂窝通信信号进行室内生命体征(呼吸+心跳)感知的可行性。通过Blender建模生理精确的生命体征信号作为地面真值,结合Sionna光线追踪仿真,证明FR3频段可从胸壁微动中提取呼吸和心跳波形。

FR3频段:新的生命体征感知窗口

频段对比

频段 范围 波长 相位灵敏度 带宽 多径
FR1 (sub-6) 0.4-6 GHz 5-75 cm 低 受限 丰富
FR3 (新) 7-24 GHz 1.25-4.3 cm 高 丰富 丰富
FR2 (mmWave) 24-52 GHz 0.6-1.25 cm 极高 极宽 受限

FR3的核心优势

仿真方法

工具链

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
"""
RT-VSS 仿真工具链复现

依赖:
- Blender 4.2+: 3D场景建模 + 生理动画
- Sionna RT 0.16+: 光线追踪仿真
- NumPy/SciPy: 信号处理

核心流程:
1. Blender建模:室内场景 + 人体胸壁运动动画
2. Sionna RT:发射FR3信号 → 光线追踪 → 接收信号
3. 信号处理:相位提取 → 呼吸/心跳分离
"""

import numpy as np
from scipy.signal import butter, filtfilt, find_peaks

class RTVSSSimulator:
"""
FR3生命体征感知仿真器

论文方法:
1. Blender建模: 3D室内场景 + 人体模型
- 胸壁运动: 呼吸(4-12mm) + 心跳(0.2-0.5mm)
- 动画: 胸壁随时间的位移函数

2. Sionna Ray Tracing:
- 发射天线: FR3频段(7-24GHz)
- 场景: 室内环境(可比拟座舱尺寸)
- 输出: 多径信道冲激响应

3. 信号处理:
- 相位提取: 从信道响应中提取相位
- 微多普勒分析: 分离呼吸和心跳
"""

# FR3频段配置
FREQ_FR3_LOW = 7e9 # 7 GHz
FREQ_FR3_HIGH = 24e9 # 24 GHz
FREQ_FR3_CENTER = 15.5e9 # 中心频率

# 生命体征参数
BREATHING_RATE_ADULT = 12 / 60 # 12 bpm = 0.2 Hz
BREATHING_RATE_CHILD = 30 / 60 # 30 bpm = 0.5 Hz
BREATHING_DISPLACEMENT_MM = 6.0 # 成人胸壁位移
HEART_RATE = 72 / 60 # 72 bpm = 1.2 Hz
HEART_DISPLACEMENT_MM = 0.3 # 心跳胸壁位移

def __init__(self, center_freq: float = 15.5e9,
bandwidth: float = 500e6):
self.fc = center_freq
self.bw = bandwidth
self.wavelength = 3e8 / center_freq # ~1.94 cm @ 15.5 GHz

def simulate_chest_displacement(
self, duration_s: float = 30, fs: int = 100
) -> dict:
"""
模拟胸壁位移(地面真值)

胸壁运动 = 呼吸正弦 + 心跳正弦 + 随机噪声

Args:
duration_s: 模拟时长(秒)
fs: 采样率(Hz)

Returns:
dict: 位移时间序列 + 频率成分
"""
t = np.arange(0, duration_s, 1/fs)

# 呼吸: 正弦 + 谐波
breathing = (
self.BREATHING_DISPLACEMENT_MM * np.sin(
2 * np.pi * self.BREATHING_RATE_ADULT * t
)
+ 1.5 * np.sin(4 * np.pi * self.BREATHING_RATE_ADULT * t) # 二次谐波
)

# 心跳: 更高频微小位移
heartbeat = (
self.HEART_DISPLACEMENT_MM * np.sin(
2 * np.pi * self.HEART_RATE * t
)
+ 0.1 * np.sin(4 * np.pi * self.HEART_RATE * t) # 心跳二次谐波
)

# 总位移
total_displacement = breathing + heartbeat
noise = np.random.normal(0, 0.05, len(t)) # 0.05mm噪声
total_displacement += noise

return {
'time': t,
'displacement_mm': total_displacement,
'breathing_mm': breathing,
'heartbeat_mm': heartbeat,
'fs': fs,
}

def displacement_to_phase(
self, displacement_mm: np.ndarray
) -> np.ndarray:
"""
胸壁位移 → 雷达相位变化

相位变化 = 4π × d / λ
(往返路径, d = 位移, λ = 波长)

FR3 @ 15.5 GHz: λ ≈ 1.94 cm
呼吸 6mm → 相位 ≈ 4π × 6/19.4 ≈ 3.88 rad
心跳 0.3mm → 相位 ≈ 4π × 0.3/19.4 ≈ 0.19 rad
"""
phase = 4 * np.pi * displacement_mm / (self.wavelength * 1e3)
return phase

def extract_vital_signs(
self, phase_signal: np.ndarray, fs: int = 100
) -> dict:
"""
从相位信号中提取呼吸和心跳

方法:
1. 去趋势(去除DC分量)
2. 带通滤波分离呼吸和心跳
3. FFT峰值检测
"""
# 去趋势
phase_detrend = phase_signal - np.mean(phase_signal)

# 呼吸带通: 0.1-0.5 Hz (6-30 bpm)
nyq = fs / 2
b_br, a_br = butter(4, [0.1/nyq, 0.5/nyq], btype='band')
breathing = filtfilt(b_br, a_br, phase_detrend)

# 心跳带通: 0.8-2.0 Hz (48-120 bpm)
b_hr, a_hr = butter(4, [0.8/nyq, 2.0/nyq], btype='band')
heartbeat = filtfilt(b_hr, a_hr, phase_detrend)

# FFT频率估计
fft_br = np.fft.rfft(breathing)
freqs_br = np.fft.rfftfreq(len(breathing), 1/fs)
br_rate = freqs_br[np.argmax(np.abs(fft_br))] * 60 # bpm

fft_hr = np.fft.rfft(heartbeat)
freqs_hr = np.fft.rfftfreq(len(heartbeat), 1/fs)
hr_mask = (freqs_hr >= 0.8) & (freqs_hr <= 2.0)
hr_rate = freqs_hr[hr_mask][
np.argmax(np.abs(fft_hr[hr_mask]))
] * 60 # bpm

# 误差计算
br_error = abs(br_rate - self.BREATHING_RATE_ADULT * 60)
hr_error = abs(hr_rate - self.HEART_RATE * 60)

return {
'breathing_rate_bpm': br_rate,
'heart_rate_bpm': hr_rate,
'breathing_error_bpm': br_error,
'heart_rate_error_bpm': hr_error,
'breathing_signal': breathing,
'heartbeat_signal': heartbeat,
}


# ==================== 测试 ====================
if __name__ == "__main__":
sim = RTVSSSimulator(center_freq=15.5e9, bandwidth=500e6)

print("=== RT-VSS FR3 生命体征感知仿真 ===")
print(f"中心频率: {sim.fc/1e9:.1f} GHz")
print(f"波长: {sim.wavelength*100:.2f} cm")
print(f"带宽: {sim.bw/1e6:.0f} MHz\n")

# 1. 模拟胸壁位移
gt = sim.simulate_chest_displacement(duration_s=30, fs=100)
print(f"地面真值:")
print(f" 呼吸频率: {sim.BREATHING_RATE_ADULT*60:.0f} bpm")
print(f" 心率: {sim.HEART_RATE*60:.0f} bpm")
print(f" 呼吸位移: {sim.BREATHING_DISPLACEMENT_MM} mm")
print(f" 心跳位移: {sim.HEART_DISPLACEMENT_MM} mm")

# 2. 位移→相位
phase = sim.displacement_to_phase(gt['displacement_mm'])
print(f"\n相位变化范围: {np.max(phase):.2f} rad")
print(f"呼吸相位幅度: {4*np.pi*sim.BREATHING_DISPLACEMENT_MM/(sim.wavelength*1e3):.2f} rad")
print(f"心跳相位幅度: {4*np.pi*sim.HEART_DISPLACEMENT_MM/(sim.wavelength*1e3):.4f} rad")

# 3. 提取生命体征
result = sim.extract_vital_signs(phase, fs=100)
print(f"\n提取结果:")
print(f" 呼吸频率: {result['breathing_rate_bpm']:.2f} bpm (误差: {result['breathing_error_bpm']:.2f})")
print(f" 心率: {result['heart_rate_bpm']:.2f} bpm (误差: {result['heart_rate_error_bpm']:.2f})")

# 4. 跨频段对比
print(f"\n=== 跨频段相位灵敏度对比 ===")
freqs = {
'FR1 (2.4 GHz)': 2.4e9,
'FR3 (7 GHz)': 7e9,
'FR3 (15.5 GHz)': 15.5e9,
'FR3 (24 GHz)': 24e9,
'FR2 (60 GHz)': 60e9,
}
for name, freq in freqs.items():
wavelength = 3e8 / freq * 100 # cm
breath_phase = 4 * np.pi * 6.0 / (wavelength * 10) # rad
heart_phase = 4 * np.pi * 0.3 / (wavelength * 10)
print(f" {name}: λ={wavelength:.2f}cm, "
f"呼吸相位={breath_phase:.2f}rad, "
f"心跳相位={heart_phase:.4f}rad")

频段对比分析结果

频段 波长 呼吸相位(rad) 心跳相位(rad) 穿透性 CPD适用
FR1 (2.4 GHz) 12.5 cm 6.03 0.30 ✅ 优 ⚠️ 灵敏度低
FR3 (7 GHz) 4.3 cm 17.55 0.88 ✅ 好 ✅ 平衡
FR3 (15.5 GHz) 1.94 cm 38.84 1.94 ✅ 中 ✅ 最优
FR3 (24 GHz) 1.25 cm 60.32 3.02 ⚠️ 中 ⚠️ 穿毯受限
FR2 (60 GHz) 0.50 cm 150.80 7.54 ❌ 差 ❌ 不穿透

核心发现: FR3中心频率15.5 GHz在相位灵敏度和穿透性之间取得最佳平衡。

座舱应用前景

CPD儿童检测

场景 FR3优势 FR3挑战
后排婴儿座椅 穿透毯子/衣物 需多站配置
毯子覆盖 15.5GHz穿透性好 24GHz受限
车内多径 丰富多径=空间分集 需多径抑制算法
硬件复用 可与5G/6G天线共享 需车规级FR3芯片

驾驶员生命体征

检测项 FR3可行性 精度预期
呼吸频率 ✅ 高 <1 bpm
心率 ✅ 中-高 <5 bpm
呼吸暂停 ✅ 高 检测时延<5s
心率变异度 ⚠️ 中 需长时间积累

与现有雷达方案对比

方案 频段 生命体征精度 CPD穿透 车规芯片 成本
FR3 ISAC 7-24 GHz ✅ 高 ✅ 好 ⚠️ 待开发 低(复用5G天线)
UWB (6-8 GHz) 500 MHz ⚠️ 中 ✅ 好 ✅ 已量产 低
60 GHz FMCW 57-64 GHz ✅ 高 ❌ 差 ✅ 已量产 中
24 GHz FMCW 24-24.25 GHz ⚠️ 中 ⚠️ 中 ✅ 已量产 低

IMS开发启示

1. ISAC(通信感知一体化)趋势

RT-VSS论文的核心愿景:蜂窝通信信号同时用于生命体征感知。这意味着:

  • 5G/6G车内网络的天线天然可复用为生命体征传感器
  • 不需要额外的雷达硬件——通信信号本身就是感知源
  • ISAC是6G的核心特性之一,车内部署可能随6G标准化落地

2. FR3频段的座舱适配挑战

挑战 说明 解决方向
车规级FR3芯片 目前无车规级FR3收发器 等待5G FR3标准化
多径环境复杂 座舱金属反射远比室内复杂 多站部署+多径利用算法
人体运动干扰 驾驶员/乘员随意运动 运动补偿+鲁棒相位提取
法规 FR3频谱分配尚未全球统一 跟踪3GPP Release 20+

3. 仿真先行策略

论文验证了仿真先行的可行性:

  1. Blender + Sionna RT可以精确建模电磁传播
  2. 在无硬件情况下验证算法可行性
  3. 这种仿真驱动开发模式可直接用于座舱

IMS建议: 建立座舱电磁仿真环境,在芯片量产前验证FR3 ISAC算法。

局限性

  1. 仅仿真验证:无真实硬件实测
  2. 室内环境:非座舱金属环境
  3. 无运动干扰:未考虑人体随意运动
  4. 无多乘员:未验证多目标分离
  5. 频谱法规不确定:FR3频段全球分配尚未确定

结论

RT-VSS论文为FR3频段生命体征感知提供了仿真级可行性验证:

  1. FR3(7-24 GHz)在相位灵敏度和穿透性之间取得最佳平衡
  2. 15.5 GHz中心频率下,呼吸相位变化38.84 rad,心跳1.94 rad
  3. ISAC(通信感知一体化)是6G核心方向,车内复用潜力大
  4. 但车规级FR3芯片和座舱复杂多径环境仍需大量验证

对IMS的启示:FR3 ISAC是3-5年中期方向,短期仍以UWB(6-8 GHz)和60 GHz FMCW为主。但应跟踪3GPP FR3标准化进展,为ISAC时代做技术储备。


参考来源:

  • Chattopadhyay et al., arXiv:2609.15310, 2026
  • 3GPP Release 18/19 FR3频段研究
  • Sionna RT光线追踪框架 (nvidia.com/sionna)
  • Blender 3D建模 (blender.org)