UWB雷达儿童遗留检测(CPD)技术全解析:从原理到量产 | 技术深度解读

技术背景

Euro NCAP 2026 协议要求所有新车标配 Child Presence Detection (CPD) 功能。与传统重量传感器或摄像头方案不同,UWB(超宽带)雷达已成为 CPD 的主流技术路线。2026年8月,NXP Trimension NCJ29D6 被 BMW Group 选为其 2026 车型量产方案,YFORE 也推出了多场景 UWB 雷达感知产品线。

UWB CPD 原理详解

1. 工作原理

2. UWB vs 其他 CPD 技术对比

特性 UWB 雷达 摄像头 超声波 重量传感器
穿透障碍 ✅ 穿透毯子/座椅 ❌ 视线遮挡 ⚠️ 部分穿透 ❌ 需直接接触
光照要求 ✅ 全光照/全黑暗 ❌ 需补光 ✅ 不受影响 ✅ 不受影响
隐私 ✅ 无图像 ❌ 录制视频 ✅ 无图像 ✅ 无图像
误报率 ✅ 低(区分生命/物体) ⚠️ 中(混淆玩偶/包) ❌ 高(风/虫) ⚠️ 中(重物误触发)
检测类型 生命体征(呼吸) 视觉识别 运动/体积变化 重量变化
Euro NCAP 合规 ✅ 满足 <13s 响应 ⚠️ 部分场景受限 ❌ 不推荐 ❌ 不推荐
成本 $8-15/模块 $5-12 $3-8 $2-5

3. Channel Impulse Response (CIR) 算法

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
"""
UWB CPD 信号处理算法

核心: 从 Channel Impulse Response (CIR) 中提取微动呼吸信号
CIR 可视为车内3D地形图的时间切片

数据流:
原始 UWB 回波 → CIR 序列 → 静态背景消除 →
微动信号提取 → 频域分析 → 生命体征判定
"""

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

class UWBCPDProcessor:
"""
UWB CPD 信号处理器

按 Euro NCAP 要求:
- 响应时间 < 13 秒
- 检测率 > 99%
- 误报率 < 1%
"""

# 婴儿呼吸频率范围 (次/分钟)
INFANT_BREATHING_RANGE = (20, 40)
# 成人呼吸频率范围
ADULT_BREATHING_RANGE = (12, 20)

def __init__(self, fs=100, n_samples=512):
"""
Args:
fs: CIR 采样率 (Hz), 每秒采集 100 个 CIR 快照
n_samples: 每个 CIR 快照的采样点数
"""
self.fs = fs
self.n_samples = n_samples
# 静态背景缓存
self.background = None
self.background_count = 0

def update_background(self, cir_snapshot):
"""更新静态背景模型"""
if self.background is None:
self.background = cir_snapshot.copy()
self.background_count = 1
else:
# 指数移动平均
alpha = 0.95
self.background = alpha * self.background + (1 - alpha) * cir_snapshot
self.background_count += 1

def extract_micro_motion(self, cir_sequence):
"""
从 CIR 序列中提取微动信号

Args:
cir_sequence: (n_frames, n_samples) CIR 时间序列
Returns:
motion_signal: (n_frames,) 微动强度序列
"""
# 1. 静态背景减除
if self.background is not None:
diff = cir_sequence - self.background
else:
diff = cir_sequence - np.mean(cir_sequence, axis=0)

# 2. 沿距离轴取绝对值并求和
motion_signal = np.sum(np.abs(diff), axis=1)

# 3. 带通滤波 (0.1-1.5 Hz, 对应 6-90 次/分呼吸)
motion_signal = self._bandpass(motion_signal, 0.1, 1.5)

return motion_signal

def detect_breathing(self, motion_signal, duration_sec=10):
"""
检测呼吸信号

Args:
motion_signal: 微动信号序列
duration_sec: 分析窗口长度
Returns:
result: dict with detection info
"""
window_samples = int(duration_sec * self.fs)
if len(motion_signal) < window_samples:
return {'detected': False, 'reason': 'insufficient_data'}

# 取最近窗口
signal = motion_signal[-window_samples:]

# FFT 频域分析
freqs, power = self._compute_spectrum(signal)

# 检查呼吸频率范围
infant_mask = (
(freqs >= self.INFANT_BREATHING_RANGE[0] / 60) &
(freqs <= self.INFANT_BREATHING_RANGE[1] / 60)
)
adult_mask = (
(freqs >= self.ADULT_BREATHING_RANGE[0] / 60) &
(freqs <= self.ADULT_BREATHING_RANGE[1] / 60)
)

infant_power = np.sum(power[infant_mask])
adult_power = np.sum(power[adult_mask])
total_power = np.sum(power) + 1e-10

# 信噪比判断
snr = (infant_power + adult_power) / total_power

# 找到主频
if np.any(infant_mask) and infant_power > 0:
peak_freq = freqs[infant_mask][np.argmax(power[infant_mask])]
peak_bpm = peak_freq * 60
else:
peak_bpm = 0

result = {
'detected': snr > 0.3,
'snr': snr,
'peak_bpm': peak_bpm,
'infant_power': infant_power,
'adult_power': adult_power,
'duration_analyzed': duration_sec
}

return result

def _bandpass(self, signal, low, high):
"""带通滤波"""
nyq = self.fs / 2
b, a = butter(4, [low / nyq, high / nyq], btype='band')
return filtfilt(b, a, signal)

def _compute_spectrum(self, signal):
"""计算功率谱"""
n = len(signal)
freqs = np.fft.rfftfreq(n, 1 / self.fs)
fft_vals = np.fft.rfft(signal * np.hanning(n))
power = np.abs(fft_vals) ** 2
return freqs, power


# ============================================
# 完整 CPD 系统模拟
# ============================================

def simulate_cpd_scenario():
"""模拟 CPD 检测场景"""
fs = 100 # 100 Hz CIR 采样
duration = 15 # 15 秒数据
n_samples = 512 # 每个CIR快照512点

processor = UWBCPDProcessor(fs=fs, n_samples=n_samples)

# 场景1: 空车 (只有静态背景)
print("=== 场景1: 空车 ===")
noise = np.random.normal(0, 0.01, (duration * fs, n_samples))
motion = processor.extract_micro_motion(noise)
result = processor.detect_breathing(motion, duration_sec=10)
print(f"检测到生命: {result['detected']}")
print(f"SNR: {result['snr']:.4f}")

# 场景2: 有婴儿 (模拟呼吸微动)
print("\n=== 场景2: 婴儿呼吸 ===")
breathing_freq = 30 / 60 # 30次/分 = 0.5 Hz
t = np.arange(duration * fs) / fs
breathing_signal = 0.05 * np.sin(2 * np.pi * breathing_freq * t)

# 将呼吸信号注入特定距离bin
cir_with_breathing = noise.copy()
target_bin = 200 # 模拟2米处
cir_with_breathing[:, target_bin] += breathing_signal

motion = processor.extract_micro_motion(cir_with_breathing)
result = processor.detect_breathing(motion, duration_sec=10)
print(f"检测到生命: {result['detected']}")
print(f"SNR: {result['snr']:.4f}")
print(f"主频: {result['peak_bpm']:.1f} BPM")

# 场景3: 被毯子覆盖的婴儿 (信号衰减)
print("\n=== 场景3: 毯子覆盖婴儿 ===")
attenuated_signal = breathing_signal * 0.3 # 信号衰减70%
cir_covered = noise.copy()
cir_covered[:, target_bin] += attenuated_signal
motion = processor.extract_micro_motion(cir_covered)
result = processor.detect_breathing(motion, duration_sec=10)
print(f"检测到生命: {result['detected']}")
print(f"SNR: {result['snr']:.4f}")
print(f"主频: {result['peak_bpm']:.1f} BPM")


if __name__ == "__main__":
simulate_cpd_scenario()

4. NXP Trimension NCJ29D6 芯片架构

参数 规格
芯片型号 NXP Trimension NCJ29D6
技术 单芯片 UWB 收发器 + 安全测距 + 短距雷达
频段 6.5-8 GHz UWB
功能 CPD 生命检测 + 数字钥匙 + 脚踢感应 + 入侵报警
量产客户 BMW Group (2026 年款车型)
特点 首个单片汽车 UWB 方案,安全测距+雷达合一
安全认证 符合 Euro NCAP CPD 协议

5. YFORE UWB CPD 方案参数

参数 数值
生命检测率 > 99%
信号泄漏 < 20 cm (窗外不误触发)
响应时间 < 13 秒 (Euro NCAP 要求)
穿透能力 穿透毯子、衣物、高座椅背
安装位置 车内顶棚/B柱/座椅
集成功能 CPD + 乘员分类 + eCall 坐标报告

IMS 开发启示

1. UWB CPD 技术路线选择

方案 优势 劣势 适用场景
NXP NCJ29D6 单芯片集成、BMW量产验证 需NDA获取SDK 跟随BMW路线
YFORE UWB 多功能集成、99%检测率 Tier-1定制方案 直接采购模块
自研UWB 灵活定制 研发周期长 有算法能力的团队
60GHz mmWave 高分辨率、已有TI/IWR平台 功耗较高 雷达+视觉融合

2. 系统架构建议

3. Euro NCAP CPD 测试场景对应

NCAP 场景 描述 UWB 应对方案
CPD-01 6个月婴儿假人,后向安全座椅 ✅ 呼吸检测,穿透安全座椅覆盖
CPD-02 3岁儿童假人,前向安全座椅 ✅ 胸部微动检测
CPD-03 儿童毯子覆盖 ✅ UWB 穿透毯子检测呼吸
CPD-04 成人后排座椅 ✅ 区分成人/儿童呼吸频率
CPD-05 空车(无乘员) ✅ 低SNR,不触发
CPD-06 后备箱/脚部空间 ⚠️ 需补装传感器

4. 部署优先级

优先级 任务 目标
P0 UWB 传感器选型与采购 NXP NCJ29D6 评估板
P0 CIR 采集与背景减除算法 误报率 <1%
P0 呼吸频率匹配算法 检测率 >99%
P1 多传感器覆盖布局 全座位覆盖
P1 eCall 集成 精确座位报告
P2 与 OMS 视觉融合 雷达+视觉双重确认

5. 供应链信息

供应商 产品 状态 联系方式
NXP Trimension NCJ29D6 BMW 量产中 官网申请评估板
YFORE UWB CPD 模块 30+ OEM 合作 www.yftech.com
NOVELIC mmWave CPD 2026 量产 Euro NCAP 合规
TI IWR6843AOP 60GHz 评估阶段 60GHz CPD 方案

与 60GHz mmWave 方案对比

维度 UWB (6.5-8 GHz) 60GHz mmWave
穿透性 ✅ 强(穿透毯子/座椅) ⚠️ 中等
分辨率 ~10cm ~5cm
功耗 < 50mW ~300mW
成本 $8-15 $15-25
量产验证 BMW 2026 量产 评估阶段
法规合规 ✅ Euro NCAP 推荐 ⚠️ 待确认
多目标区分 ⚠️ 一般 ✅ 优秀

总结

UWB 雷达已成为 CPD 的事实标准技术路线:

  1. BMW + NXP 量产验证,行业标杆
  2. YFORE 多场景方案,99% 检测率
  3. 穿透性强,解决毯子/座椅遮挡痛点
  4. 隐私友好,无图像录制
  5. Euro NCAP 合规,<13s 响应时间

对 IMS 团队的核心建议:

  • 优先评估 NXP NCJ29D6 方案,获取评估板进行 CIR 算法验证
  • CIR 背景减除 + 呼吸频率匹配是核心算法模块
  • 与 60GHz mmWave 方案做 A/B 对比后确定最终路线
  • 多传感器布局需覆盖所有座位 + 脚部空间 + 后备箱

技术来源: NXP Trimension NCJ29D6 | YFORE UWB | RF Wireless World UWB CPD