【MATLAB源码】FMCW:雷达信号处理教科书级仿真平台

4 阅读4分钟

📡 FMCW 雷达信号处理教科书级仿真平台

完整链路逐模块实现 · MATLAB 纯基础函数实现 · 教学与工程双场景可复现​* 支持 FMCW 主链路 + 脉冲多普勒 + 相参/非相参积累对比

📌 为什么选择本仿真平台?

想讲清楚雷达处理链路时,常见问题是“公式和代码脱节、模块耦合重、结果不稳定、图像不好复现”。 本平台围绕 可解释、可运行、可验证 设计,主打从信号到点云的完整闭环。

常见痛点本平台方案
🔴 只有单点算法演示,链路不完整✅ 完整闭环:chirp -> IF -> data cube -> RD -> angle -> CFAR -> 点云
🔴 维度约定混乱,调试困难✅ 明确三维约定:理论 x[m,n,p],存储 [p,n,m]
🔴 代码依赖重,环境迁移难✅ 纯 MATLAB 基础函数实现,尽量减少工具箱依赖
🔴 只有图,没有可追溯结果✅ 每次自动归档 png+fig+results.mat
🔴 缺少质量闸门checkcode + 冒烟检查 双重验证入口

🎯 核心价值

🔬 学术研究价值

  • 链路完整:FMCW 主处理、脉冲多普勒、积累增益三条演示链路并存。
  • 公式可对齐:关键相位项、FFT 维度、CFAR 门限均可映射到标准雷达信号处理表达。
  • 教学友好:一键脚本生成 8 类关键图,适合课堂讲解与实验报告。
  • 参数集中化default_config.m 管理关键系统参数,便于敏感性分析。

💼 工程应用价值

  • 模块解耦config/core/processing/utils/tests 清晰分层。
  • 结果可复现:输出目录按时间戳归档,便于版本对比与追踪。
  • 易集成:函数接口统一,便于接入更大链路级仿真工程。
  • 质量可控:静态检查与冒烟检查可快速评估当前版本可运行性。

⚡ 技术亮点

🏗️ 完整模块架构

RadarSignal/
 ├── README.md
 ├── Plan.md
 ├── 项目文档.md
 ├── docs/
 │   ├── 算法文档.md
 │   └── 代码文档.md
 └── matlab/
     ├── run_demo_all.m                    # 一键运行入口
     │
     ├── config/
     │   └── default_config.m              # 统一配置中心
     │
     ├── core/
     │   ├── generate_fmcw_chirp.m         # FMCW 发射信号生成
     │   ├── simulate_fmcw_scene.m         # IF 场景建模与噪声注入
     │   └── build_data_cube.m             # 三维 Data Cube 组织
     │
     ├── processing/
     │   ├── range_doppler_fft.m           # 距离-多普勒处理
     │   ├── angle_estimation_fft.m        # 阵元维角度估计
     │   ├── cfar_2d_ca.m                  # 二维 CA-CFAR
     │   ├── build_point_cloud.m           # 检测点 -> 点云映射
     │   ├── pulse_doppler_demo.m          # 脉冲多普勒演示
     │   └── coherent_integration_demo.m   # 相参/非相参积累对比
     │
     ├── utils/
     │   ├── make_output_dir.m             # 输出目录管理
     │   ├── save_figure_auto.m            # 图像自动保存
     │   └── plot_helpers.m                # 绘图风格设置
     │
     ├── tests/
     │   └── run_static_checks.m           # checkcode + 冒烟检查
     │
     └── outputs/
         └── radar_demo_YYYYMMDD_HHMMSS/   # 结果归档目录

📊 关键结果实测(默认参数)

指标类别结果
静态检查文件数15
checkcode 消息数0
冒烟检查smoke_ok = true
修复后点云检测数pc.count = 51
RD 主峰 1R=28.11 m, v=6.08 m/s
RD 主峰 2R=44.97 m, v=-4.06 m/s
RD 主峰 3R=61.83 m, v=0.00 m/s

数据来源:Plan.md 中 Gate E 修复后验证记录。

💻 核心代码展示

🔥 多目标 IF 建模(simulate_fmcw_scene.m

% 距离拍频与多普勒频移
 f_r = 2 * slope * R / c;
 f_d = 2 * v / lambda;
 ​
 % 快时间相位项(range beat)
 % 与“保留正频半谱”策略一致,采用正拍频符号
 phase_fast = 2 * pi * f_r .* t_fast;
 % 慢时间相位项(doppler)
 phase_slow = 2 * pi * f_d .* t_slow;
 ​
 for p = 1:num_ant
     phase_ant = 2 * pi * ((p - 1) * d * sin(theta) / lambda);
     phase_nd = phase_slow + phase_const + phase_ant;
     phase_2d = bsxfun(@plus, phase_nd(:), phase_fast);
     target_if = amp * exp(1j * phase_2d);
     ...
 end

🚀 二维 CA-CFAR 检测(cfar_2d_ca.m

num_total = (2 * win_r + 1) * (2 * win_d + 1);
 num_guard = (2 * gr + 1) * (2 * gd + 1);
 num_train = num_total - num_guard;alpha = num_train * (pfa^(-1 / num_train) - 1);
 ​
 for r = r_start:r_stop
     for d = d_start:d_stop
         block = rd_power((r - win_r):(r + win_r), (d - win_d):(d + win_d));
         guard = rd_power((r - gr):(r + gr), (d - gd):(d + gd));noise_sum = sum(block(:)) - sum(guard(:));
         noise_mean = noise_sum / num_train;
         threshold = alpha * noise_mean;
         thr_map(r, d) = threshold;snr_db = 10 * log10(rd_power(r, d) / (noise_mean + eps));
         if rd_power(r, d) > threshold && snr_db >= cfar_cfg.min_snr_db
             det_mask(r, d) = true;
         end
     end
 end

🎬 一键运行

cd('D:/10_存储库/OneDrive/15.代码归档/01.施工中/RadarSignal/matlab');
 run_demo_all;
cd('D:/10_存储库/OneDrive/15.代码归档/01.施工中/RadarSignal/matlab/tests');
 report = run_static_checks();
 disp(report);

输出预览

[RadarSignal] 输出目录: .../matlab/outputs/radar_demo_20260306_082736
 [RadarSignal] 演示完成,输出已保存。
 [RadarSignal] 图像与结果文件:.../radar_demo_20260306_082736
 ​
 输出文件(共17个):
   - 01~08 图像: 每类各 1 份 PNG + 1 份 FIG
   - results.mat: cfg/cube/RD/CFAR/pointcloud/pd/ci 等关键结果
处理流程总览
 ┌───────────────────────────────────────────────────────────────┐
 │  chirp生成 -> IF建模 -> Data Cube -> Range FFT -> Doppler FFT │
 │            -> Angle FFT -> 2D CA-CFAR -> 点云映射             │
 └───────────────────────────────────────────────────────────────┘

示例输出图(默认参数): 01_fmcw_tx_if_time.png 02_data_cube_slices.png03_range_doppler_map.png04_angle_spectrum.png

🖥️ 运行环境

  • MATLAB 版本:R2020a 或更高版本(建议 R2025b 及以上)
  • 依赖工具箱:无强依赖(核心流程使用基础 MATLAB 函数)
  • 操作系统:Windows / Linux / macOS 均可

🛒 获取方式

本文代码仅为核心片段,完整版工程已整理好。 关注公众号 【3GPP 仿真实验室】进行获取。

📚 参考文献

[1] Fuwei Li, “Radar Signal Processing: A Tutorial,” 2024-12-26. livey.github.io/posts/2024-…

[2] M. I. Skolnik, Introduction to Radar Systems, 3rd ed., McGraw-Hill, 2001.

[3] M. A. Richards, J. A. Scheer, and W.