AERIS-10: 开源10.5GHz相控阵雷达——从工程实现到座舱感知的技术启示

来源:GitHub mitgor/PLFM_RADAR (MIT License) · 2026年3月最后更新 · 430 stars
作者:Nawfal Motii 及贡献者
核心方向:开源相控阵雷达 · PLFM调制 · FPGA信号处理 · X波段波束成形

项目信息

项目 内容
项目名称 AERIS-10 (mitgor/PLFM_RADAR)
GitHub mitgor/PLFM_RADAR
许可证 MIT License
Stars 430+
Forks 99
主要语言 C (FPGA固件), Python (GUI)
最后更新 2026-03-14
雷达类型 PLFM (Pulse Linear Frequency Modulated)
频段 10.5 GHz (X波段)

核心价值

AERIS-10 是首个完整的开源相控阵雷达系统,包含:

  • 完整硬件设计:原理图、PCB Gerber文件、BOM清单
  • FPGA固件:完整的雷达信号处理链
  • STM32固件:系统管理与外设接口
  • Python GUI:实时目标显示与地图集成

对于IMS座舱感知研发,AERIS-10 提供了一个可修改、可拆解的雷达参考平台,帮助理解从ADC原始数据到目标检测的完整信号处理链。

硬件架构

双版本设计

参数 AERIS-10N (Nexus) AERIS-10X (Extended)
最大距离 3 km 20 km
天线阵列 8×16 贴片天线 32×16 介质填充缝隙波导
功放 标准GaAs 10W GaN
应用场景 室内/校园 远距离/气象
电子扫描范围 ±45° (方位+俯仰) ±45° (方位+俯仰)
波束切换延迟 <1μs <1μs

信号处理链

graph LR
    A[DAC: PLFM Chirp生成] --> B[RF前端: 上变频/放大]
    B --> C[天线发射]
    C --> D[目标反射]
    D --> E[接收天线]
    E --> F[ADC: 原始数据采集]
    F --> G[I/Q 基带下变频]
    G --> H[抽取滤波<br/>CIC/FIR]
    H --> I[FFT: 距离处理]
    I --> J[脉冲压缩]
    J --> K[Doppler处理]
    K --> L[MTI 动目标指示]
    L --> M[CFAR 恒虚警检测]
    M --> N[目标输出]

核心芯片清单

功能模块 芯片型号 数量 关键参数
FPGA Xilinx XC7A100T 1 Artix-7, 100K逻辑单元
MCU STM32F746xx 1 Cortex-M7, 216MHz
移相器 ADAR1000 4 4通道, 6-bit, 0.5dB步进
DAC AD9121 1 1.2GSPS, 16-bit
ADC AD9680 1 1.0GSPS, 14-bit
频综 ADF4159 1 6.25GHz分数分频
GPS U-blox NEO-M8N 1 72通道, 10Hz
IMU GY-85 1 9DOF, 加速度/陀螺/磁力

FPGA信号处理详解

完整FPGA处理链代码结构

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
// ===== AERIS-10 FPGA 信号处理链 =====
// 文件位置: /5_FPGA/rtl/

module radar_signal_chain (
input wire clk_200m, // 200MHz 主时钟
input wire [13:0] adc_data, // AD9680 原始数据
input wire chirp_start, // PLFM脉冲开始
output wire [13:0] dac_output, // DAC 输出
output wire [31:0] range_fft_data, // 距离FFT输出
output wire [31:0] doppler_data, // 多普勒处理输出
output wire target_detect // CFAR目标检测
);

// 1. DAC: PLFM 脉冲生成
plfm_generator #(
.BANDWIDTH_MHZ(100), // 100MHz 带宽
.PULSE_US(10), // 10μs 脉冲宽度
.SAMPLE_RATE_MSPS(200) // 200MSPS 采样率
) plfm_inst (
.clk(clk_200m),
.start(chirp_start),
.dac_out(dac_output)
);

// 2. ADC: 原始数据捕获 + I/Q 下变频
iq_downconverter iq_inst (
.clk(clk_200m),
.adc_in(adc_data),
.i_out(i_baseband), // I 路
.q_out(q_baseband) // Q 路
);

// 3. CIC 抽取滤波器
cic_filter #(
.R(8), // 抽取因子
.M(1), // 微分延迟
.N(5) // 级数
) cic_inst (
.clk(clk_200m),
.data_in({i_baseband, q_baseband}),
.data_out(cic_out)
);

// 4. FIR 补偿滤波器
fir_compensate #(
.TAPS(31),
.WIDTH(16)
) fir_inst (
.clk(clk_200m),
.data_in(cic_out),
.data_out(fir_out)
);

// 5. 距离 FFT (脉冲压缩)
range_fft #(
.FFT_SIZE(1024),
.DATA_WIDTH(16)
) range_inst (
.clk(clk_200m),
.data_in(fir_out),
.fft_data_out(range_fft_data)
);

// 6. Doppler 处理 (跨脉冲FFT)
doppler_fft #(
.NUM_PULSES(64),
.FFT_SIZE(64)
) doppler_inst (
.clk(clk_200m),
.range_data(range_fft_data),
.doppler_out(doppler_data)
);

// 7. MTI (动目标指示)
mti_filter #(
.DELAY_LINES(2) // 二阶对消
) mti_inst (
.clk(clk_200m),
.data_in(doppler_data),
.mti_out(mti_out)
);

// 8. CFAR 检测
cfar_detector #(
.TRAINING_CELLS(16),
.GUARD_CELLS(4),
.PFA(1e-6) // 虚警概率
) cfar_inst (
.clk(clk_200m),
.data_in(mti_out),
.detect_out(target_detect)
);

endmodule

Python GUI 接口

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
"""
AERIS-10 Python GUI 接口示例

功能:
1. 连接STM32串口获取目标数据
2. 实时显示目标在地图上的位置
3. 调整雷达参数(波形、PRF、CFAR阈值)
"""

import serial
import threading
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

class AERIS10Interface:
"""
AERIS-10 雷达控制与显示接口

通信协议:
- 串口波特率: 921600
- 数据帧: [HEADER(2)] [AZIMUTH(2)] [RANGE(4)] [DOPPLER(2)] [SNR(2)]
"""

HEADER = bytes([0xAA, 0x55])

def __init__(self, port: str = '/dev/ttyUSB0', baud: int = 921600):
self.serial = serial.Serial(port, baud, timeout=1.0)
self.targets = []
self.running = False

# 雷达参数配置
self.config = {
'pulse_width_us': 10,
'bandwidth_mhz': 100,
'prf_hz': 2000, # 脉冲重复频率
'cfar_threshold': 1e-6,
'beam_azimuth': 0, # 波束方位角
'beam_elevation': 0 # 波束俯仰角
}

def send_config(self, config: dict):
"""发送配置到STM32"""
cmd = f"CFG,{config['prf_hz']},{config['pulse_width_us']},{config['bandwidth_mhz']}\n"
self.serial.write(cmd.encode())

def set_beam_direction(self, azimuth: float, elevation: float):
"""设置波束方向(度)"""
az_steps = int((azimuth + 45) / 90 * 127) # 6-bit移相器
el_steps = int((elevation + 45) / 90 * 127)
cmd = f"BEAM,{az_steps},{el_steps}\n"
self.serial.write(cmd.encode())

def parse_frame(self, data: bytes) -> dict:
"""解析目标数据帧"""
if len(data) < 12:
return None
azimuth = int.from_bytes(data[2:4], 'little', signed=True) / 100.0
range_m = int.from_bytes(data[4:8], 'little') / 10.0
doppler = int.from_bytes(data[8:10], 'little', signed=True) / 10.0
snr = int.from_bytes(data[10:12], 'little') / 100.0

return {
'azimuth': azimuth,
'range': range_m,
'doppler': doppler,
'snr': snr
}

def receive_loop(self):
"""接收线程"""
buffer = b''
while self.running:
buffer += self.serial.read(self.serial.in_waiting or 1)
while len(buffer) >= 12:
if buffer[:2] == self.HEADER:
target = self.parse_frame(buffer[:12])
if target:
self.targets.append(target)
buffer = buffer[12:]
else:
buffer = buffer[1:]


def demo_realtime_display():
"""实时显示雷达目标"""
radar = AERIS10Interface()
radar.running = True
thread = threading.Thread(target=radar.receive_loop, daemon=True)
thread.start()

fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': 'polar'})

def update(frame):
ax.clear()
ax.set_theta_zero_location('N')
ax.set_theta_direction(-1)
ax.set_rlim(0, 3000)
ax.set_xlabel('Range (m)')

if radar.targets:
azimuths = [np.radians(t['azimuth']) for t in radar.targets[-100:]]
ranges = [t['range'] for t in radar.targets[-100:]]
snrs = [t['snr'] for t in radar.targets[-100:]]

scatter = ax.scatter(azimuths, ranges, c=snrs,
cmap='viridis', s=50, vmin=0, vmax=30)
plt.colorbar(scatter, ax=ax, label='SNR (dB)')

ax.set_title('AERIS-10 Radar Display', pad=20)

anim = FuncAnimation(fig, update, interval=100, cache_frame_data=False)
plt.show()

radar.running = False


if __name__ == "__main__":
print("AERIS-10 Radar Interface Demo")
print("=" * 40)
demo_realtime_display()

技术参数详解

PLFM调制参数

参数 说明
中心频率 10.5 GHz X波段
带宽 100 MHz 距离分辨率 1.5m
脉冲宽度 10 μs 最大探测距离 >3km
PRF 2000 Hz 最大无模糊距离 75km
DAC采样率 200 MSPS 过采样率 2x
ADC采样率 200 MSPS I/Q双通道

距离分辨率计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 距离分辨率 = c / (2 * B)
c = 3e8 # 光速
B = 100e6 # 100MHz带宽
range_resolution = c / (2 * B)
print(f"距离分辨率: {range_resolution:.2f} m") # 1.50 m

# 最大探测距离 = c * T_pulse / 2
T_pulse = 10e-6 # 10μs脉冲宽度
max_range = c * T_pulse / 2
print(f"理论最大距离: {max_range:.0f} m") # 1500 m

# 速度分辨率 = λ / (2 * N * T_pri)
lam = c / 10.5e9 # 波长
N = 64 # 脉冲数
T_pri = 1 / 2000 # PRI
vel_resolution = lam / (2 * N * T_pri)
print(f"速度分辨率: {vel_resolution:.2f} m/s") # ~1.125 m/s

波束成形参数

参数
移相器型号 ADAR1000
移相器精度 6-bit (5.625°)
前端元件数 16
移相器数量 4 (每片4通道)
方位扫描范围 ±45°
俯仰扫描范围 ±45°
波束宽度 ~6° (16元件)
旁瓣电平 -13 dB (均匀加权)

IMS座舱感知应用启示

1. 作为座舱雷达的技术参考

虽然AERIS-10是X波段(10.5GHz)远程雷达,不是60GHz座舱雷达,但其完整信号处理链对IMS座舱感知有重要参考价值:

AERIS-10模块 座舱对应 技术借鉴
PLFM Chirp生成 FMCW调频 波形设计参考
I/Q下变频 基带处理链
CIC/FIR抽取 降采样策略
距离FFT 距离-多普勒
MTI 静态杂波消除 CPD场景杂波抑制
CFAR 目标检测 乘员检测阈值

2. 用AERIS-10做座舱感知原型验证

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
class CabinSensingPrototype:
"""
使用AERIS-10作为座舱感知原型验证平台

虽然10.5GHz比60GHz波长长5.7倍,但:
1. 基本信号处理链相同
2. 可验证算法可行性
3. 可做快速原型迭代
4. 可做对比基准测试
"""
def __init__(self):
self.radar = AERIS10Interface()
self.range_resolution = 1.5 # 1.5m(远不如60GHz的2.5cm)
self.max_range = 3.0 # 3m座舱范围

def detect_occupant(self):
"""检测乘员存在"""
targets = self.radar.targets[-10:]

# 在座舱范围内寻找目标
for t in targets:
if t['range'] < self.max_range:
# 多普勒>0.1m/s表示有运动(呼吸/心跳)
if abs(t['doppler']) > 0.1:
return True, t

return False, None

def estimate_breathing(self, window_sec=10):
"""估计呼吸频率(使用多普勒时序)"""
targets = [t for t in self.radar.targets
if t['range'] < self.max_range]

if len(targets) < 100:
return None

# 提取多普勒时序
dopplers = [t['doppler'] for t in targets]

# FFT找呼吸频率
from scipy.fft import fft
spectrum = np.abs(fft(dopplers))
freqs = np.fft.fftfreq(len(dopplers), d=0.1) # 100ms间隔

# 呼吸频率在0.1-0.5Hz范围
mask = (freqs > 0.1) & (freqs < 0.5)
peak_idx = np.argmax(spectrum[mask])
breathing_hz = freqs[mask][peak_idx]

return breathing_hz * 60 # 转bpm

3. 对IMS开发的直接启示

启示点 具体内容 优先级
波形设计 PLFM vs FMCW对比,脉冲体制vs连续波 🟡 P1
CIC/FIR级联 抽取策略影响距离分辨率 🟡 P1
MTI杂波抑制 静态座椅/内饰杂波消除 🔴 P0
CFAR阈值 不同座舱位置的虚警率调优 🔴 P0
ADAR1000移相 波束成形扫描策略 🟢 P2
STM32+FPGA架构 实时性 vs 成本权衡 🟡 P1

4. 与商用60GHz雷达的对比

特性 AERIS-10 TI AWRL6432 Calterah
频率 10.5 GHz 60-64 GHz 60-64 GHz
带宽 100 MHz 4 GHz 4 GHz
距离分辨率 1.5 m 3.75 cm 3.75 cm
体制 脉冲PLFM FMCW FMCW
相控阵 ✓ (16元件) ✗ (固定波束) ✓ (2T4R MIMO)
开源 ✓ 完全
成本 ~$500 BOM ~$15 ~$20
座舱适用 低(分辨率差)

5. 开源社区生态价值

AERIS-10 的开源价值在于:

  1. 教学价值:完整的FPGA→MCU→GUI信号处理链,可拆解学习
  2. 原型价值:快速验证算法概念,无需NDA或开发板购买
  3. 对比基准:验证商业雷达方案的黑盒实现
  4. 扩展基础:可修改为60GHz版本(更换RF前端)

开发建议

1. 短期(1-3个月)

1
2
3
4
5
6
7
8
9
10
# 克隆AERIS-10仓库
git clone https://github.com/mitgor/PLFM_RADAR
cd PLFM_RADAR

# 查看FPGA设计文件
ls 5_FPGA/rtl/
# 查看STM32固件
ls 9_Firmware/
# 查看Python GUI
ls 9_Firmware/9_3_GUI/

建议任务

  • 仿真运行CFAR检测器,验证不同阈值下的检测率
  • 用Python GUI的接口协议,开发座舱场景模拟器

2. 中期(3-6个月)

  • 在FPGA仿真中实现MTI杂波抑制,对比60GHz场景
  • 将CFAR算法移植到60GHz雷达DSP上做对比验证
  • 用ADAR1000移相器设计波束成形扫描策略

3. 长期(6-12个月)

  • 基于AERIS-10的FPGA信号处理链,开发60GHz版本
  • 在实际座舱环境中验证MTI + CFAR的虚警抑制能力
  • 对比AERIS-10 PLFM体制与商用FMCW体制的优缺点

总结

AERIS-10 虽然不是直接用于座舱的60GHz雷达,但其完整开源的信号处理链提供了无可替代的参考价值:

  1. 全链路透明:从DAC波形生成到CFAR检测,每个环节可修改可验证
  2. PLFM vs FMCW对比:脉冲体制 vs 连续波体制的差异可量化分析
  3. 相控阵经验:16元件ADAR1000波束成形设计可直接借鉴
  4. 成本参考:$500 BOM展示了雷达系统的成本构成

对IMS的最终建议:不需要物理搭建AERIS-10,但应深入研究其FPGA信号处理链源码,将CFAR和MTI的优化经验应用到60GHz座舱雷达的算法开发中。


https://dapalm.com/2026/09/19/2026-09-19-13-aeris-10-open-source-phased-array-radar-ims/
作者
Mars
发布于
2026年9月19日
许可协议