60GHz 雷达 CPD 儿童存在检测实现方案

60GHz 雷达 CPD 儿童存在检测实现方案

核心问题

Euro NCAP 2026 强制要求: 所有新车必须配备儿童存在检测(CPD)系统,在儿童被遗留车内时发出警报。

技术挑战:

  • 儿童体型小、呼吸微弱,传统传感器难以检测
  • 座椅遮挡、毛毯覆盖导致视觉方案失效
  • 极端温度环境(-40°C 至 +85°C)可靠性要求
  • 误报率必须 < 1%(避免警报疲劳)

解决方案: 60GHz 毫米波雷达凭借穿透性强、微动检测精度高的特点,成为 CPD 主流方案。


技术背景

为什么选择 60GHz?

频段 波长 穿透性 分辨率 成本 CPD适用性
24GHz 12.5mm ❌ 分辨率不足
60GHz 5mm ✅ 最佳平衡
77GHz 4mm 极高 ⚠️ 过度设计
79GHz 3.8mm 极高 ⚠️ 成本过高

60GHz 优势:

  1. 波长 5mm:与儿童胸腔微动(mm级)匹配,分辨率适中
  2. 穿透毛毯/座椅:不受遮挡影响
  3. 多普勒敏感:可检测呼吸、心跳等微弱信号
  4. 成本可控:TI/Infineon 方案已量产

硬件架构

TI IWR6843AOP 方案

芯片特性:

  • 4 发 4 收天线阵列
  • 60-64GHz 工作频段
  • 集成 DSP + MCU(C674x + R4F)
  • 功耗 < 1.5W
  • 支持 4 个级联(扩展覆盖范围)

开发板:

  • IWR6843ISK-ODS(顶发射天线,适合车顶安装)
  • MMWAVEICBOOST(底板,支持以太网输出)

Infineon BGT60ATR24C 方案

芯片特性:

  • 2 发 4 收天线
  • 60GHz 单芯片
  • 低功耗模式 < 100mW
  • 集成 ADC + DSP

优势:

  • 成本更低(单芯片方案)
  • 功耗更低(适合常电运行)
  • 尺寸更小(适合嵌入式集成)

核心算法

呼吸检测原理

多普勒效应:
$$f_d = \frac{2v}{\lambda} = \frac{2v \cdot f_c}{c}$$

其中:

  • $f_d$:多普勒频移
  • $v$:目标速度(呼吸导致的胸腔运动)
  • $\lambda$:波长(60GHz 时约 5mm)
  • $f_c$:载波频率(60GHz)
  • $c$:光速

呼吸信号特征:

  • 频率:0.2-0.5 Hz(12-30 次/分钟)
  • 振幅:胸腔运动 0.5-2mm
  • 相位变化:$\Delta\phi = \frac{4\pi\Delta r}{\lambda}$

信号处理流程

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
"""
60GHz 雷达 CPD 检测算法

基于 TI IWR6843AOP 开发
支持呼吸检测 + 微动识别
"""

import numpy as np
from scipy import signal
from scipy.fft import fft, fftfreq

class RadarCPDDetector:
"""
60GHz 雷达儿童存在检测

检测流程:
1. FMCW 信号解调 → 距离-多普勒图
2. 静态杂波抑制 → 去除座椅/车身反射
3. 微动特征提取 → 呼吸/心跳信号
4. 分类判断 → 儿童/成人/无人
"""

def __init__(self, config: dict):
# 雷达参数
self.fc = 60e9 # 载波频率 60GHz
self.c = 3e8 # 光速
self.wavelength = self.c / self.fc # 波长 ~5mm

# FMCW 参数
self.bandwidth = config.get('bandwidth', 4e9) # 带宽 4GHz
self.chirp_duration = config.get('chirp_duration', 100e-6) # Chirp 周期
self.num_chirps = config.get('num_chirps', 256) # Chirp 数量
self.num_samples = config.get('num_samples', 256) # 每个 Chirp 采样点

# 呼吸检测参数
self.breathing_freq_min = 0.2 # 最小呼吸频率 Hz
self.breathing_freq_max = 0.5 # 最大呼吸频率 Hz
self.motion_threshold = config.get('motion_threshold', 0.3) # 微动阈值 mm

# 距离分辨率
self.range_resolution = self.c / (2 * self.bandwidth)
print(f"距离分辨率: {self.range_resolution*100:.2f} cm")

# 速度分辨率
self.velocity_resolution = self.wavelength / (2 * self.num_chirps * self.chirp_duration)
print(f"速度分辨率: {self.velocity_resolution*1000:.3f} mm/s")

def process_frame(self, adc_data: np.ndarray) -> dict:
"""
处理一帧雷达数据

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

Returns:
检测结果:{'detected': bool, 'type': str, 'confidence': float}
"""
# 1. 距离 FFT
range_fft = fft(adc_data, axis=1)

# 2. 多普勒 FFT
range_doppler = fft(range_fft, axis=0)

# 3. 静态杂波抑制(零多普勒通道置零)
range_doppler[:, 0] = 0

# 4. CFAR 检测
detections = self._cfar_detection(np.abs(range_doppler))

# 5. 微动特征提取
if len(detections) > 0:
breathing_signal = self._extract_breathing_signal(adc_data, detections)
breathing_freq = self._estimate_breathing_frequency(breathing_signal)

# 6. 分类判断
if breathing_freq > 0:
return {
'detected': True,
'type': 'child' if breathing_freq > 0.3 else 'adult',
'confidence': self._calculate_confidence(breathing_signal),
'breathing_rate': breathing_freq * 60, # 次/分钟
'distance': detections[0]['range']
}

return {'detected': False, 'type': 'empty', 'confidence': 0.0}

def _cfar_detection(self, range_doppler: np.ndarray) -> list:
"""
CFAR 目标检测

使用 CA-CFAR(Cell Averaging CFAR)
"""
detections = []
threshold_factor = 3.0 # 检测阈值因子

# 滑动窗口 CFAR
guard_cells = 2
training_cells = 8

for i in range(training_cells, range_doppler.shape[0] - training_cells):
for j in range(training_cells, range_doppler.shape[1] - training_cells):
# 训练窗口均值
training_region = np.concatenate([
range_doppler[i-guard_cells-training_cells:i-guard_cells, j-training_cells:j+training_cells+1].flatten(),
range_doppler[i+guard_cells+1:i+guard_cells+training_cells+1, j-training_cells:j+training_cells+1].flatten()
])
noise_level = np.mean(training_region)

# 检测
if range_doppler[i, j] > noise_level * threshold_factor:
detections.append({
'range_idx': i,
'doppler_idx': j,
'range': i * self.range_resolution,
'velocity': (j - range_doppler.shape[1]//2) * self.velocity_resolution
})

return detections

def _extract_breathing_signal(self, adc_data: np.ndarray, detections: list) -> np.ndarray:
"""
提取呼吸信号(相位变化)
"""
# 选择最强检测点
range_idx = detections[0]['range_idx']

# 提取该距离单元的相位序列
range_bin = fft(adc_data, axis=1)[:, range_idx]
phase_signal = np.angle(range_bin)

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

return phase_unwrapped

def _estimate_breathing_frequency(self, phase_signal: np.ndarray) -> float:
"""
估计呼吸频率

使用 FFT 频谱分析
"""
# 去除线性趋势
phase_detrend = signal.detrend(phase_signal)

# FFT
freq = fftfreq(len(phase_detrend), self.chirp_duration * self.num_chirps)
spectrum = np.abs(fft(phase_detrend))

# 只取正频率
pos_freq = freq[:len(freq)//2]
pos_spectrum = spectrum[:len(spectrum)//2]

# 在呼吸频率范围内寻找峰值
breathing_mask = (pos_freq >= self.breathing_freq_min) & (pos_freq <= self.breathing_freq_max)
if np.sum(breathing_mask) > 0:
breathing_spectrum = pos_spectrum * breathing_mask
peak_idx = np.argmax(breathing_spectrum)
return pos_freq[peak_idx]

return 0.0

def _calculate_confidence(self, phase_signal: np.ndarray) -> float:
"""
计算检测置信度

基于信号强度和周期性
"""
# 信号强度(相位变化幅度)
amplitude = np.max(phase_signal) - np.min(phase_signal)

# 转换为 mm(相位 → 距离)
displacement_mm = (amplitude * self.wavelength) / (4 * np.pi) * 1000

# 周期性(自相关峰值)
autocorr = np.correlate(phase_signal, phase_signal, mode='full')
autocorr_peak = np.max(autocorr[len(autocorr)//2:])
periodicity = autocorr_peak / np.sum(phase_signal**2)

# 综合置信度
confidence = min(1.0, displacement_mm / 2.0 * 0.6 + periodicity * 0.4)

return confidence


# 实际测试代码
if __name__ == "__main__":
# 配置雷达参数
config = {
'bandwidth': 4e9,
'chirp_duration': 100e-6,
'num_chirps': 256,
'num_samples': 256,
'motion_threshold': 0.3
}

# 创建检测器
detector = RadarCPDDetector(config)

# 模拟数据测试(实际使用时替换为真实 ADC 数据)
np.random.seed(42)

# 模拟呼吸信号(0.3 Hz,振幅 1mm)
t = np.linspace(0, 10, 256) # 10 秒
breathing = 1e-3 * np.sin(2 * np.pi * 0.3 * t) # 1mm 振幅

# 模拟 ADC 数据(简化模型)
phase_shift = (4 * np.pi * breathing) / detector.wavelength
adc_data = np.exp(1j * phase_shift[:, np.newaxis] * np.ones(256))

# 添加噪声
adc_data += 0.1 * (np.random.randn(256, 256) + 1j * np.random.randn(256, 256))

# 检测
result = detector.process_frame(adc_data)
print(f"\n检测结果:")
print(f" 是否检测到: {result['detected']}")
print(f" 类型: {result['type']}")
print(f" 置信度: {result['confidence']:.2f}")
print(f" 呼吸频率: {result.get('breathing_rate', 0):.1f} 次/分钟")

系统架构

软件流程

flowchart TD
    A[雷达 ADC 数据] --> B[距离 FFT]
    B --> C[多普勒 FFT]
    C --> D[静态杂波抑制]
    D --> E[CFAR 目标检测]
    
    E --> F{检测到目标?}
    F -->|否| G[返回: 无儿童]
    F -->|是| H[提取相位信号]
    
    H --> I[相位解缠]
    I --> J[频率估计]
    J --> K{呼吸频率范围?}
    
    K -->|0.2-0.5 Hz| L[计算置信度]
    K -->|其他| M[过滤噪声]
    
    L --> N{置信度 > 阈值?}
    N -->|是| O[返回: 检测到儿童]
    N -->|否| P[返回: 不确定]
    
    M --> G

硬件部署方案

flowchart LR
    subgraph 车顶模块
        A[IWR6843AOP]
        B[天线阵列]
        C[电源管理]
    end
    
    subgraph 座舱控制器
        D[信号处理]
        E[CPD 算法]
        F[决策融合]
    end
    
    subgraph 输出
        G[仪表盘警报]
        H[手机推送]
        I[云端通知]
    end
    
    A --> D
    B --> A
    C --> A
    D --> E
    E --> F
    F --> G
    F --> H
    F --> I

Euro NCAP 2026 CPD 要求

测试场景

场景编号 描述 检测时限 警报等级
CPD-01 6 月以下婴儿遗留后座 ≤ 90 秒 一级(车内)
CPD-02 1-3 岁儿童遗留后座 ≤ 60 秒 一级(车内)
CPD-03 儿童被毛毯覆盖 ≤ 90 秒 一级(车内)
CPD-04 儿童在安全座椅内 ≤ 90 秒 一级(车内)
CPD-05 多儿童遗留 ≤ 90 秒 一级 + 二级(车外)
CPD-06 极端温度环境 ≤ 60 秒 二级(车外推送)

警报等级

一级警报(车内):

  • 仪表盘声光警报
  • 鸣笛 3 次
  • 持续时间 ≤ 30 秒

二级警报(车外):

  • 手机 APP 推送
  • 短信通知
  • 云端记录(可追溯)

TI vs Infineon 方案对比

指标 TI IWR6843AOP Infineon BGT60ATR24C
天线配置 4T4R 2T4R
距离分辨率 3.75 cm 5 cm
速度分辨率 0.1 m/s 0.15 m/s
功耗 1.5W 0.8W
集成度 DSP+MCU ADC+DSP
开发板价格 $299 $199
生产成本 ~$15 ~$10
检测距离 5m 3m
软件支持 MMWAVE SDK Sens2Go
车规认证 AEC-Q100 AEC-Q100

IMS 开发启示

算法优化方向

  1. 多传感器融合

    • 雷达 + 摄像头融合提高可靠性
    • 座椅压力传感器辅助判断
    • 温度传感器联动(高温环境优先级提升)
  2. 误报抑制

    • 学习车辆静止振动特征
    • 过滤宠物/物品微动
    • 时间阈值动态调整
  3. 实时性优化

    • DSP 端部署推理
    • 降低 Chirp 数量(牺牲精度换速度)
    • 多核并行处理

部署建议

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
# 实际部署配置示例
deployment_config = {
# 硬件配置
'radar': {
'chip': 'IWR6843AOP',
'position': 'roof_center', # 车顶中央
'height': 1.8, # 安装高度 m
'tilt_angle': 30, # 俯仰角 度
},

# 算法参数
'algorithm': {
'frame_rate': 10, # 帧率 Hz
'detection_threshold': 0.7, # 置信度阈值
'breathing_range': (0.2, 0.5), # 呼吸频率 Hz
'timeout': 90, # 检测超时 秒
},

# 警报配置
'alert': {
'level1': {
'horn_count': 3,
'horn_duration': 1, # 秒
'display_duration': 30, # 秒
},
'level2': {
'push_notification': True,
'sms_alert': True,
'cloud_logging': True,
}
}
}

参考资源

  1. TI 官方文档

    • IWR6843AOP Technical Reference Manual
    • MMWAVE SDK User Guide
    • CPD Demo Application Note
  2. Infineon 文档

    • BGT60ATR24C Datasheet
    • Radar Sensing Application Note
  3. Euro NCAP

    • CPD Test Protocol v1.0
    • Assessment Protocol 2026

总结: 60GHz 雷达是 CPD 儿童检测的最佳技术选择,TI 和 Infineon 均提供成熟方案。关键在于呼吸信号提取算法和误报抑制策略。IMS 开发应优先验证雷达定位算法,再融合摄像头提升可靠性。


60GHz 雷达 CPD 儿童存在检测实现方案
https://dapalm.com/2026/06/12/2026-06-12-60GHz-Radar-CPD-Implementation/
作者
Mars
发布于
2026年6月12日
许可协议