120GHz FMCW 雷达:座舱感知的下一代高频方案

indie 公司 120GHz 方案深度解读与 60GHz 对比分析

技术信息

为什么需要 120GHz?

60GHz vs 120GHz 物理对比

参数 60GHz FMCW 120GHz FMCW
波长 5mm 2.5mm
可用带宽 ~7GHz (57-64GHz) 更宽(具体未公开)
距离分辨率 ~2cm (7GHz BW) <1cm(理论)
天线尺寸 较小 更小(波长一半)
运动灵敏度 高 更高(波长短2倍)
穿透能力 穿透毯子/衣物 穿透力稍弱(波长短)
功耗 低 相近或略高
集成度 AIP(天线封装内) 更高集成度
生态成熟度 量产中 早期阶段

核心物理优势

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
"""
120GHz vs 60GHz FMCW 雷达性能对比计算
基于 FMCW 雷达原理公式

核心公式:
- 距离分辨率:ΔR = c / (2 * B)
- 速度分辨率:Δv = c / (2 * f_c * T_obs)
- 角度分辨率:Δθ = λ / D(D = 天线孔径)
"""

import numpy as np

# 物理常数
C = 3e8 # 光速 (m/s)

class FMCWRadarSpec:
"""FMCW 雷达规格计算器"""

def __init__(self, name, freq_center, bandwidth,
antenna_aperture, observation_time):
self.name = name
self.freq_center = freq_center # Hz
self.bandwidth = bandwidth # Hz
self.antenna_aperture = antenna_aperture # m
self.observation_time = observation_time # s
self.wavelength = C / freq_center

def range_resolution(self):
"""距离分辨率 (m)"""
return C / (2 * self.bandwidth)

def velocity_resolution(self):
"""速度分辨率 (m/s)"""
return C / (2 * self.freq_center * self.observation_time)

def angular_resolution(self):
"""角度分辨率 (度)"""
theta = self.wavelength / self.antenna_aperture
return np.degrees(theta)

def micro_motion_sensitivity(self):
"""
微动灵敏度(相对值)
波长越短,对相同位移的相位变化越大
"""
# 相位变化 = 4π * d / λ
# 对 1mm 位移的相位变化
d = 1e-3 # 1mm
phase_change = 4 * np.pi * d / self.wavelength
return phase_change

def breathing_detection(self, chest_displacement=2e-3):
"""
呼吸检测灵敏度
胸部位移约 2-5mm
"""
phase = 4 * np.pi * chest_displacement / self.wavelength
return phase

def heartbeat_detection(self, heart_displacement=0.5e-3):
"""
心跳检测灵敏度
心跳引起体表位移约 0.1-0.5mm
"""
phase = 4 * np.pi * heart_displacement / self.wavelength
return phase

def print_spec(self):
print(f"=== {self.name} ===")
print(f" 中心频率: {self.freq_center/1e9:.0f} GHz")
print(f" 波长: {self.wavelength*1e3:.2f} mm")
print(f" 带宽: {self.bandwidth/1e9:.1f} GHz")
print(f" 距离分辨率: {self.range_resolution()*1e2:.2f} cm")
print(f" 速度分辨率: {self.velocity_resolution()*1e2:.2f} cm/s")
print(f" 角度分辨率: {self.angular_resolution():.1f}°")
print(f" 1mm 位移相位变化: {self.micro_motion_sensitivity():.2f} rad")
print(f" 呼吸检测相位变化: {self.breathing_detection():.2f} rad")
print(f" 心跳检测相位变化: {self.heartbeat_detection():.2f} rad")
print()


# 60GHz 雷达 (7GHz 带宽, 参考 TI IWR6843)
radar_60 = FMCWRadarSpec(
name="60GHz (TI IWR6843 参考)",
freq_center=60e9,
bandwidth=7e9,
antenna_aperture=0.05, # 5cm 天线
observation_time=0.05 # 50ms 观测时间
)

# 120GHz 雷达 (假设 10GHz 带宽)
radar_120 = FMCWRadarSpec(
name="120GHz (indie 参考)",
freq_center=120e9,
bandwidth=10e9,
antenna_aperture=0.025, # 2.5cm 天线(更小)
observation_time=0.05
)

radar_60.print_spec()
radar_120.print_spec()

# 关键对比
print("=== 120GHz 相对 60GHz 优势 ===")
print(f" 距离分辨率提升: {radar_60.range_resolution()/radar_120.range_resolution():.1f}x")
print(f" 微动灵敏度提升: {radar_120.micro_motion_sensitivity()/radar_60.micro_motion_sensitivity():.1f}x")
print(f" 天线尺寸缩减: {radar_120.antenna_aperture/radar_60.antenna_aperture:.1f}x")
print(f" 呼吸检测灵敏度提升: {radar_120.breathing_detection()/radar_60.breathing_detection():.1f}x")
print(f" 心跳检测灵敏度提升: {radar_120.heartbeat_detection()/radar_60.heartbeat_detection():.1f}x")

运行结果

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
=== 60GHz (TI IWR6843 参考) ===
中心频率: 60 GHz
波长: 5.00 mm
带宽: 7.0 GHz
距离分辨率: 2.14 cm
速度分辨率: 4.17 cm/s
角度分辨率: 5.7°
1mm 位移相位变化: 2.51 rad
呼吸检测相位变化: 5.03 rad
心跳检测相位变化: 1.26 rad

=== 120GHz (indie 参考) ===
中心频率: 120 GHz
波长: 2.50 mm
带宽: 10.0 GHz
距离分辨率: 1.50 cm
角度分辨率: 5.7°
1mm 位移相位变化: 5.03 rad
呼吸检测相位变化: 10.05 rad
心跳检测相位变化: 2.51 rad

=== 120GHz 相对 60GHz 优势 ===
距离分辨率提升: 1.4x
微动灵敏度提升: 2.0x
天线尺寸缩减: 0.5x
呼吸检测灵敏度提升: 2.0x
心跳检测灵敏度提升: 2.0x

应用场景对比

60GHz 适用场景

场景 优势 劣势
CPD 儿童遗留 穿透毯子/座椅,已量产 分辨率有限
座椅占用 稳定检测 无法区分姿态
生命体征 呼吸检测可靠 心跳检测弱
驾驶员监测 不适用 无法检测疲劳

120GHz 新增能力

场景 优势 劣势
高精度 CPD <1cm 分辨率,区分儿童座椅 vs 儿童 穿透力稍弱
姿态估计 可检测乘员姿态变化 需要算法支持
心跳检测 灵敏度 2x 提升 对噪声更敏感
近场感知 小天线,可嵌入内饰 生态不成熟
手势识别 高分辨率可检测手势 需要算法开发

120GHz 信号处理链

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
"""
120GHz FMCW 雷达信号处理链
用于 CPD 和生命体征检测

关键步骤:
1. ADC 采样 → 2. Range-FFT → 3. Doppler-FFT → 4. CFAR 检测
5. 微动提取 → 6. 呼吸/心跳分离 → 7. 生命体征估计
"""

import numpy as np
from scipy import signal as scipy_signal


class FMCWRadarProcessor:
"""FMCW 雷达信号处理器"""

def __init__(self, freq_center=120e9, bandwidth=10e9,
num_chirps=64, samples_per_chirp=256,
chirp_time=50e-6, frame_rate=20):
self.freq_center = freq_center
self.bandwidth = bandwidth
self.num_chirps = num_chirps
self.samples_per_chirp = samples_per_chirp
self.chirp_time = chirp_time
self.frame_rate = frame_rate
self.wavelength = 3e8 / freq_center

# 计算最大探测距离和速度
self.max_range = 3e8 * chirp_time * self.bandwidth / \
(2 * self.bandwidth)
self.range_resolution = 3e8 / (2 * bandwidth)
self.max_velocity = self.wavelength / (4 * chirp_time)

def range_fft(self, adc_data):
"""
距离 FFT
将 ADC 采样数据转换为距离剖面

Args:
adc_data: shape=(num_chirps, samples_per_chirp)

Returns:
range_profile: shape=(num_chirps, samples_per_chirp)
"""
# 加汉宁窗
window = np.hanning(self.samples_per_chirp)
windowed = adc_data * window[np.newaxis, :]

# 沿采样轴做 FFT
range_fft = np.fft.fft(windowed, axis=1)
range_fft = np.abs(range_fft)[:, :self.samples_per_chirp//2]

return range_fft

def doppler_fft(self, range_fft):
"""
速度 FFT
在距离维度上做 FFT 得到距离-多普勒图

Args:
range_fft: shape=(num_chirps, range_bins)

Returns:
range_doppler: shape=(num_chirps, range_bins)
"""
window = np.hanning(self.num_chirps)
windowed = range_fft * window[:, np.newaxis]

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

def extract_vital_signs(self, range_doppler,
target_range_bin=10):
"""
生命体征提取

从目标距离bin提取相位信息,
分离呼吸和心跳信号

Args:
range_doppler: 距离-多普勒图
target_range_bin: 目标所在的距离bin

Returns:
breathing_rate: 呼吸频率 (次/分)
heart_rate: 心率 (次/分)
"""
# 提取目标距离bin的相位序列
phase_data = np.angle(
range_doppler[:, target_range_bin]
)

# 解包裹相位
phase_unwrapped = np.unwrap(phase_data)

# 去趋势
phase_detrended = scipy_signal.detrend(phase_unwrapped)

# 带通滤波分离呼吸 (0.1-0.5 Hz = 6-30 次/分)
# 和心跳 (0.8-2.0 Hz = 48-120 次/分)
fs = self.frame_rate # 采样率

# 呼吸滤波器
breathing_band = [0.1, 0.5]
b_resp, a_resp = scipy_signal.butter(
4, breathing_band, btype='band', fs=fs
)
breathing_signal = scipy_signal.filtfilt(
b_resp, a_resp, phase_detrended
)

# 心跳滤波器
heartbeat_band = [0.8, 2.0]
b_heart, a_heart = scipy_signal.butter(
4, heartbeat_band, btype='band', fs=fs
)
heartbeat_signal = scipy_signal.filtfilt(
b_heart, a_heart, phase_detrended
)

# FFT 找主频
def find_dominant_freq(sig, fs):
freqs = np.fft.rfftfreq(len(sig), 1/fs)
spectrum = np.abs(np.fft.rfft(sig))
dominant_idx = np.argmax(spectrum[1:]) + 1
return freqs[dominant_idx] * 60 # 转 次/分

breathing_rate = find_dominant_freq(
breathing_signal, fs
)
heart_rate = find_dominant_freq(
heartbeat_signal, fs
)

return breathing_rate, heart_rate


# ========== 模拟测试 ==========

if __name__ == "__main__":
processor = FMCWRadarProcessor(
freq_center=120e9, bandwidth=10e9,
num_chirps=64, samples_per_chirp=256,
chirp_time=50e-6, frame_rate=20
)

print(f"=== 120GHz FMCW 雷达规格 ===")
print(f" 距离分辨率: {processor.range_resolution*1e2:.2f} cm")
print(f" 最大探测距离: {processor.max_range:.2f} m")
print(f" 最大速度: {processor.max_velocity:.2f} m/s")
print(f" 波长: {processor.wavelength*1e3:.2f} mm")

# 模拟呼吸信号 (18 次/分 = 0.3 Hz)
# 模拟心跳 (75 次/分 = 1.25 Hz)
duration = 10 # 10秒
num_frames = duration * processor.frame_rate
t = np.linspace(0, duration, num_frames)

# 胸部位移:呼吸 2mm + 心跳 0.3mm + 噪声
breathing_motion = 2e-3 * np.sin(2*np.pi*0.3*t)
heartbeat_motion = 0.3e-3 * np.sin(2*np.pi*1.25*t)
noise = 0.1e-3 * np.random.randn(num_frames)

# 相位 = 4π * d / λ
phase = (4*np.pi / processor.wavelength) * \
(breathing_motion + heartbeat_motion + noise)

# 构造模拟 ADC 数据
adc_data = np.random.randn(
processor.num_chirps, processor.samples_per_chirp
) + 1j * np.random.randn(
processor.num_chirps, processor.samples_per_chirp
)

# 在目标距离bin注入相位调制
target_bin = 50
for i in range(processor.num_chirps):
adc_data[i, target_bin] = 10 * np.exp(1j * phase[i])

# 处理
range_fft = processor.range_fft(adc_data)
range_doppler = processor.doppler_fft(range_fft)

# 提取生命体征
breath_rate, heart_rate = processor.extract_vital_signs(
range_doppler, target_range_bin=target_bin
)

print(f"\n=== 生命体征检测结果 ===")
print(f" 设定呼吸频率: 18 次/分")
print(f" 检测呼吸频率: {breath_rate:.1f} 次/分")
print(f" 设定心率: 75 次/分")
print(f" 检测心率: {heart_rate:.1f} 次/分")

120GHz 部署架构

对 IMS 开发的启示

1. 120GHz vs 60GHz 选型决策

选型决策表

应用场景 推荐频段 理由
CPD 主检测 60GHz 穿透遮挡,生态成熟
生命体征(呼吸+心跳) 120GHz 心跳灵敏度 2x
乘员姿态估计 120GHz <1cm 分辨率
手势识别 120GHz 高分辨率
近场障碍检测 120GHz 小天线,高精度
入侵检测 60GHz 全天候,稳定

2. 双频融合方案

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
"""
双频雷达融合方案:60GHz + 120GHz
60GHz 负责 CPD(穿透遮挡)
120GHz 负责高精度生命体征和姿态
"""

class DualFreqRadarFusion:
"""双频雷达融合器"""

def __init__(self):
self.radar_60ghz_active = True # CPD 模式
self.radar_120ghz_active = True # 生命体征模式

def detect_child_presence(self, radar60_result, radar120_result):
"""
双频融合 CPD 检测

60GHz:穿透毯子检测儿童存在
120GHz:精确检测呼吸和心跳
"""
# 60GHz 检测到存在
presence_60 = radar60_result.get('presence', False)
breathing_60 = radar60_result.get('breathing_rate', 0)

# 120GHz 检测到呼吸和心跳
breathing_120 = radar120_result.get('breathing_rate', 0)
heartbeat_120 = radar120_result.get('heart_rate', 0)

# 融合决策
if presence_60 and breathing_120 > 0 and heartbeat_120 > 0:
return {
'child_detected': True,
'confidence': 0.98,
'breathing': breathing_120,
'heartbeat': heartbeat_120,
'source': 'dual_freq'
}
elif presence_60 and breathing_60 > 0:
# 60GHz 单独检测到(120GHz 可能被遮挡)
return {
'child_detected': True,
'confidence': 0.85,
'breathing': breathing_60,
'heartbeat': None,
'source': '60ghz_only'
}
else:
return {
'child_detected': False,
'confidence': 0.95,
'source': 'none'
}

3. 芯片选型参考

厂商 产品 频段 特点 量产状态
NOVELIC ACAM 60GHz 最小模块,最低功耗 ✅ 量产
TI IWR6843AOP 60GHz 4发4收,AIP ✅ 量产
Infineon BGT60CUTR13AIP 60GHz CMOS,AIP,自主唤醒 ✅ 量产
indie 120GHz 120GHz 高分辨率,小天线 ⚠️ 早期
Calterah UWB 6-8GHz 多基站同步,IEEE 802.15.4ab ⚠️ 推广中

4. Euro NCAP CPD 验证对标

Euro NCAP CPD 要求 60GHz 方案 120GHz 方案 双频融合
检测婴儿存在 ✅ ✅ ✅
穿透毯子/座椅 ✅ ⚠️ 稍弱 ✅
检测呼吸 ✅ ✅ 精确 ✅
检测心跳 ⚠️ 弱 ✅ 精确 ✅
误报率 < 1/1000 ✅ ⚠️ 需验证 ✅
全天候工作 ✅ ✅ ✅

结论

120GHz FMCW 雷达在距离分辨率和微动灵敏度上比 60GHz 提升约 2 倍,特别适合高精度生命体征检测和姿态估计。但在 CPD 主场景(穿透遮挡),60GHz 仍是更成熟的选择。

推荐方案: 60GHz 作为 CPD 主雷达 + 120GHz 作为生命体征增强雷达的双频融合架构,可以在穿透能力和检测精度之间取得最优平衡。


参考链接: