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 npfrom 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 , pulse_width: float = 2e-9 , center_freq: float = 6.5e9 ): 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 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)) breathing_amplitude = 0.005 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) slow_time = np.zeros(n_frames) for i in range (n_frames): slow_time[i] = np.mean(rx_frames[i]**2 ) slow_time -= np.mean(slow_time) 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 freqs = np.fft.rfftfreq(n_frames, d=1.0 /frame_rate) spectrum = np.abs (np.fft.rfft(filtered)) 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() pulse = sim.generate_uwb_pulse(n_samples=128 ) print (f"UWB脉冲: {pulse.shape} , 中心频率: {sim.center_freq/1e9 :.1 f} GHz" ) 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' ]:.1 f} BPM" ) print (f"置信度: {result['confidence' ]:.2 f} " ) 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)): 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 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 = np.random.randn(n) rx = leakage + breathing + 0.1 * np.random.randn(n) cleaned = suppressor.suppress(tx, rx) ratio = suppressor.get_suppression_ratio(rx, cleaned) print (f"泄漏抑制比: {ratio:.1 f} dB" ) print (f"原始SNR: {10 *np.log10(np.var(breathing)/np.var(leakage)):.1 f} dB" ) print (f"抑制后SNR: {10 *np.log10(np.var(breathing)/np.var(cleaned - breathing)):.1 f} dB" )
CPD 应用方案 部署架构
flowchart TB
subgraph 现有UWB硬件
A1[车门UWB锚点1]
A2[车门UWB锚点2]
A3[B柱UWB锚点3]
A4[后视镜UWB锚点4]
end
subgraph Dubhe CAL1106AQ
B[UWB Sensing引擎]
C[Leakage Suppression]
D[呼吸检测算法]
E[存在检测算法]
end
subgraph 输出
F[CPD结果]
G[乘员计数]
H[位置估计]
end
A1 --> B
A2 --> B
A3 --> B
A4 --> B
B --> C --> D
B --> E
D --> F
E --> G
E --> H
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) 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 ) 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 ):.0 f} BPM → {result} " )
参考资源
总结: Calterah Dubhe CAL1106AQ 通过 UWB sensing 实现了一个关键突破:零硬件改动的 CPD 方案 。如果性能验证通过,这将是成本最低的 Euro NCAP 合规 CPD 方案。核心风险在于 UWB sensing 的检测精度是否真正达到 60GHz mmWave 水平——特别是婴儿呼吸这种极微弱运动的检测可靠性。建议IMS团队优先获取评估套件进行实际座舱场景验证。