indie 120GHz FMCW 雷达:突破短距感知极限的下一代座舱传感器(2026 深度解析)

indie 120GHz FMCW 雷达:突破短距感知极限的下一代座舱传感器

1. 背景:为什么需要 120GHz

1.1 汽车雷达频率演进

频率 主要应用 距离分辨率 模块尺寸 穿透性
24GHz 盲区检测/停车辅助 15-30cm 大 ✅ 好
77-81GHz 长距ADAS/AEB/ACC 1.88cm 中 ⚠️ 中
60GHz CPD/座舱感知 3.75cm 小 ✅ 好
120GHz 短距高精度/座舱 ~1.25cm ✅ 最小 ❌ 差

1.2 120GHz 的定位

indie Semiconductor(收购 Silicon Radar GmbH)推出 120GHz FMCW 雷达,定位为77GHz 的补充而非替代:

“Rather than replacing existing radar capabilities, 120 GHz should be deployed to complement them, enabling use cases that require precise short-range performance, smaller device footprints, and more detailed local information.”

核心价值:

优势 描述
更小天线 波长更短,天线尺寸更小,模块更紧凑
更高距离分辨率 可用带宽更大,能区分近距离目标
更高运动灵敏度 对微动更敏感(呼吸/心跳)
灵活安装 可隐藏在车身表面下,不破坏设计

2. 120GHz FMCW 雷达原理

2.1 FMCW 雷达基础

FMCW (Frequency Modulated Continuous Wave) 雷达通过发射频率线性变化的 chirp 信号,将目标距离转换为频率差(beat frequency):

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
"""
120GHz FMCW 雷达信号仿真与处理
"""

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import spectrogram
from dataclasses import dataclass
from typing import List, Tuple

@dataclass
class FMCWConfig:
"""FMCW 雷达配置"""
center_freq: float = 120e9 # 120 GHz
bandwidth: float = 12e9 # 12 GHz 带宽
chirp_duration: float = 50e-6 # chirp 持续时间 50μs
num_chirps: int = 64 # 每帧 chirp 数
sample_rate: float = 10e6 # 采样率 10 MHz
num_samples: int = 256 # 每 chirp 采样数

@property
def range_resolution(self) -> float:
"""距离分辨率 = c / (2 * BW)"""
return 3e8 / (2 * self.bandwidth)

@property
def max_range(self) -> float:
"""最大探测距离 = sample_rate * c / (2 * slope)"""
slope = self.bandwidth / self.chirp_duration
return (self.num_samples * 3e8) / (2 * slope)

@property
def wavelength(self) -> float:
"""波长 = c / f"""
return 3e8 / self.center_freq

def simulate_fmcw_if_signal(
config: FMCWConfig,
targets: List[Tuple[float, float]] # [(distance_m, velocity_mps)]
) -> np.ndarray:
"""
仿真 FMCW 中频信号

Args:
config: 雷达配置
targets: 目标列表 [(距离, 速度)]

Returns:
if_signal: shape=(num_chirps, num_samples)
"""
c = 3e8
slope = config.bandwidth / config.chirp_duration

# 时间轴
t = np.arange(config.num_samples) / config.sample_rate # 每 chirp 内时间

if_signal = np.zeros((config.num_chirps, config.num_samples), dtype=complex)

for chirp_idx in range(config.num_chirps):
# chirp 起始时间
t_chirp_start = chirp_idx * config.chirp_duration

for dist, vel in targets:
# 往返延迟
tau = 2 * dist / c

# 多普勒相位(速度引起)
doppler_phase = 2 * np.pi * 2 * vel * config.center_freq * \
t_chirp_start / c

# beat 频率
f_beat = slope * tau

# 信号幅度(简化模型:1/r^2 衰减)
amplitude = 1.0 / (1.0 + dist**2)

if_signal[chirp_idx] += amplitude * np.exp(
1j * (2 * np.pi * f_beat * t + doppler_phase)
)

# 添加噪声
noise = np.random.randn(*if_signal.shape) * 0.01
if_signal += noise + 1j * np.random.randn(*if_signal.shape) * 0.01

return if_signal

def range_doppler_processing(if_signal: np.ndarray) -> np.ndarray:
"""距离-多普勒处理"""
# 距离 FFT(沿采样轴)
range_fft = np.fft.fft(if_signal, axis=1)

# 加窗
window = np.hamming(range_fft.shape[0])[:, None]
range_fft = range_fft * window

# 多普勒 FFT(沿 chirp 轴)
rd_map = np.fft.fftshift(
np.fft.fft(range_fft, axis=0), axes=0
)

return 20 * np.log10(np.abs(rd_map) + 1e-10)


# 使用示例
if __name__ == "__main__":
config = FMCWConfig()

print(f"=== 120GHz FMCW 雷达参数 ===")
print(f"中心频率: {config.center_freq/1e9:.0f} GHz")
print(f"带宽: {config.bandwidth/1e9:.0f} GHz")
print(f"波长: {config.wavelength*1e3:.2f} mm")
print(f"距离分辨率: {config.range_resolution*100:.2f} cm")
print(f"最大探测距离: {config.max_range:.2f} m")

# 模拟目标:0.5m 处静止婴儿(呼吸微动)
targets = [
(0.5, 0.0), # 0.5m 处静止目标
(1.2, 0.0), # 1.2m 处静止目标
(2.0, 0.5), # 2.0m 处移动目标
]

if_sig = simulate_fmcw_if_signal(config, targets)
rd_map = range_doppler_processing(if_sig)

print(f"\nIF 信号 shape: {if_sig.shape}")
print(f"RD map shape: {rd_map.shape}")

# 检测目标
for i in range(rd_map.shape[1]):
range_m = i * config.range_resolution
if range_m > 0.1 and range_m < 3.0:
peak_power = np.max(rd_map[:, i])
if peak_power > 10:
dop_idx = np.argmax(rd_map[:, i])
dop = (dop_idx - rd_map.shape[0]//2)
print(f"目标: 距离={range_m:.2f}m, 功率={peak_power:.1f}dB")

2.2 120GHz vs 60GHz 物理对比

物理参数 60GHz 120GHz 影响
波长 5.0mm 2.5mm 120GHz 天线尺寸减半
可用带宽 ~4-7GHz ~10-15GHz 120GHz 距离分辨率提高 2-3 倍
大气衰减 15 dB/km 20-30 dB/km 120GHz 适合短距
穿透性(衣物/毛毯) ✅ 好 ❌ 差 60GHz 更适合穿透遮挡 CPD
微动灵敏度 ✅ 高 ✅ 更高 120GHz 对微动更敏感
模块尺寸 小 ✅ 更小 120GHz 可隐藏安装

3. 座舱感知应用

3.1 应用矩阵

应用 120GHz 适用性 理由
CPD 儿童检测 ⚠️ 中等 微动灵敏但穿透差,适合无遮挡场景
生命体征监测 ✅ 最佳 高微动灵敏度,可检测心跳微动
手势识别 ✅ 优 高距离分辨率可区分手指微动
近距离障碍物 ✅ 最佳 厘米级距离分辨率
泊车辅助 ✅ 优 短距高精度
穿透遮挡检测 ❌ 不适用 穿透性差

3.2 与 60GHz 的互补方案

graph TD
    subgraph "座舱雷达架构"
        A[60GHz ACAM 模块<br/>CPD/穿透遮挡检测]
        B[120GHz indie 模块<br/>生命体征/手势/高精度近距]
        C[融合决策层]
    end
    
    A -->|距离/微动/穿透| C
    B -->|高精度距离/手势/心跳| C
    C --> D{座舱状态}
    
    D -->|儿童遗留 + 心跳正常| E[CPD 确认]
    D -->|驾驶员手势| F[手势控制]
    D -->|微动异常| G[健康警报]

3.3 生命体征监测应用

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
"""
120GHz 雷达生命体征检测算法
利用高微动灵敏度检测呼吸和心跳
"""

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

class VitalSignsDetector:
"""
120GHz 雷达生命体征检测器

工作原理:
1. 锁定目标距离单元
2. 提取相位变化序列(相位 = 胸壁位移的 2 倍)
3. 带通滤波分离呼吸和心跳
4. 频谱分析确定频率
"""

def __init__(self, config: dict):
self.breath_band = (0.1, 0.5) # 6-30 breaths/min
self.heart_band = (0.8, 2.5) # 48-150 bpm

# Butterworth 滤波器
self.fs = config.get('frame_rate', 20) # 帧率 Hz

def extract_phase(self, if_signal: np.ndarray, range_bin: int) -> np.ndarray:
"""
从 IF 信号中提取相位序列

Args:
if_signal: shape=(num_frames, num_samples)
range_bin: 目标距离单元

Returns:
phase: 相位序列(弧度)
"""
# 取目标距离单元的复数值
range_fft = np.fft.fft(if_signal, axis=1)
complex_val = range_fft[:, range_bin]

# 提取相位
phase = np.angle(complex_val)

# 解卷绕
phase = np.unwrap(phase)

# 去趋势
phase = phase - np.mean(phase)

return phase

def separate_breath_heart(self, phase: np.ndarray) -> tuple:
"""
分离呼吸和心跳信号

Returns:
breath_signal, heart_signal
"""
nyq = self.fs / 2

# 呼吸带通滤波
b_breath, a_breath = butter(
4,
[self.breath_band[0]/nyq, self.breath_band[1]/nyq],
btype='band'
)
breath_signal = filtfilt(b_breath, a_breath, phase)

# 心跳带通滤波
b_heart, a_heart = butter(
4,
[self.heart_band[0]/nyq, self.heart_band[1]/nyq],
btype='band'
)
heart_signal = filtfilt(b_heart, a_heart, phase)

return breath_signal, heart_signal

def estimate_rate(self, signal: np.ndarray, freq_range: tuple) -> float:
"""
估算频率(呼吸率或心率)
"""
# FFT
spectrum = np.abs(np.fft.fft(signal))
freqs = np.fft.fftfreq(len(signal), d=1.0/self.fs)

# 只看正频率
mask = (freqs >= freq_range[0]) & (freqs <= freq_range[1])

if not np.any(mask):
return 0.0

peak_idx = np.argmax(spectrum[mask])
peak_freq = freqs[mask][peak_idx]

return peak_freq # Hz

def detect_vital_signs(self, if_signal: np.ndarray, range_bin: int) -> dict:
"""
完整生命体征检测

Returns:
{
'breathing_rate': float, # Hz
'heart_rate': float, # Hz
'breathing_amplitude_mm': float,
'heart_amplitude_mm': float,
'snr_db': float
}
"""
phase = self.extract_phase(if_signal, range_bin)
breath, heart = self.separate_breath_heart(phase)

breath_rate = self.estimate_rate(breath, self.breath_band)
heart_rate = self.estimate_rate(heart, self.heart_band)

# 位移幅度(相位 → 位移)
# 120GHz 波长 = 2.5mm,位移 = phase * lambda / (4 * pi)
wavelength = 2.5e-3 # 2.5mm
breath_amp_mm = np.std(breath) * wavelength / (4 * np.pi) * 1000
heart_amp_mm = np.std(heart) * wavelength / (4 * np.pi) * 1000

# SNR
signal_power = np.var(breath) + np.var(heart)
noise_power = np.var(phase - breath - heart)
snr_db = 10 * np.log10(signal_power / (noise_power + 1e-10))

return {
'breathing_rate': breath_rate,
'heart_rate': heart_rate,
'breathing_rate_bpm': breath_rate * 60,
'heart_rate_bpm': heart_rate * 60,
'breathing_amplitude_mm': breath_amp_mm,
'heart_amplitude_mm': heart_amp_mm,
'snr_db': snr_db
}


# 测试
if __name__ == "__main__":
detector = VitalSignsDetector({'frame_rate': 20})

# 模拟:100 帧,每帧 256 采样
np.random.seed(42)
if_sig = np.random.randn(100, 256) * 0.01

# 添加目标:0.5m 处有人呼吸(0.3Hz = 18 breaths/min)
t = np.arange(100)
breath_phase = 0.5 * np.sin(2 * np.pi * 0.3 * t / 20)
heart_phase = 0.1 * np.sin(2 * np.pi * 1.2 * t / 20)

for i in range(100):
if_sig[i, 10] += np.exp(1j * (breath_phase[i] + heart_phase[i]))

results = detector.detect_vital_signs(if_sig, range_bin=10)

print("=== 生命体征检测结果 ===")
print(f"呼吸率: {results['breathing_rate_bpm']:.1f} breaths/min")
print(f"心率: {results['heart_rate_bpm']:.1f} bpm")
print(f"呼吸幅度: {results['breathing_amplitude_mm']:.2f} mm")
print(f"心跳幅度: {results['heart_amplitude_mm']:.2f} mm")
print(f"SNR: {results['snr_db']:.1f} dB")

4. 对 IMS 开发的启示

4.1 传感器选型决策

场景 推荐频率 理由
CPD 穿透遮挡 60GHz 穿透性好,可穿透毛毯/衣物
生命体征精确监测 120GHz 微动灵敏度最高
手势控制 120GHz 距离分辨率最高
成本敏感 CPD 60GHz 已量产,成本最低
多模态冗余 60GHz + 120GHz 互补覆盖全场景

4.2 多频段融合架构

1
2
3
4
5
6
座舱雷达架构建议:

1. 前排:60GHz 雷达(CPD + 呼吸)
2. 后排:60GHz 雷达(CPD + 占用)
3. 顶棚:120GHz 雷达(生命体征 + 手势)[选配]
4. 视觉:IR 摄像头(DMS + OMS + 安全带)

4.3 关键指标

指标 60GHz 目标 120GHz 目标
距离分辨率 ≤ 4cm ≤ 1.5cm
微动检测精度 呼吸频率 ±0.05Hz 呼吸频率 ±0.02Hz
穿透测试 毛毯+衣物可穿透 无遮挡场景
功耗 < 1W < 1.5W
模块体积 < 30×30mm < 25×25mm
响应时间 < 2s < 2s
误报率 < 1% < 0.5%

5. 竞争格局分析

供应商 频率 产品 量产状态 定位
NOVELIC 60GHz ACAM ✅ 量产 CPD/座舱
indie 120GHz (Silicon Radar) 开发中 短距高精度/座舱
Calterah 60-77GHz Dubhe系列 量产 CPD/数字钥匙
TI 60-64GHz IWR6843 量产 CPD/交通
Infineon 60GHz BGT60 量产 CPD/生活
Murata 60GHz 定制 开发中 座舱融合

6. 技术路线判断

6.1 核心洞察

120GHz 雷达不会取代 60GHz 在 CPD 中的地位,但会在生命体征精确监测和手势控制两个方向开辟新应用:

  1. CPD 仍是 60GHz 的主战场——穿透性是 CPD 的刚需
  2. 120GHz 适合选配场景——高端车型的生命体征+手势控制
  3. 多频段融合是终极方案——60GHz 做穿透检测 + 120GHz 做高精度确认

6.2 对 IMS 的建议

优先级 建议
🔴 P0 CPD 主方案选 60GHz(NOVELIC/TI/Infineon)
🟡 P1 评估 120GHz 在生命体征监测方面的精度提升
🟢 P2 探索 120GHz 手势控制作为差异化功能
🟢 P2 多频段融合方案作为下一代架构规划

7. 参考


indie 120GHz FMCW 雷达:突破短距感知极限的下一代座舱传感器(2026 深度解析)
https://dapalm.com/2026/10/05/2026-10-05-013-indie-120ghz-fmcw-radar-cabin-perception/
作者
Mars
发布于
2026年10月5日
许可协议