社区共建 | 温州大学张陈峰基于 A100 ADC 数据实现 MATLAB 信号处理与双实现验证

Niko曾辉
阅读次数13

作者介绍

张陈峰,GitHub ID 为 btlqql,温州大学人工智能专业在读本科生,是一名喜欢动手实践的技术爱好者。平时喜欢研究开源项目,把感兴趣的想法写成代码,也会记录调试过程中的问题和解决方法。近期主要探索 MATLAB、Python 与毫米波雷达信号处理,希望在具体项目中逐步积累经验。

社区贡献说明

本文为 SuperRadar 开发者贡献共建应用案例。

贡献者基于 CTSAI A100 仓库已经公开的近距、远距 ADC样例数据,建立了一套可以直接运行的 MATLAB 雷达信号处理与验证工程,完成四路 RX ADC 数据解析、距离向 FFT、原始 Doppler FFT、二维 CA-CFAR、结果导出,并提供独立 NumPy 参考实现进行交叉验证。

项目工程位于:https://github.com/Super-Radar/CTSAI-A100/tree/main/community/projects/a100-matlab-adc-pipeline-validation

引言

拿到毫米波雷达 ADC 原始数据之后,如何判断自己的数据解析、FFT、CFAR 处理到底有没有做对?

这是毫米波雷达原始数据开发中一个非常现实的问题。

因为 ADC 数据本身不会自动变成距离、速度和角度。

从文件组织、32-bit 数据拆分,到采样维度排列、配置参数映射、距离 FFT、Doppler FFT,再到 MIMO 编码解释,只要其中一个环节处理错误,最终仍然可能得到“看起来像正常频谱”的图像,但其对应的物理意义已经发生变化。

本项目因此没有把目标放在“尽可能多输出几个参数”上,而是建立一条每一步都可以检查、每一个输出都能够说明依据的 MATLAB 信号处理参考链路。

评审过程中还发现,公开样例呈现 DDMA 结构,而可见的 HXX 字段不足以完成 DDMA 发射通道分离。

最终实现把这一差异作为明确的工程边界处理,而不是补写未公开的相位参数。

测试目标

(1)公开的近距和远距 ADC 文本能否由同一个 MATLAB 入口完成解析、频域处理和诊断检测。

(2)MATLAB 主工程与独立 NumPy 参考实现能否在相同配置下得到一致结果。

(3)当 DDMA 元数据不完整时,程序能否保留可验证的原始频谱,同时阻止未经解码的速度和角度进入结果表。

  • 验证四路 RX 文件读取、32 位存储字拆分和 sample chirp rx 维度重排。
  • 验证 Range FFT、原始 Doppler FFT、四通道非相干积累和二维 CA-CFAR。
  • 验证 Doppler FFT 周期边界上的 CFAR 检测能力。
  • 验证 MATLAB 与 NumPy 的检测数量、Doppler bin、距离和功率输出。
  • 验证 velocity\_mps 和 angle\_deg 在数据不足时保持 NaN。

测试场景与环境

项目使用 CTSAI-A100 仓库已经公开的近距和远距 ADC 样例,没有重新连接雷达采集数据。

这里的测试场景是公开数据离线复现,文中的图片均由仓库样例经过处理生成,不是新的硬件现场照片。

由于原始采集布置、目标真值和完整标定信息不属于本工程输入,本文不据此评价检测距离、速度精度、角度精度或整机性能。

验证环节 环境 用途
MATLAB 主工程 MATLAB R2026a Ubuntu 24.04 GitHub 托管运行器 运行 main near 和 main far 并导出结果
独立参考实现 Python 3.10.12 NumPy 2.2.6 Pillow 12.3.0 复现 HXX ADC FFT 和 CFAR 计算
输入数据 仓库公开 ADC 文本和 HXX 配置 近距 profile 和远距 profile
公开 ADC 数据离线处理与双实现验证流程
公开 ADC 数据离线处理与双实现验证流程

数据采集过程

本项目没有新增采集数据。

输入来自仓库的 ADC数据采集 示例adc数据和结果 目录,近距和远距 profile 各包含四个 RX 文本文件。

每个文件有一个前导元数据字段和 131072 个 payload 字,每个 32 位 payload 字存放两个连续的有符号 16 位采样。

解析器只有在文件数量和 payload 长度符合配置时才继续处理,不通过截断或补零掩盖输入错误。

类型 配置 起始频率 带宽 Chirp 数 ADC 维度 RD 维度
near sensor_config_init1.hxx 76.119 GHz 750 MHz 128 2048 × 128 × 4 1024 × 128 × 4
far sensor_config_init0.hxx 76.3 GHz 300 MHz 256 1024 × 256 × 4 512 × 256 × 4

程序从 HXX 文件读取采样率、调频带宽、chirp 周期、chirp 数和 FFT 长度。

近距配置的理论距离分辨率约为 0.20 m,远距配置约为 0.50 m。

数据进入 FFT 前只进行逐 chirp 直流偏置去除和距离向 Hann 加窗;

慢时间维不执行均值相减,也不抑制中心 bin。

工程实现思路

配置加载与 ADC 解析

main.m 是统一入口。

ctsai\_config.m 根据 near 或 far 选择官方 HXX 文件,load\_hxx\_profile.m 解析所需字段,load\_ctsai\_adc.m 检查四路文件并将每个 32 位字拆成高低两个 int16 采样。

输出数据立方体按 sample chirp rx 排列。

距离与原始多普勒处理

process\_radar\_cube.m 在距离维加 Hann 窗并执行 FFT,只保留实数 ADC 对应的正频率半谱。随后在慢时间维加窗并执行 fftshift 后的 Doppler FFT。

四路 RX 的复数频谱按功率进行非相干积累,形成用于诊断的 Range Doppler 功率图。

这里的 Doppler 横轴仍是原始 Fourier bin。

公开资料缺少逐发射通道相位码或相位增量、DDMA bin 偏移、初相、DDMA chirp 周期定义、虚拟通道顺序和发射通道标定状态,因此程序不把中心 bin 当作组合 TX 频谱的物理零速度,也不套用名义 TDM 速度刻度。

CA CFAR 与有效性保护

ca\_cfar\_2d.m 使用二维单元平均 CFAR。

距离维和 Doppler 维的训练单元分别为 8 和 6,保护单元均为 2,目标虚警概率设为 1e-4。

Doppler FFT 的左右边界在频域上相邻,因此实现会在该维度环绕数据后估计噪声;

距离 ROI 则在噪声估计完成后应用,避免 ROI 边界附近的阈值被人为压低。

3 × 3 局部极大值筛选用于减少一个响应产生多行相邻输出。

build\_detection\_table.m 最多保留 32 条最强诊断响应。

结果表包含 range\_m、doppler\_bin、velocity\_mps、angle\_deg、power\_db、kinematics\_valid 和 processing\_status。

当前 profile 下,速度和角度为 NaN,状态统一记录为 raw\_ddma\_not\_decoded。

测试结果

两组公开数据均成功完成加载、Range FFT、原始 Doppler FFT、CA-CFAR 和结果导出。

近距 profile 导出 32 条诊断响应,达到程序设置的 32 条上限;

远距 profile 导出 3 条。

这里的数量是原始频谱上的 CFAR 响应数,不代表采集场景中的真实目标数量。

近距 profile 的原始 Range Doppler 功率图
近距 profile 的原始 Range Doppler 功率图

近距图中可以看到多个沿原始 Doppler 维分布的强响应。横轴只表示未完成 DDMA 分离的原始 bin,不能直接换算为目标速度。

近距 profile 的二维 CA CFAR 诊断结果
近距 profile 的二维 CA CFAR 诊断结果

红色圆圈标出二维 CA-CFAR 和局部极大值筛选后的响应。最强响应的距离约为 3.064 m,另有多条响应分布在约 5.617 m 及其他距离 bin。

由于没有目标真值,这些结果只用于验证处理链和导出逻辑。

远距 profile 的原始 Range Doppler 功率图
远距 profile 的原始 Range Doppler 功率图

远距 profile 使用 256 个 chirp 和 256 点 Doppler FFT,频谱结构与近距 profile 不同。

程序仍保留完整 Doppler 周期,不删除中心 bin。

远距 profile 的二维 CA CFAR 诊断结果
远距 profile 的二维 CA CFAR 诊断结果

远距 profile 导出 3 条响应,其中两条位于约 6.294 m,另一条位于约 8.393 m 和原始 Doppler bin -128。

边界 bin 能够被检测,说明周期环绕后的 CFAR 不会在图像左右边界形成固定盲区。

双实现验证结果

原生 MATLAB R2026a 在 GitHub 托管的 Ubuntu 24.04 环境中成功执行 main near 和 main far。

相同提交上的 NumPy 参考实现独立计算并与 MATLAB 导出的 CSV 对照。

项目 near far
MATLAB 主流程完成 是 是
导出诊断响应 32 条 3 条
Doppler bin 与 NumPy 一致 完全一致 完全一致
最大距离差异 4.80 × 10⁻¹⁴ m 3.55 × 10⁻¹⁵ m
最大功率差异 4.83 × 10⁻¹³ dB 3.69 × 10⁻¹³ dB
运动学有效性保护 通过 通过

距离和功率差异均处于双精度浮点运算的舍入量级。

验证结果说明两套实现对已定义的 ADC 解析、FFT、功率积累和 CFAR 流程给出一致输出。

解决了什么问题

已经完成

  • 提供近距和远距 profile 共用的 MATLAB 主入口。

  • 完成四路 RX ADC 解析、长度校验和维度重排。

  • 完成距离谱、原始 Range Doppler 图和二维 CA-CFAR 诊断输出。

  • 修正 Doppler 周期边界上的 CFAR 处理,并加入边界 bin 回归检查。

  • 提供独立 NumPy 验证器和可审计的 near far 验证日志。

  • 完成 MATLAB R2026a 与 NumPy 的交叉验证。

  • 在 DDMA 元数据不完整时阻止无依据的速度和角度输出。

尚未覆盖

  • 没有重新开展 CTSAI-A100 硬件采集和带目标真值的场景测试。

  • 没有完成 DDMA 发射通道分离、速度恢复和速度解模糊。

  • 没有生成经过虚拟阵列排序和相位标定的方位角。

  • 没有实现多帧跟踪、专有干扰抑制或产品固件等效逻辑。

  • 当前结果不构成最大探测距离、精度或虚警性能结论。

如何运行工程

项目已经合入 CTSAI-A100 主仓库。

项目路径:

text 复制代码
community/projects/a100-matlab-adc-pipeline-validation/

MATLAB R2020b 或更高版本即可运行,主流程只使用基础 MATLAB 函数。

进入项目目录后运行:

matlab 复制代码
main('near');
main('far');

程序会分别运行近距和远距公开 ADC 数据。

输出包括:

  • PNG;
  • CSV;
  • Configuration Report;
  • MAT Workspace。

结果分别写入 near 和 far 对应 results 目录。

如果希望复现 NumPy 独立验证,可以在仓库根目录执行:

bash 复制代码
python "community/projects/a100-matlab-adc-pipeline-validation/validator/run_reference_validation.py"

在解释输出之前,建议首先查看:

text 复制代码
validation.txt
configuration_report.txt

重点确认:

  • 数据维度;
  • 配置来源;
  • velocity_valid;
  • angle_valid;
  • processing_status。

确认这些信息后,再进一步解释 Range-Doppler 图和 CSV 数据。

当前版本包含什么

内容 作用
README.md 说明项目定位 环境 数据来源 运行方式和限制
main.m 统一执行 near 或 far profile
src 目录 配置解析 ADC 读取 FFT CFAR 结果表和绘图函数
validator 目录 独立 NumPy 实现与复现说明
validator results 近距和远距 PNG CSV 与验证日志
MATLAB 验证记录 记录 R2026a 运行环境 提交版本和双实现误差
技术说明文档 解释 ADC 格式 处理链 DDMA 边界和扩展条件

后续计划

如果后续能够获得完整公开的 DDMA 相位编码、bin 偏移、chirp 周期定义、虚拟通道顺序和发射通道标定信息,可以在现有 ADC 解析和 FFT 链路之后补充 TX 分离、物理速度恢复、虚拟阵列构造和角度估计。

由于配置加载、运动学有效性标志和通用 Angle FFT 已经分离,这些扩展不需要重写现有的 ADC 读取与 CFAR 主体。

另一项可扩展工作是使用带现场布置和目标真值的新采集数据,比较不同距离、速度和多目标条件下的结果,并据此调整 CFAR 参数。

只有完成这类实验后,才适合讨论检测率、虚警率和测量误差。

本次非常开心参与 SuperRadar 社区共建,完成了 CTSAI A100 公开 ADC 数据处理工程及交叉验证,也希望通过分享代码和技术文档,与更多开发者交流学习。