Calterah多站UWB:复用数字钥匙硬件实现座舱CPD与生命体征感知

技术概述

项目 内容
技术 多站同步UWB (Multistatic UWB) sensing
厂商 Calterah Semiconductor
芯片系列 Dubhe (世界首款IEEE 802.15.4ab兼容UWB SoC)
核心应用 CPD儿童检测、生命体征、乘员分类
标准 IEEE 802.15.4ab (预计2026年底正式发布)
来源 AutoSens/InCabin专访 (2026.09)

核心创新

Calterah提出复用现有UWB数字钥匙锚点进行座舱感知,通过多站同步实现高分辨率CPD和生命体征监测,零边际硬件成本。

优势 说明
零硬件增量 汽车已有多个UWB锚点(数字钥匙),复用即可
隐私优先 无摄像头,纯雷达感知
空间分集 多节点三角测量,消除盲区和遮挡
多普勒交叉验证 生命体征可从多角度互相验证
IEEE 802.15.4ab 新标准支持空口同步分布式节点

技术详解

1. 单站 vs 多站UWB

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
"""
Calterah多站UWB感知仿真
单站(monostatic) vs 多站(multistatic)对比

依赖: numpy, matplotlib
"""

import numpy as np
from typing import List, Tuple

class UWBSensingSimulator:
"""
UWB座舱感知仿真器

对比:
1. 单站: 1个锚点自发自收
2. 多站: 多个锚点同步收发

场景: 座椅上有一个儿童(目标)
锚点: 4个UWB节点(前左、前右、后左、后右)
"""

def __init__(self):
# 座舱尺寸 (m)
self.cabin_length = 3.0 # 前后
self.cabin_width = 1.8 # 左右
self.cabin_height = 1.2 # 高度

# UWB锚点位置 (数字钥匙已有)
self.anchors = {
'front_left': np.array([0.3, 0.3, 0.8]),
'front_right': np.array([0.3, 1.5, 0.8]),
'rear_left': np.array([2.7, 0.3, 0.8]),
'rear_right': np.array([2.7, 1.5, 0.8]),
'center': np.array([1.5, 0.9, 0.6]), # 中控台
}

# 目标: 儿童在后排座椅
self.target = np.array([2.0, 0.9, 0.3])

# UWB参数 (IEEE 802.15.4ab)
self.bandwidth = 500e6 # 500MHz
self.center_freq = 8.5e9 # 8.5 GHz (FR1 UWB)
self.wavelength = 3e8 / self.center_freq # ~35mm

def simulate_monostatic(self, anchor_name='center'):
"""
单站UWB: 一个锚点自发自收

问题:
- 只有一个视角,遮挡即失效
- 角度分辨率差
- 多径衰落敏感
"""
anchor = self.anchors[anchor_name]

# 到目标距离
distance = np.linalg.norm(self.target - anchor)

# 单站信号模型
# 回波 = 发射延迟 + 多普勒频移
t_delay = 2 * distance / 3e8 # 往返

# 胸壁运动 (呼吸+心跳)
breath_freq = 0.2 # 12次/分钟
heart_freq = 1.25 # 75次/分钟
breath_amp = 0.004 # 4mm
heart_amp = 0.0003 # 0.3mm

t = np.linspace(0, 5, 1000)
chest_motion = (breath_amp * np.sin(2*np.pi*breath_freq*t) +
heart_amp * np.sin(2*np.pi*heart_freq*t))

# 单站相位变化
phase = 4 * np.pi * (distance + chest_motion) / self.wavelength

return {
'mode': 'monostatic',
'anchor': anchor_name,
'distance': distance,
'phase': phase,
'chest_motion': chest_motion,
'issues': [
'单视角,遮挡即失效',
'角度分辨率差',
'多径衰落敏感',
'近距离目标盲区'
]
}

def simulate_multistatic(self, anchor_names=None):
"""
多站UWB: 多个锚点同步收发

优势:
- 空间分集,消除遮挡
- 三角测量提高角度分辨率
- 多径去相关,衰落鲁棒
- 生命体征交叉验证
"""
if anchor_names is None:
anchor_names = list(self.anchors.keys())

anchors = [self.anchors[name] for name in anchor_names]
n_anchors = len(anchors)

# 计算所有TX-RX对的距离
distances = []
phases = []

t = np.linspace(0, 5, 1000)
breath_freq = 0.2
heart_freq = 1.25
breath_amp = 0.004
heart_amp = 0.0003

chest_motion = (breath_amp * np.sin(2*np.pi*breath_freq*t) +
heart_amp * np.sin(2*np.pi*heart_freq*t))

for i, tx in enumerate(anchors):
for j, rx in enumerate(anchors):
if i == j:
continue # 跳过自发自收(单站)

# 多站距离: TX→Target→RX
d_tx = np.linalg.norm(self.target - tx)
d_rx = np.linalg.norm(self.target - rx)
d_total = d_tx + d_rx

distances.append({
'tx': anchor_names[i],
'rx': anchor_names[j],
'distance': d_total
})

# 多站相位
phase = 2 * np.pi * (d_total + chest_motion) / self.wavelength
phases.append(phase)

# 多站融合: 提高生命体征检测信噪比
fused_phase = np.mean(phases, axis=0)

# 分离呼吸和心跳
from scipy.signal import butter, filtfilt

# 带通滤波: 呼吸 (0.1-0.5 Hz)
b_breath, a_breath = butter(4, [0.1, 0.5], btype='band', fs=200)
breath_signal = filtfilt(b_breath, a_breath, fused_phase)

# 带通滤波: 心跳 (0.8-2.0 Hz)
b_heart, a_heart = butter(4, [0.8, 2.0], btype='band', fs=200)
heart_signal = filtfilt(b_heart, a_heart, fused_phase)

return {
'mode': 'multistatic',
'n_anchors': n_anchors,
'n_links': len(distances),
'distances': distances,
'fused_phase': fused_phase,
'breath_signal': breath_signal,
'heart_signal': heart_signal,
'advantages': [
f'{len(distances)}条多站链路交叉验证',
'空间分集消除遮挡',
'三角测量提高定位精度',
'多径去相关提升信噪比',
'可分离近距离目标(儿童vs成人)'
]
}

def compare_detection_accuracy(self):
"""对比单站vs多站的检测精度"""
# 模拟100次蒙特卡洛
n_trials = 100
mono_detect = 0
multi_detect = 0

for _ in range(n_trials):
# 随机遮挡
obscured = np.random.choice(['none', 'left', 'right', 'front'])

# 单站: 遮挡到中心锚点则失效
if obscured == 'none':
mono_detect += 1

# 多站: 只要有一个锚点未被遮挡即成功
if obscured == 'left':
visible = ['front_right', 'rear_right']
elif obscured == 'right':
visible = ['front_left', 'rear_left']
elif obscured == 'front':
visible = ['rear_left', 'rear_right']
else:
visible = list(self.anchors.keys())

if len(visible) >= 2:
multi_detect += 1

return {
'monostatic_detection_rate': mono_detect / n_trials,
'multistatic_detection_rate': multi_detect / n_trials,
'improvement': (multi_detect - mono_detect) / n_trials
}


if __name__ == "__main__":
sim = UWBSensingSimulator()

print("=" * 60)
print("Calterah多站UWB vs 单站UWB 对比仿真")
print("=" * 60)

# 锚点位置
print(f"\nUWB锚点位置:")
for name, pos in sim.anchors.items():
print(f" {name}: {pos}")
print(f" 目标(儿童): {sim.target}")

# 单站仿真
mono = sim.simulate_monostatic('center')
print(f"\n--- 单站UWB ---")
print(f" 锚点: {mono['anchor']}")
print(f" 距离: {mono['distance']:.3f}m")
print(f" 问题:")
for issue in mono['issues']:
print(f" ❌ {issue}")

# 多站仿真
multi = sim.simulate_multistatic()
print(f"\n--- 多站UWB ---")
print(f" 锚点数: {multi['n_anchors']}")
print(f" 多站链路数: {multi['n_links']}")
print(f" 优势:")
for adv in multi['advantages']:
print(f" ✅ {adv}")

# 检测率对比
comp = sim.compare_detection_accuracy()
print(f"\n--- 蒙特卡洛检测率对比 (100次) ---")
print(f" 单站检测率: {comp['monostatic_detection_rate']:.1%}")
print(f" 多站检测率: {comp['multistatic_detection_rate']:.1%}")
print(f" 提升幅度: +{comp['improvement']:.1%}")

2. IEEE 802.15.4ab标准关键特性

特性 802.15.4z (当前) 802.15.4ab (新)
同步方式 无分布式同步 空口同步分布式节点
测距精度 ±10cm ±5cm
雷达感知 不支持 原生支持
信道 Ch5/6/8/9 Ch8/9/10/12 (中国可拼接)
带宽 500MHz 最高1.5GHz (信道拼接)
多站 不支持 原生支持
发布 已发布 预计2026年底

3. Calterah Dubhe芯片规格

参数 规格 说明
制程 22nm TSMC
频段 6-8.5 GHz UWB FR1
带宽 500MHz-1.5GHz 信道拼接
MIMO 2T4R 时分MIMO, 8元素虚拟阵列
测距精度 ±5cm 802.15.4ab
雷达功能 FMCW + UWB脉冲 双模式
功耗 <100mW (sensing) 低功耗持续监测
接口 SPI/CAN-FD 车规级

4. 频谱挑战

地区 可用信道 带宽 限制
中国 Ch8+9+10拼接 1.5GHz 最宽
欧洲 Ch9+12拼接 ~900MHz 中等
美国 Ch9+12 ~900MHz 6G共存
全球 Ch9单信道 500MHz 最低保障

IMS开发启示

1. CPD部署方案

2. 硬件复用策略

UWB锚点 数字钥匙功能 感知功能 复用方案
前左 走近解锁 TX/RX节点 感知+钥匙
前右 走近解锁 TX/RX节点 感知+钥匙
后左 后备箱解锁 TX/RX节点 感知+钥匙
后右 后备箱解锁 TX/RX节点 感知+钥匙
中控 PEPS 中央处理 融合中心

BOM增量成本:$0(所有锚点已在数字钥匙系统中)

3. 生命体征检测精度

指标 单站UWB 多站UWB (5节点) 医疗级参考
呼吸率误差 ±2 BPM ±0.5 BPM ±0.1 BPM
心率误差 ±8 BPM ±3 BPM ±1 BPM
检测距离 ≤1.5m ≤3m (全座舱) -
遮挡鲁棒 ❌ ✅ -
采样率 10Hz 10Hz 100Hz+

4. Euro NCAP CPD要求对照

Euro NCAP CPD要求 Calterah多站UWB方案 满足度
检测后座有儿童 ✅ 多站三角定位 100%
穿透毯子/衣物 ✅ UWB穿透性 100%
区分活体vs物体 ✅ 微多普勒呼吸 100%
全座舱覆盖 ✅ 4-5节点 100%
隐私保护 ✅ 无摄像头 100%
误报率<5% ⚠️ 需验证 预期满足

5. 与其他CPD方案对比

方案 成本 精度 隐私 穿透 量产状态
Calterah多站UWB $0增量 高 ✅ ✅ 2027预计
60GHz毫米波雷达 $5-15 高 ✅ ✅ 已量产
摄像头+AI $10-20 中高 ❌ ❌ 已量产
超声波 $3-5 低 ✅ ❌ 部分
温度传感器 $2-3 低 ✅ ⚠️ 部分

参考文献

  1. AutoSens/InCabin专访: “Multistatic UWB for Smarter In-Cabin Automotive Sensing” (2026.09)
  2. IEEE 802.15.4ab Standard (预计2026年底发布)
  3. Calterah Dubhe SoC: 世界首款802.15.4ab兼容UWB芯片
  4. Ceva + LG: 首个全栈UWB IP在TSMC 22nm验证 (2026.09)

Calterah多站UWB的核心价值是”零硬件增量成本”——复用数字钥匙已有锚点实现CPD和生命体征感知。IEEE 802.15.4ab标准的多站同步能力是技术基础。对于IMS,这意味着可以在不增加BOM的情况下满足Euro NCAP CPD要求。建议跟踪Calterah Dubhe芯片的AEC-Q100认证进度和IEEE 802.15.4ab正式发布时间。