Euro NCAP 2026 CPD 深度解读:从协议要求到雷达生命体征检测技术落地

Euro NCAP 2026 CPD 深度解读:从协议要求到雷达生命体征检测技术落地

论文/法规信息

项目 内容
法规 Euro NCAP 2026 CPD Test and Assessment Protocol
版本 v1.2
发布机构 Euro NCAP
生效时间 2026年1月
关联论文 Nazri et al., “In-Vehicle Child Presence Detection Using 60GHz Radar”, 2025
关联论文 Tambwekar et al., “3D Posture Estimation Using Depth and IR Images”, Sensors 2024
关联论文 “A radar vital signs detection method in complex environments”, Scientific Reports 2026
关联论文 “Preliminary Studies on mm-Wave Radar for Vital Sign Monitoring of Driver”, Springer 2024

核心创新/要点

Euro NCAP 2026 对 CPD(Child Presence Detection,儿童遗留检测)提出了直接检测要求,彻底淘汰间接方案(如后门提醒)。必须通过运动、呼吸、心跳等生理信号确认儿童存在,并在严格时限内触发警告和干预。

1. Euro NCAP 2026 CPD 协议核心要求

1.1 检测场景(必须覆盖两大场景)

场景编号 场景描述 典型案例
S-01 儿童被遗留在锁车内 家长锁车离开,儿童在后排熟睡
S-02 儿童进入未锁车辆被困 儿童自行进入车内,门关闭后无法打开

1.2 检测范围要求

检测区域 要求 备注
所有座椅位置 ✅ 必须覆盖 含可选/可拆卸座椅
脚部空间 ✅ 必须覆盖 儿童可能蜷缩在脚部
驾驶员座椅 ✅ 必须覆盖 偶发场景
行李箱 ❌ 不要求 明确排除

1.3 直接检测方法要求

间接方法不再得分:

  • 后门开关提醒(”Did you check the back seat?”)
  • 基于门开关顺序的推断
  • 假设推理(”如果后门开过,可能有儿童”)

必须使用的直接检测方法:

生理信号 检测原理 适用传感器
运动 肢体微动、翻身 雷达/摄像头/压力传感器
呼吸 胸腔起伏(0.2-0.6Hz) 60GHz FMCW雷达/压力传感器
心跳 心脏搏动(0.8-2.0Hz) 高精度雷达

1.4 检测目标

  • 年龄范围: ≤6岁儿童
  • 默认状态: 每次行程开始时默认开启(Default ON)
  • 不需要手动激活

1.5 警告时序要求(精确到秒)

sequenceDiagram
    participant V as 车辆
    participant C as 儿童
    participant D as 驾驶员/监护人
    participant App as 手机App

    Note over V,C: 车辆锁定,检测到儿童
    V->>V: 15秒内触发初始警告
    V->>D: 声音/灯光警报(≥3秒)
    Note over V: 驾驶员可延迟一次(≤10分钟)
    
    alt 儿童持续存在
        V->>V: 90秒内开始升级警告
        V->>D: 每1分钟重复警报(≥15秒)
        V->>D: 持续至少20分钟
        V->>App: 推送通知(可选通道)
        V->>V: 显示"检查座椅"信息
    end

    Note over V: 干预措施(满分5分必须)
    V->>V: 10分钟内启动空调
    V->>V: 解锁车门
    V->>App: 发送紧急通知

锁车场景时序表

时间节点 动作 要求
T+0s 检测到儿童 传感器确认生理信号
T+15s 初始警告 车外声音/灯光,≥3秒
T+15s~10min 可延迟一次 需要刻意操作,≤10分钟
初始警告后90s 升级警告 开始持续警报
每1分钟 重复警告 ≥15秒,持续≥20分钟
T+10min 干预措施 空调/解锁/通知

未锁车场景时序表

时间节点 动作 要求
T+0s 门关闭+检测到儿童 传感器确认
T+10min 初始警告 必须在此时间内
后续 同锁车升级流程 同上

1.6 满分5分要求

功能 基础分 满分要求
儿童检测 2分 直接检测,覆盖所有座椅
警告时序 1分 满足15s/10min时序
升级警告 1分 持续≥20min,每分钟≥15s
干预措施 1分 空调+解锁+通知

2. 60GHz FMCW雷达:CPD核心技术方案

2.1 为什么选择60GHz雷达?

对比维度 60GHz雷达 77GHz雷达 摄像头 压力传感器
穿透毛毯 ⚠️ 受限
暗光环境
隐私保护
呼吸检测
心跳检测 ⚠️ 过度
成本 ~$5-10 ~$15-25 ~$8-15 ~$2-5
功耗 <0.5W 1-3W 0.5-2W <0.1W
法规频段 57-64GHz 76-81GHz N/A N/A

60GHz优势:

  • 波长5mm,对胸腔微动(0.1-1mm呼吸位移)灵敏度最优
  • 穿透毛毯/衣物能力强
  • 成本低于77GHz方案
  • 不占用ADAS雷达频段(避免干扰)

2.2 TI AWRL6432 方案详解

参数 规格
芯片型号 AWRL6432
频段 57-64GHz
天线配置 3TX / 4RX
帧率 可配置,CPD典型10-20fps
距离分辨率 ~4cm(4GHz带宽)
功耗 <300mW
接口 SPI/UART/CAN
成本 ~$5-8(量产)
芯片工艺 28nm RF CMOS
内置加速 硬件FFT + DSP

2.3 FMCW雷达信号处理流程

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
243
244
245
246
247
248
249
"""
FMCW雷达CPD信号处理流程
基于TI AWR系列雷达芯片

参考:TI AWRL6432 Application Note
Nazri et al., 2025
"""

import numpy as np
from typing import Tuple, Optional

class FMCW_CPD_Processor:
"""
FMCW雷达CPD信号处理器

用于检测车内儿童存在的信号处理流程
支持呼吸/心跳/运动三种检测模式
"""

def __init__(self, config: dict):
"""
初始化处理器

Args:
config: 配置字典
- fc: 载频 (Hz), 60GHz
- bw: 扫频带宽 (Hz), 4GHz
- tc: 扫频时间 (s)
- num_chirps: 每帧chirp数
- num_samples: 每chirp采样数
- fs: 采样率 (Hz)
"""
self.fc = config.get('fc', 60e9) # 60GHz
self.bw = config.get('bw', 4e9) # 4GHz带宽
self.tc = config.get('tc', 50e-6) # 50us扫频
self.num_chirps = config.get('num_chirps', 128)
self.num_samples = config.get('num_samples', 256)
self.fs = config.get('fs', 5e6) # 5MHz采样率

# 物理常数
self.c = 3e8 # 光速
self.lambda_val = self.c / self.fc # 波长 ~5mm

# 距离分辨率
self.range_res = self.c / (2 * self.bw) # ~3.75cm

# 速度分辨率(多普勒)
self.vel_res = self.lambda_val / (2 * self.num_chirps * self.tc)

def range_fft(self, adc_data: np.ndarray) -> np.ndarray:
"""
距离维度FFT(快时间FFT)

Args:
adc_data: ADC采样数据, shape=(num_chirps, num_samples)

Returns:
range_profile: 距离剖面, shape=(num_chirps, num_samples)

每个chirp做FFT得到距离信息
"""
# 加窗减少频谱泄漏
window = np.hanning(self.num_samples)
windowed = adc_data * window[np.newaxis, :]

# 距离FFT
range_fft = np.fft.fft(windowed, axis=1)

return range_fft

def doppler_fft(self, range_fft_data: np.ndarray) -> np.ndarray:
"""
多普勒FFT(慢时间FFT)

Args:
range_fft_data: 距离FFT结果, shape=(num_chirps, num_samples)

Returns:
range_doppler: Range-Doppler谱, shape=(num_chirps, num_samples)

跨chirp做FFT得到速度/微动信息
"""
window = np.hanning(self.num_chirps)
windowed = range_fft_data * window[:, np.newaxis]

doppler_fft = np.fft.fftshift(
np.fft.fft(windowed, axis=0),
axes=0
)

return doppler_fft

def extract_vital_signs(
self,
range_doppler: np.ndarray,
target_range_bin: int
) -> Tuple[float, float, bool]:
"""
从目标距离bin提取生命体征

Args:
range_doppler: Range-Doppler谱
target_range_bin: 目标距离bin索引

Returns:
breath_rate: 呼吸频率 (Hz)
heart_rate: 心跳频率 (Hz)
is_child: 是否判定为儿童

方法:从目标距离bin提取相位序列,
做频谱分析分离呼吸和心跳
"""
# 提取相位序列
phase_signal = np.angle(
range_doppler[:, target_range_bin]
)

# 相位解卷绕
phase_unwrapped = np.unwrap(phase_signal)

# 去趋势
phase_detrended = phase_unwrapped - np.polyval(
np.polyfit(np.arange(len(phase_unwrapped)),
phase_unwrapped, 1),
np.arange(len(phase_unwrapped))
)

# 频谱分析
N = len(phase_detrended)
freq = np.fft.fftfreq(N, d=self.tc * self.num_chirps)
spectrum = np.abs(np.fft.fft(phase_detrended))

# 只看正频率
pos_mask = freq > 0
freq_pos = freq[pos_mask]
spectrum_pos = spectrum[pos_mask]

# 呼吸频段:0.2-0.6 Hz (12-36 次/分)
breath_mask = (freq_pos >= 0.2) & (freq_pos <= 0.6)
breath_freq = freq_pos[breath_mask]
breath_spectrum = spectrum_pos[breath_mask]
breath_rate = breath_freq[np.argmax(breath_spectrum)]

# 心跳频段:0.8-2.0 Hz (48-120 次/分)
heart_mask = (freq_pos >= 0.8) & (freq_pos <= 2.0)
heart_freq = freq_pos[heart_mask]
heart_spectrum = spectrum_pos[heart_mask]
heart_rate = heart_freq[np.argmax(heart_spectrum)]

# 儿童判定逻辑
# 儿童特征:呼吸频率偏高 + 心跳偏快 + 距离bin偏近
is_child = (
breath_rate > 0.4 and # >24次/分
heart_rate > 1.2 and # >72次/分
target_range_bin < 30 # 较近距离
)

return breath_rate, heart_rate, is_child

def mcsm_target_detection(
self,
range_doppler: np.ndarray
) -> int:
"""
MCSM算法:复杂环境下的目标距离检测
参考:Scientific Reports 2026, "A radar vital signs
detection method in complex environments"

Matrix Coefficient Selection Method
基于Range-Doppler谱的矩阵系数选择,
抑制静态杂波和非周期性动态干扰

Args:
range_doppler: Range-Doppler谱

Returns:
target_bin: 目标距离bin索引
"""
# 计算Range-Doppler矩阵系数
rd_power = np.abs(range_doppler) ** 2

# 低频零设置:抑制静态杂波
center_doppler = rd_power.shape[0] // 2
rd_power[center_doppler-1:center_doppler+2, :] = 0

# 自相关方法:增强周期性目标
rd_autocorr = np.zeros_like(rd_power)
for r in range(rd_power.shape[1]):
col = rd_power[:, r]
# 归一化自相关
col_centered = col - np.mean(col)
if np.std(col) > 0:
rd_autocorr[:, r] = col_centered

# 矩阵系数 = 功率 × 自相关
mcsm_coeff = rd_power * np.abs(rd_autocorr)

# 按距离bin求和,找最大值
range_profile = np.sum(mcsm_coeff, axis=0)
target_bin = np.argmax(range_profile)

return target_bin


# 实际测试
if __name__ == "__main__":
config = {
'fc': 60e9, # 60GHz
'bw': 4e9, # 4GHz带宽
'tc': 50e-6, # 50us扫频
'num_chirps': 128, # 128 chirps/frame
'num_samples': 256, # 256 samples/chirp
'fs': 5e6 # 5MHz采样率
}

processor = FMCW_CPD_Processor(config)

print(f"距离分辨率: {processor.range_res*100:.2f} cm")
print(f"波长: {processor.lambda_val*1000:.2f} mm")

# 模拟ADC数据(含呼吸+心跳信号)
np.random.seed(42)
t_chirp = np.linspace(0, config['tc'], config['num_samples'])
t_frame = np.arange(config['num_chirps']) * config['tc']

# 模拟呼吸(0.3Hz = 18次/分)+ 心跳(1.2Hz = 72次/分)
breath_signal = 0.5 * np.sin(2 * np.pi * 0.3 * t_frame)
heart_signal = 0.05 * np.sin(2 * np.pi * 1.2 * t_frame)
vital_signal = breath_signal + heart_signal

# 生成模拟ADC数据
adc_data = np.random.randn(config['num_chirps'], config['num_samples']) * 0.1
for i in range(config['num_chirps']):
# 在目标距离bin(bin=50,约1.87m)注入信号
adc_data[i, 50] += vital_signal[i]

# 处理流程
range_fft_data = processor.range_fft(adc_data)
range_doppler = processor.doppler_fft(range_fft_data)
target_bin = processor.mcsm_target_detection(range_doppler)
breath_rate, heart_rate, is_child = processor.extract_vital_signs(
range_doppler, target_bin
)

print(f"\n检测结果:")
print(f" 目标距离bin: {target_bin} ({target_bin * processor.range_res * 100:.1f} cm)")
print(f" 呼吸频率: {breath_rate:.2f} Hz ({breath_rate*60:.1f} 次/分)")
print(f" 心跳频率: {heart_rate:.2f} Hz ({heart_rate*60:.1f} 次/分)")
print(f" 儿童判定: {'是' if is_child else '否'}")

2.4 RLS自适应谐波抑制算法

呼吸谐波是心跳检测的最大干扰。Scientific Reports 2026 论文提出的RLSRHS算法:

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
"""
RLS自适应呼吸谐波抑制算法
参考:Scientific Reports 2026, "A radar vital signs detection method
in complex environments"

核心思想:借鉴电力系统谐波抑制技术,用递归最小二乘
自适应滤波器自动追踪并消除呼吸谐波,无需手动调参
"""

import numpy as np

class RLSHarmonicSuppressor:
"""
RLS自适应呼吸谐波抑制器

工作原理:
1. 检测呼吸基频 fr
2. 估计呼吸谐波频率 2*fr, 3*fr, 4*fr...
3. 自适应滤波器自动追踪谐波分量
4. 从原始信号中减去谐波,恢复心跳信号
"""

def __init__(
self,
filter_order: int = 32,
forgetting_factor: float = 0.99,
delta: float = 1e-2
):
"""
Args:
filter_order: 滤波器阶数
forgetting_factor: 遗忘因子 λ(0.95-0.999)
delta: 初始化参数
"""
self.M = filter_order
self.lam = forgetting_factor
self.delta = delta

def process(self, signal: np.ndarray, breath_freq: float,
fs: float) -> np.ndarray:
"""
处理信号,抑制呼吸谐波

Args:
signal: 输入相位信号
breath_freq: 呼吸基频 (Hz)
fs: 采样率 (Hz)

Returns:
clean_signal: 去除谐波后的信号(主要含心跳)
"""
N = len(signal)

# 构建参考信号:呼吸基频 + 谐波
t = np.arange(N) / fs
num_harmonics = 5 # 前5阶谐波

# RLS初始化
w = np.zeros(self.M) # 滤波器权重
P = np.eye(self.M) / self.delta # 逆相关矩阵

clean_signal = np.zeros(N)

for n in range(self.M, N):
# 构建参考向量(当前和过去M个采样)
ref = np.zeros(self.M)
for h in range(1, num_harmonics + 1):
freq_h = h * breath_freq
for k in range(self.M):
if n - k >= 0:
ref[k] += (
np.cos(2 * np.pi * freq_h * (n - k) / fs) +
np.sin(2 * np.pi * freq_h * (n - k) / fs)
)

# 估计输出
y = np.dot(w, ref)

# 误差 = 期望 - 估计
e = signal[n] - y
clean_signal[n] = e

# RLS更新
Pi = P @ ref
k = Pi / (self.lam + np.dot(ref, Pi))
w = w + k * e
P = (P - np.outer(k, ref) @ P) / self.lam

return clean_signal


# 测试
if __name__ == "__main__":
fs = 20 # 20Hz等效采样率
t = np.arange(0, 30, 1/fs) # 30秒数据

# 模拟信号:呼吸(0.3Hz) + 呼吸谐波(0.6, 0.9, 1.2Hz) + 心跳(1.0Hz)
breath = 1.0 * np.sin(2 * np.pi * 0.3 * t)
harmonic2 = 0.3 * np.sin(2 * np.pi * 0.6 * t)
harmonic3 = 0.15 * np.sin(2 * np.pi * 0.9 * t)
harmonic4 = 0.08 * np.sin(2 * np.pi * 1.2 * t) # 与心跳重叠!
heartbeat = 0.05 * np.sin(2 * np.pi * 1.0 * t)
noise = 0.02 * np.random.randn(len(t))

signal = breath + harmonic2 + harmonic3 + harmonic4 + heartbeat + noise

# RLS谐波抑制
suppressor = RLSHarmonicSuppressor(
filter_order=32,
forgetting_factor=0.99
)
clean = suppressor.process(signal, breath_freq=0.3, fs=fs)

# 频谱对比
from numpy.fft import fft, fftfreq

freq = fftfreq(len(t), 1/fs)

orig_spectrum = np.abs(fft(signal))
clean_spectrum = np.abs(fft(clean))

# 心跳频段SNR对比
heart_mask = (freq >= 0.8) & (freq <= 1.3)
orig_snr = np.max(orig_spectrum[heart_mask]) / np.mean(orig_spectrum[(freq > 0.5) & (freq < 2.0)])
clean_snr = np.max(clean_spectrum[heart_mask]) / np.mean(clean_spectrum[(freq > 0.5) & (freq < 2.0)])

print(f"心跳频段SNR - 原始: {orig_snr:.2f}, 抑制后: {clean_snr:.2f}")
print(f"SNR提升: {20*np.log10(clean_snr/orig_snr):.1f} dB")

3. 车内雷达部署实践

3.1 雷达安装位置优化

基于Springer 2024论文的实验数据,5名被试、24种安装位置:

安装位置 高度 距离 HR准确率 BR准确率 综合评价
正前方仪表板 85cm 80cm 92% 95% ⭐⭐⭐⭐⭐ 最优
正前方仪表板 130cm 80cm 85% 90% ⭐⭐⭐⭐
座椅后方 85cm 20cm 88% 93% ⭐⭐⭐⭐ 适合CPD
座椅后方 130cm 20cm 82% 88% ⭐⭐⭐
侧方90° 85cm 80cm 75% 85% ⭐⭐⭐
侧方90° 130cm 80cm 68% 80% ⭐⭐

CPD场景推荐: 座椅后方+低位置(85cm),距离胸骨20cm,对后排儿童检测最优。

3.2 多雷达覆盖方案

graph TD
    A[前雷达 - 仪表板上方] --> D[覆盖: 驾驶员+副驾]
    B[后雷达 - 顶棚后部] --> E[覆盖: 后排左+右]
    C[底部雷达 - 座椅下方] --> F[覆盖: 脚部空间+儿童座椅]
    
    D --> G[融合控制器]
    E --> G
    F --> G
    G --> H[CPD决策]
    G --> I[生命体征监测]
    G --> J[乘员分类]
方案 雷达数 覆盖率 成本 推荐场景
单雷达(顶棚) 1 70% $8 入门级
双雷达(前+后) 2 90% $16 主流方案
三雷达(前+后+底) 3 98% $24 Euro NCAP满分
四雷达(四座椅独立) 4 100% $32 旗舰方案

4. 竞品方案对比

厂商 方案 频段 芯片 CPD功能 量产状态
TI AWRL6432 60GHz 自研 Edge AI CPD ✅ 2026
Infineon BGT60TR13C 60GHz 自研 呼吸+运动 ✅ 2025
Acconeer A121 60GHz 自研 精密测距+呼吸 ✅ 2025
NXP S32R45 77GHz 自研 ADAS+CPD融合 🔄 开发中
Cadence Tensilica N/A IP核 雷达信号处理 ✅ IP授权

5. IMS开发启示

5.1 CPD模块开发优先级

优先级 开发项 技术路线 预计周期 依赖
🔴 P0 60GHz雷达驱动适配 TI AWRL6432 SDK 2周 硬件到位
🔴 P0 呼吸信号提取 FMCW相位解调 3周 雷达驱动
🔴 P0 MCSM目标定位 矩阵系数选择 2周 Range-Doppler
🟡 P1 儿童vs成人分类 呼吸频率+距离 2周 呼吸提取
🟡 P1 心跳提取 RLS谐波抑制 3周 呼吸提取
🟢 P2 多雷达融合 前后雷达数据融合 4周 单雷达调试
🟢 P2 警告时序控制 状态机实现 1周 检测功能
🟢 P2 干预措施集成 空调/解锁控制 2周 车辆接口

5.2 关键技术指标

指标 Euro NCAP要求 IMS目标 验证方法
呼吸检测率 ≥95% ≥98% 静态+毛毯覆盖
心跳检测率 未要求 ≥90% 与ECG对比
检测延迟 ≤15秒 ≤10秒 从锁车到首警
误报率 ≤5% ≤2% 空车场景
毛毯穿透 必须 厚毛毯+儿童
暗光检测 必须 0 lux

5.3 开发验证清单

  • 60GHz雷达硬件选型确认(AWRL6432 vs BGT60TR13C)
  • FMCW参数配置(带宽4GHz,128 chirps/frame)
  • Range-FFT + Doppler-FFT实现
  • MCSM目标距离检测算法
  • 呼吸频率提取(0.2-0.6Hz带通)
  • RLS谐波抑制实现
  • 心跳频率提取(0.8-2.0Hz)
  • 儿童/成人分类阈值标定
  • 毛毯覆盖场景测试
  • 警告时序状态机
  • 干预措施(空调/解锁)接口
  • Euro NCAP CPD v1.2协议符合性自评

6. 总结

Euro NCAP 2026 CPD要求的直接检测原则彻底改变了技术路线——间接提醒方案不再得分,必须使用雷达/压力传感器等直接感知手段。60GHz FMCW雷达是当前最优解:

  1. 灵敏度高:5mm波长对胸腔微动响应最佳
  2. 穿透力强:毛毯/衣物全覆盖
  3. 隐私安全:无图像采集
  4. 成本可控:~$5-8量产价
  5. 技术成熟:TI/Infineon/Acconeer均有量产方案

MCSM+RLSRHS算法组合解决了复杂环境下目标定位和呼吸谐波抑制两大难题,为IMS CPD模块提供了可直接落地的技术方案。


参考链接:


Euro NCAP 2026 CPD 深度解读:从协议要求到雷达生命体征检测技术落地
https://dapalm.com/2026/07/04/2026-07-04-euro-ncap-2026-cpd-deep-dive-radar-vital-signs-zh/
作者
Mars
发布于
2026年7月4日
许可协议