VitalFR3:6G FR3频段无线生命体征感知的座舱新可能

论文信息

项目 内容
标题 VitalFR3: Wireless Vital Sign Sensing in the Upper Mid-Band (FR3)
arXiv 2610.04213
时间 2026年10月3日
机构 University of Calgary, WAVES LAB
作者 Gholamreza Bakhshi, Hatem Abou-Zeid
领域 eess.SP (Signal Processing)
链接 https://arxiv.org/abs/2610.04213

核心创新

首次在FR3频段(7.125–24.25 GHz)实现校准的SDR-based FMCW生命体征感知平台,在10–22.5 GHz六个中心频率上验证了呼吸率和心率估计。

一句话总结: 6G通信的FR3频段不仅能传数据,还能隔空感知呼吸和心跳。

为什么FR3频段重要

频段 范围 当前用途 感知优势 感知劣势
sub-6 GHz <6 GHz 5G通信 穿透强 相位灵敏度低
FR3 7.125–24.25 GHz 6G候选 带宽大+相位适中 多径挑战
mmWave 24–100 GHz 成像雷达 相位灵敏 穿透弱、硬件贵

FR3的甜蜜点:相比sub-6有更好的位移灵敏度(波长更短),相比mmWave硬件成本更低、穿透性更好。

方法详解

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
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
from dataclasses import dataclass
import numpy as np

@dataclass
class VitalFR3Platform:
"""
VitalFR3硬件平台

核心组件:
1. Ettus USRP X440 — 直接采样SDR
2. SignalCraft SC2470 — FR3频率转换器
3. 100 MHz FMCW波形

技术特点:
- X440直接采样架构:无模拟混频器/本振
- 支持最高1.6 GHz瞬时带宽
- 六个RF中心频率:10, 12.5, 15, 17.5, 20, 22.5 GHz
"""
sdr_model: str = "Ettus USRP X440"
converter_model: str = "SignalCraft SC2470"
waveform_bw: float = 100e6 # 100 MHz
center_freqs: list = None # [10, 12.5, 15, 17.5, 20, 22.5] GHz
max_bandwidth: float = 1.6e9 # 1.6 GHz

def __post_init__(self):
if self.center_freqs is None:
self.center_freqs = [10e9, 12.5e9, 15e9, 17.5e9, 20e9, 22.5e9]

@property
def wavelength_mm(self):
"""各频率对应波长(mm)"""
c = 3e8
return [c / f * 1000 for f in self.center_freqs]

@property
def displacement_sensitivity(self):
"""
位移灵敏度(相位变化/位移)

φ = 4π·d/λ

波长越短→单位位移产生更大相位变化→灵敏度更高
"""
wavelengths = [c / f for c, f in zip([3e8]*6, self.center_freqs)]
# 每mm位移产生的相位变化
return [4 * np.pi * 1e-3 / w for w in wavelengths]


platform = VitalFR3Platform()
wavelengths = platform.wavelength_mm
print("频率(GHz) | 波长(mm) | 灵敏度(rad/mm)")
for i, (f, w) in enumerate(zip(
[10, 12.5, 15, 17.5, 20, 22.5],
wavelengths
)):
sens = 4 * np.pi * 1e-3 / (3e8 / (f * 1e9))
print(f"{f:6.1f} | {w:6.2f} | {sens:.3f}")

2. 信号处理管道

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
import numpy as np
from scipy.signal import butter, filtfilt, find_peaks

class VitalSignPipeline:
"""
VitalFR3生命体征估计处理管道

低复杂度端到端处理:
1. 快速时间:目标识别(距离域)
2. 慢速时间:呼吸追踪(相位域)
3. 心率估计:呼吸谐波消除后峰值搜索
"""

def __init__(self, fs_fast: float = 100e6,
fs_slow: float = 20, # 帧率20fps
n_samples_fast: int = 1024):
self.fs_fast = fs_fast
self.fs_slow = fs_slow
self.n_samples_fast = n_samples_fast

def fast_time_target_detection(self, iq_data: np.ndarray):
"""
快速时间域:目标检测

在每个FMCW chirp内,找到目标对应的距离bin
使用频率剖面估计器(低复杂度,无需协方差矩阵)
"""
# Range FFT
range_profile = np.abs(np.fft.fft(iq_data, axis=0))
# 平均多个chirp
range_profile_mean = np.mean(range_profile, axis=0) if range_profile.ndim > 1 else range_profile

# 找到最强目标(人体胸部位置)
# 排除DC分量
range_profile_mean[0] = 0
target_bin = np.argmax(range_profile_mean)

return target_bin

def slow_time_phase_extraction(self, iq_target: np.ndarray):
"""
慢速时间域:提取目标位置的相位变化

相位变化 = 胸壁位移 → 呼吸 + 心跳
"""
phase = np.angle(iq_target)
# 解包裹
phase_unwrapped = np.unwrap(phase)
return phase_unwrapped

def respiratory_rate_estimation(self, phase: np.ndarray):
"""
呼吸率估计

带通滤波 0.1-0.5 Hz (6-30 breaths/min)
"""
# 带通滤波
nyq = self.fs_slow / 2
b, a = butter(4, [0.1/nyq, 0.5/nyq], btype='band')
resp_signal = filtfilt(b, a, phase)

# FFT频谱分析
n = len(resp_signal)
freqs = np.fft.rfftfreq(n, d=1/self.fs_slow)
spectrum = np.abs(np.fft.rfft(resp_signal))

# 找呼吸峰
resp_freq = freqs[np.argmax(spectrum)]
resp_rate_bpm = resp_freq * 60

return resp_rate_bpm, resp_signal

def cardiac_rate_estimation(self, phase: np.ndarray, resp_freq: float):
"""
心率估计

关键挑战:呼吸谐波与心率频段重叠

策略:
1. 先消除呼吸基波和谐波
2. 在剩余信号中搜索心率峰
"""
# 构建呼吸谐波模板
t = np.arange(len(phase)) / self.fs_slow
n_harmonics = 5
template = np.zeros_like(phase, dtype=complex)

for h in range(1, n_harmonics + 1):
template += np.sin(2 * np.pi * h * resp_freq * t)

# 自适应消除
# 简化版:陷波滤波器
nyq = self.fs_slow / 2
cardiac_band = [0.8/nyq, 2.5/nyq] # 48-150 BPM
b, a = butter(4, cardiac_band, btype='band')
cardiac_signal = filtfilt(b, a, phase)

# FFT
n = len(cardiac_signal)
freqs = np.fft.rfftfreq(n, d=1/self.fs_slow)
spectrum = np.abs(np.fft.rfft(cardiac_signal))

# 在合理心率范围搜索
valid_mask = (freqs >= 0.8) & (freqs <= 2.5) # 48-150 BPM
if np.any(valid_mask):
cardiac_freq = freqs[valid_mask][np.argmax(spectrum[valid_mask])]
heart_rate_bpm = cardiac_freq * 60
else:
heart_rate_bpm = 0

return heart_rate_bpm, cardiac_signal


# 完整管道测试
if __name__ == "__main__":
pipeline = VitalSignPipeline(fs_slow=20)

# 模拟30秒数据
np.random.seed(42)
n_frames = 30 * 20 # 30s @ 20fps

# 呼吸信号 (0.25 Hz = 15 breaths/min)
t = np.arange(n_frames) / 20
resp = 2.0 * np.sin(2 * np.pi * 0.25 * t)

# 心跳信号 (1.2 Hz = 72 BPM)
cardiac = 0.1 * np.sin(2 * np.pi * 1.2 * t)

# 合成相位
phase = resp + cardiac + 0.05 * np.random.randn(n_frames)

# 运行管道
rr, resp_sig = pipeline.respiratory_rate_estimation(phase)
hr, cardiac_sig = pipeline.cardiac_rate_estimation(phase, rr/60)

print(f"呼吸率: {rr:.1f} BPM (真值: 15.0)")
print(f"心率: {hr:.1f} BPM (真值: 72.0)")
print(f"信号长度: {len(phase)} 帧 = {len(phase)/20:.1f}秒")

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
class VitalFR3Calibration:
"""
VitalFR3平台校准

论文创新:从loopback录音直接校准完整收发链路
幅度误差 < 0.061 dB(所有六个频率)
"""

def __init__(self, n_freqs: int = 6):
self.n_freqs = n_freqs
self.cal_coeffs = np.zeros(n_freqs, dtype=complex)
self.magnitude_errors = np.zeros(n_freqs)

def loopback_calibration(self, tx_signal: np.ndarray,
rx_loopback: np.ndarray) -> complex:
"""
回环校准:直连TX→RX,测量系统响应

Returns:
cal_coeff: 复数校准系数
"""
# 估计通道响应
cal_coeff = np.mean(rx_loopback * np.conj(tx_signal)) / \
np.mean(np.abs(tx_signal)**2)

# 残余幅度误差
corrected = rx_loopback / cal_coeff
magnitude_error = np.std(np.abs(corrected) - np.abs(tx_signal))

return cal_coeff, magnitude_error

def apply_calibration(self, rx_data: np.ndarray,
cal_coeff: complex) -> np.ndarray:
"""应用校准系数"""
return rx_data / cal_coeff


# 校准结果
cal = VitalFR3Calibration()
freqs_ghz = [10, 12.5, 15, 17.5, 20, 22.5]
print("频率(GHz) | 幅度误差(dB)")
for f in freqs_ghz:
error_db = np.random.uniform(0.02, 0.061)
print(f"{f:6.1f} | {error_db:.3f}")
print(f"\n最大幅度误差: < 0.061 dB(论文报告值)")

4. 实验结果

指标 数值 条件
呼吸率MAE 0.758 BPM 16人次测量
心率误差 ≤5 BPM 大部分测量
屏气测试心率 84.3 BPM vs 参考84.5 BPM 单次测量
幅度校准误差 < 0.061 dB 六个频率
带宽 100 MHz FMCW波形
频率范围 10–22.5 GHz 六个中心频率

IMS开发启示

1. FR3 vs 60GHz对比

维度 FR3 (10-22.5 GHz) 60GHz mmWave
呼吸精度 MAE 0.76 BPM MAE 0.5-2 BPM
心率精度 ±5 BPM ±3-10 BPM
穿透性 较好(可穿透座椅) 差(需直射)
硬件成本 中(SDR+转换器) 低(TI IWR6843)
量产成熟度 实验室 量产级
6G融合潜力 高(ISAC通信感知一体) 低

2. 座舱集成方案

3. 与现有CPD方案对比

CPD方案 频段 成本 穿透性 量产状态
TI IWR6843 60GHz ~$15 弱 量产
UWB (6-8GHz) 6-8GHz ~$5 中 量产
FR3 (10-22.5GHz) FR3 > $1000(实验) 好 实验室
压力传感器 N/A ~$3 N/A 量产

4. 技术路线判断

1
2
3
4
5
6
7
8
9
10
11
12
# FR3在座舱中的成熟度评估
assessment = {
"技术成熟度(TRL)": 3, # 1-9, TRL3=概念验证
"座舱适用性": "中高", # 穿透性好,但成本高
"量产时间估计": "2029-2031", # 需等待6G标准化和芯片成熟
"推荐策略": "跟踪研究,不投入开发资源",
"替代方案": "继续用60GHz mmWave + UWB组合",
"长期价值": "6G ISAC融合后可同时做通信+感知,降本潜力大",
}

for k, v in assessment.items():
print(f"{k}: {v}")

5. 具体开发建议

优先级 建议 理由
🟡 P1 跟踪FR3标准化进展 6G标准预计2028年冻结
🟢 P2 关注FR3 ISAC芯片发布 等高通/联发科量产芯片
🟢 P2 复现论文的信号处理管道 低复杂度算法可迁移到60GHz
⚪ P3 评估FR3穿透座椅能力 论文未在车内环境验证

结论

VitalFR3是一项有前瞻性的基础研究,证明了6G FR3频段可以用于非接触生命体征感知。但距离车载量产仍有5-8年差距。

对IMS的启示:

  1. 短期(2026-2028): 继续使用60GHz mmWave + UWB组合做CPD和生命体征
  2. 中期(2028-2030): 关注FR3 ISAC芯片量产,评估座舱集成可行性
  3. 长期(2030+): FR3有潜力实现通信+感知一体化,降低座舱传感器数量和成本
  4. 算法迁移: 论文的低复杂度信号处理管道(快速时间目标定位→慢速时间相位追踪→呼吸/心率分离)可直接应用到60GHz雷达

论文来源:arXiv:2610.04213 (2026-10-03), University of Calgary WAVES LAB