Calterah Dubhe CAL1106AQ:UWB SoC实现CPD的新硬件方案

AutoSens/InCabin Europe 2026 深度解析

背景与行业意义

2026年9月,Calterah Semiconductor 在 AutoSens Europe 2026(巴塞罗那)发布了 Dubhe CAL1106AQ SoC,号称是全球首个在 FiRa 4.0 认证的 2T4R UWB 芯片上实现 IEEE 802.15.4ab sensing 的产品。

核心意义: 通过软件升级现有无钥匙进入(keyless entry)UWB 硬件即可实现儿童遗留检测(CPD),无需额外部署 60GHz mmWave 内舱雷达。

技术规格

参数 CAL1106AQ 传统60GHz mmWave 对比
频段 UWB (6.5-8GHz) 60-64 GHz mmWave 不同频段
天线配置 2T4R (2发4收) 3T4R~4T4R 相似
测距能力 >400m (BLE辅助) ~5m (座舱内) UWB远超
运动检测 呼吸级别(Radar Leakage Suppression) 呼吸级别 相当
穿透能力 穿透 parked cars 穿透毯子/座椅 UWB更强
成本 ~$5-15(复用现有) $30-80(新增) UWB成本降90%
部署方式 软件升级 新增传感器+布线 UWB零硬件改动
认证 FiRa 4.0 + IEEE 802.15.4ab 无标准 UWB有标准

IEEE 802.15.4ab 详解

IEEE 802.15.4ab 是 UWB 物理层标准(802.15.4z 的演进版本),新增了 sensing 能力:

版本 发布时间 核心能力
802.15.4-2015 2015 基础 UWB 通信
802.15.4z-2020 2020 安全测距 + PRF
802.15.4ab 2026 通信 + 测距 + sensing(运动/呼吸检测)

Sensing 原理

UWB sensing 利用脉冲雷达原理:发送超宽带脉冲,接收反射信号,通过相位变化检测微运动:

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
import numpy as np
from typing import Tuple

class UWBSensingSimulator:
"""
UWB Sensing 仿真器

核心原理:
1. 发送 UWB 脉冲(~2ns 宽度)
2. 接收反射信号(包含静态和动态反射)
3. 相位变化检测微运动(呼吸)
4. Radar Leakage Suppression 抑制发送-接收泄漏

信号处理链:
Raw ADC → DC去除 → 泄漏抑制 → 带通滤波 →
相位提取 → 多普勒分析 → 呼吸频率估计
"""

def __init__(self, sample_rate: float = 1e9, # 1 GHz
pulse_width: float = 2e-9, # 2 ns
center_freq: float = 6.5e9): # 6.5 GHz
self.sample_rate = sample_rate
self.pulse_width = pulse_width
self.center_freq = center_freq
self.dt = 1.0 / sample_rate

def generate_uwb_pulse(self, n_samples: int = 256) -> np.ndarray:
"""生成UWB脉冲"""
t = np.arange(n_samples) * self.dt
# Gaussian pulse modulated at center frequency
pulse = np.exp(-((t - 10*self.pulse_width)**2) /
(2 * self.pulse_width**2))
pulse *= np.cos(2 * np.pi * self.center_freq * t)
return pulse

def simulate_reflection(self, tx_signal: np.ndarray,
distance: float,
breathing_rate: float = 0.3,
duration: float = 10.0) -> np.ndarray:
"""
模拟人体呼吸反射

Args:
tx_signal: 发送信号
distance: 人体到传感器距离 (m)
breathing_rate: 呼吸频率 (Hz, ~0.3 = 18次/分)
duration: 模拟时长 (s)

Returns:
rx_signal: 接收信号矩阵 (n_frames, n_samples)
"""
c = 3e8 # 光速
delay = 2 * distance / c # 往返延迟
delay_samples = int(delay * self.sample_rate)

n_frames = int(duration * self.sample_rate / len(tx_signal))

# 呼吸导致的距离变化(幅度~5mm)
breathing_amplitude = 0.005 # 5mm
breath_times = np.arange(n_frames) * len(tx_signal) / self.sample_rate

rx_frames = np.zeros((n_frames, len(tx_signal) + delay_samples + 10))

for i, t in enumerate(breath_times):
# 呼吸引起的距离变化
d_variation = breathing_amplitude * np.sin(
2 * np.pi * breathing_rate * t
)
actual_delay = 2 * (distance + d_variation) / c
delay_var_samples = int(actual_delay * self.sample_rate)

# 接收信号 = 延迟+衰减的发送信号 + 噪声
rx = np.zeros(len(tx_signal) + delay_samples + 10)
if delay_var_samples < len(rx):
attenuation = 1.0 / (4 * np.pi * (distance + d_variation)**2)
rx[delay_var_samples:delay_var_samples+len(tx_signal)] = (
attenuation * tx_signal +
np.random.normal(0, 0.01, len(tx_signal))
)
rx_frames[i] = rx

return rx_frames

def extract_breathing_rate(self, rx_frames: np.ndarray) -> dict:
"""
从接收信号中提取呼吸频率

信号处理链:
1. DC去除
2. Radar Leakage Suppression
3. 带通滤波 (0.1-1.0 Hz)
4. 相位提取
5. FFT → 呼吸频率
"""
from scipy.signal import butter, filtfilt

n_frames = len(rx_frames)

# 1. 提取慢时间序列(每帧的信号能量/相位)
slow_time = np.zeros(n_frames)
for i in range(n_frames):
slow_time[i] = np.mean(rx_frames[i]**2) # 能量

# 2. DC去除
slow_time -= np.mean(slow_time)

# 3. 带通滤波 (0.1-1.0 Hz,呼吸频率范围)
nyquist = self.sample_rate / (len(tx_signal) if (tx_signal := rx_frames[0]).size > 0 else 1)
frame_rate = 1.0 / (len(rx_frames[0]) / self.sample_rate)

low = 0.1 / (frame_rate / 2)
high = min(1.0 / (frame_rate / 2), 0.99)
if low < high:
b, a = butter(2, [low, high], btype='band')
filtered = filtfilt(b, a, slow_time)
else:
filtered = slow_time

# 4. FFT
freqs = np.fft.rfftfreq(n_frames, d=1.0/frame_rate)
spectrum = np.abs(np.fft.rfft(filtered))

# 5. 找峰值
valid_mask = (freqs >= 0.1) & (freqs <= 1.0)
if valid_mask.any():
peak_idx = np.argmax(spectrum[valid_mask])
breathing_freq = freqs[valid_mask][peak_idx]
breathing_rate_bpm = breathing_freq * 60
else:
breathing_freq = 0
breathing_rate_bpm = 0

return {
'breathing_rate_hz': float(breathing_freq),
'breathing_rate_bpm': float(breathing_rate_bpm),
'confidence': float(np.max(spectrum[valid_mask]) /
(np.mean(spectrum) + 1e-8)),
'frequency_spectrum': freqs.tolist(),
'amplitude': spectrum.tolist()
}


# 测试
if __name__ == "__main__":
sim = UWBSensingSimulator()

# 生成UWB脉冲
pulse = sim.generate_uwb_pulse(n_samples=128)
print(f"UWB脉冲: {pulse.shape}, 中心频率: {sim.center_freq/1e9:.1f} GHz")

# 模拟1.5米处的人体呼吸
rx_frames = sim.simulate_reflection(
pulse, distance=1.5, breathing_rate=0.3, duration=10.0
)
print(f"接收信号: {rx_frames.shape} (帧数 × 样本数)")

# 提取呼吸频率
result = sim.extract_breathing_rate(rx_frames)
print(f"\n=== UWB Sensing 结果 ===")
print(f"检测到的呼吸频率: {result['breathing_rate_bpm']:.1f} BPM")
print(f"置信度: {result['confidence']:.2f}")
print(f"(真实值: 18.0 BPM)")

Radar Leakage Suppression(雷达泄漏抑制)

这是 Calterah 声称的核心技术,使 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
class RadarLeakageSuppression:
"""
雷达泄漏抑制模块

问题:UWB 发送信号直接泄漏到接收通道(不经反射),
淹没微弱的呼吸反射信号

解决方案:
1. 自适应泄漏估计:跟踪静态泄漏分量
2. 串扰建模:建立TX-RX直接耦合模型
3. 自适应对消:从接收信号中减去估计的泄漏

效果:泄漏抑制 >40dB,使呼吸信号可见
"""

def __init__(self, n_taps: int = 16, learning_rate: float = 0.01):
"""
Args:
n_taps: 自适应滤波器抽头数
learning_rate: LMS学习率
"""
self.n_taps = n_taps
self.lr = learning_rate
self.weights = np.zeros(n_taps)
self.buffer = np.zeros(n_taps)

def suppress(self, tx_signal: np.ndarray,
rx_signal: np.ndarray) -> np.ndarray:
"""
泄漏抑制(LMS自适应对消)

Args:
tx_signal: 发送信号 (N,)
rx_signal: 接收信号 (N,)

Returns:
cleaned_rx: 泄漏抑制后的接收信号
"""
cleaned = np.zeros_like(rx_signal)

for i in range(len(rx_signal)):
# 延迟buffer
self.buffer[1:] = self.buffer[:-1]
self.buffer[0] = tx_signal[i] if i < len(tx_signal) else 0

# 估计泄漏
leakage_est = np.dot(self.weights, self.buffer)

# 对消
cleaned[i] = rx_signal[i] - leakage_est

# LMS更新
self.weights += self.lr * cleaned[i] * self.buffer

return cleaned

def get_suppression_ratio(self, original: np.ndarray,
cleaned: np.ndarray) -> float:
"""计算泄漏抑制比 (dB)"""
orig_power = np.mean(original**2)
clean_power = np.mean(cleaned**2)
if clean_power > 0:
return 10 * np.log10(orig_power / clean_power)
return 0.0


# 测试
if __name__ == "__main__":
suppressor = RadarLeakageSuppression(n_taps=16, learning_rate=0.01)

# 模拟:强泄漏 + 弱呼吸反射
n = 1000
leakage = 10.0 * np.random.randn(n) # 强泄漏
breathing = 0.01 * np.sin(2 * np.pi * 0.3 * np.arange(n) / 100) # 微弱呼吸

# TX信号
tx = np.random.randn(n)

# RX = 泄漏 + 呼吸反射 + 噪声
rx = leakage + breathing + 0.1 * np.random.randn(n)

# 抑制泄漏
cleaned = suppressor.suppress(tx, rx)

ratio = suppressor.get_suppression_ratio(rx, cleaned)
print(f"泄漏抑制比: {ratio:.1f} dB")
print(f"原始SNR: {10*np.log10(np.var(breathing)/np.var(leakage)):.1f} dB")
print(f"抑制后SNR: {10*np.log10(np.var(breathing)/np.var(cleaned - breathing)):.1f} dB")

CPD 应用方案

部署架构

CPD 检测算法

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
class CalterahCPDDetector:
"""
基于 Calterah Dubhe UWB 的 CPD 检测器

检测流程:
1. UWB Sensing 模式启动(停车后)
2. 多锚点轮询,采集接收信号
3. Leakage Suppression 处理
4. 运动检测(是否存在运动/呼吸)
5. 分类(人体 vs 动物 vs 无生命)
6. 位置估计(多锚点三角定位)
7. 报警决策

优势:
- 零新增硬件成本(复用keyless entry)
- 低功耗(UWB pulse duty cycle极低)
- 穿透能力强(穿透座椅、毯子、车身)
- 隐私友好(无图像)
"""

def __init__(self, n_anchors: int = 4):
self.n_anchors = n_anchors
self.leakage_suppressor = [RadarLeakageSuppression()
for _ in range(n_anchors)]
self.breathing_detector = UWBSensingSimulator()

def scan_cabin(self, anchor_signals: list) -> dict:
"""
扫描座舱

Args:
anchor_signals: 各锚点的 [tx, rx] 信号列表

Returns:
{'has_presence': bool, 'is_child': bool,
'location': tuple, 'confidence': float}
"""
presence_detected = False
breathing_rates = []
positions = []

for i, (tx, rx) in enumerate(anchor_signals):
# 泄漏抑制
cleaned = self.leakage_suppressor[i].suppress(tx, rx)

# 运动/呼吸检测
motion_energy = np.var(cleaned)

if motion_energy > 0.001: # 存在运动
presence_detected = True

# 尝试提取呼吸频率
result = self.breathing_detector.extract_breathing_rate(
cleaned.reshape(1, -1)
)
if result['confidence'] > 0.5:
breathing_rates.append(result['breathing_rate_bpm'])
# 基于信号强度估计距离
positions.append((i, motion_energy))

if not presence_detected:
return {'has_presence': False, 'is_child': False,
'location': None, 'confidence': 0.9}

# 呼吸频率判断成人/儿童
if breathing_rates:
avg_breathing = np.mean(breathing_rates)
# 婴儿 30-60 BPM, 幼儿 20-40, 成人 12-20
is_child = avg_breathing > 25
else:
is_child = False # 有运动但无法提取呼吸

# 位置估计(简化:使用最强信号锚点)
if positions:
primary_anchor = max(positions, key=lambda x: x[1])
location = f"anchor_{primary_anchor[0]}"
else:
location = "unknown"

return {
'has_presence': True,
'is_child': is_child,
'location': location,
'breathing_rate': float(np.mean(breathing_rates)) if breathing_rates else 0,
'confidence': 0.8,
'n_anchors_triggered': len(breathing_rates)
}


# 测试
if __name__ == "__main__":
detector = CalterahCPDDetector(n_anchors=4)

# 模拟空座舱
n = 1000
empty_signals = [(np.random.randn(n), 10*np.random.randn(n))
for _ in range(4)]
result = detector.scan_cabin(empty_signals)
print("空座舱:", result)

# 模拟有儿童(呼吸信号)
child_signals = []
for i in range(4):
tx = np.random.randn(n)
breathing = 0.05 * np.sin(2*np.pi*0.5*np.arange(n)/100) # 30 BPM
rx = 10*np.random.randn(n) + breathing + 0.1*np.random.randn(n)
child_signals.append((tx, rx))

result = detector.scan_cabin(child_signals)
print("有儿童:", result)

行业对比

CPD 技术方案对比

方案 成本 穿透 功耗 量产状态 Euro NCAP合规
Calterah Dubhe UWB $5-15 ✅ 穿透车身 <0.1W 2026量产 ✅
Infineon 60GHz mmWave $30-80 ✅ 穿透毯子 2-5W 已量产 ✅
摄像头方案 $15-30 ❌ 遮挡失效 1-3W 已量产 ⚠️ 部分
TAP3D 热阵列 $5-15 ✅ 穿透毯子 <0.5W 原型 ⚠️ 待验证
压力传感器 $10-20 ❌ 需在座椅内 <0.1W 已量产 ⚠️ 仅存在检测

Calterah vs Infineon 60GHz

维度 Calterah UWB Infineon 60GHz
频段 6.5-8 GHz 60-64 GHz
波长 ~4-5 cm ~5 mm
分辨率 ~5-10 cm ~5 mm
穿透车身 ✅ ❌
穿透毯子 ✅ ✅
多目标区分 中 好
呼吸检测 ✅(Leakage Suppression) ✅
量产成本 $5-15 $30-80
部署复杂度 低(软件升级) 高(新增传感器+布线)

IMS 开发启示

1. CPD 技术路线建议

优先级 方案 理由
P0 评估现有UWB硬件 如果已有keyless entry,可软件升级
P0 Calterah Dubhe 评估 获取开发套件验证CPD性能
P1 Infineon 60GHz 对比 作为高精度备份方案
P2 TAP3D热阵列补充 隐私友好低成本补充

2. UWB CPD 的验证场景

场景 测试条件 预期结果
空座舱 停车30min后扫描 无存在 ✅
成人在座 成人正常呼吸 存在检测 ✅,成人分类 ✅
儿童在座 3岁儿童睡觉 存在检测 ✅,儿童分类 ✅
婴儿安全座椅 1岁婴儿在安全座椅 存在检测 ✅,儿童分类 ✅
毯下覆盖 成人用毯子覆盖 存在检测 ✅(穿透毯子)
后排检测 后排有儿童 多锚点定位 ✅
极端温度 -20°C/50°C 呼吸检测可靠 ✅
动物误报 宠物在车内 存在检测 ✅,分类为非儿童 ✅

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
46
47
48
class CPDSystem:
"""
CPD 系统集成架构

停车后触发流程:
1. 车辆熄火 + 车门关闭 → 等待5分钟
2. 启动UWB Sensing扫描
3. 检测到存在 → 5秒确认
4. 分类(儿童/成人/动物)
5. 分级报警
"""

ALARM_LEVELS = {
'no_presence': {'action': 'none', 'notification': False},
'adult_present': {'action': 'log', 'notification': False},
'child_detected': {'action': 'honk+flash', 'notification': True},
'infant_detected': {'action': 'honk+flash+call', 'notification': True},
}

def process_scan(self, scan_result: dict) -> dict:
"""处理扫描结果"""
if not scan_result['has_presence']:
return self.ALARM_LEVELS['no_presence']

if scan_result['is_child']:
breathing = scan_result.get('breathing_rate', 0)
if breathing > 35: # 婴儿呼吸频率
return self.ALARM_LEVELS['infant_detected']
else:
return self.ALARM_LEVELS['child_detected']
else:
return self.ALARM_LEVELS['adult_present']


if __name__ == "__main__":
system = CPDSystem()

tests = [
{'has_presence': False, 'is_child': False, 'breathing_rate': 0},
{'has_presence': True, 'is_child': False, 'breathing_rate': 16},
{'has_presence': True, 'is_child': True, 'breathing_rate': 28},
{'has_presence': True, 'is_child': True, 'breathing_rate': 42},
]

for tc in tests:
result = system.process_scan(tc)
print(f"存在={tc['has_presence']}, 儿童={tc['is_child']}, "
f"呼吸={tc.get('breathing_rate', 0):.0f}BPM → {result}")

参考资源


总结: Calterah Dubhe CAL1106AQ 通过 UWB sensing 实现了一个关键突破:零硬件改动的 CPD 方案。如果性能验证通过,这将是成本最低的 Euro NCAP 合规 CPD 方案。核心风险在于 UWB sensing 的检测精度是否真正达到 60GHz mmWave 水平——特别是婴儿呼吸这种极微弱运动的检测可靠性。建议IMS团队优先获取评估套件进行实际座舱场景验证。