拓冰建站拓冰建站
首页 / 资讯中心 / 正文

A100 ADC数据在MATLAB中的雷达信号处理全流程解析与双实现验证

社区里最近出现一个很值得聊的共建任务温州大学的张陈峰用 SuperRadar 社区提供的 A100 ADC 采集数据在 MATLAB 里跑完了一条完整的雷达信号处理链路同时用两套实现互相验证确保结果不是“看着像”而是“真的对”。这个东西对正在做雷达信号处理、尤其是刚接触真实 ADC 数据的新手来说参考价值很大因为社区里大多数开源数据包都是别人整理好的基带 IQ 数据真正从 A100 这类高速 ADC 原始采样数据开始做解析、预处理、到距离多普勒成像和检测的完整流程反而见得少。这篇文章我不打算只复述他的结果我想顺着他的处理思路把 A100 ADC 数据在 MATLAB 里怎么读、怎么处理、怎么做双实现验证完整拆一遍。适合谁看适合三类人一是刚拿到采集卡数据不知道怎么下手的同学二是想在 MATLAB 和 Simulink 之间交叉验证算法一致性的工程师三是对“真实数据 vs 仿真数据”这条验证路径感兴趣的雷达方向研究人员。下面展开讲。1. 项目背景与整体思路为什么要在 MATLAB 里处理 A100 ADC 数据1.1 SuperRadar 社区与 A100 ADC 数据源SuperRadar 社区做过一段时间的共建项目目标很朴素把一套能用的雷达采集系统、一批真实环境下采集的原始数据、还有对应的处理算法全部开放出来让大家在同一个数据集上比较算法效果。张陈峰这次用的 A100就是社区里一台高速 ADC 采集板卡负责把雷达接收机输出的中频回波直接采样成数字信号。A100 的数据不是仿真的是真的从雷达前端灌进来的所以里面带着直流偏置、噪声、通道串扰、甚至偶尔的坏点和教科书里干干净净的理想回波完全不一样。这一点很关键。很多人上手雷达信号处理第一步就走错了拿仿真的理想点目标回波做 MTD、做 CFAR跑出漂亮的图就觉得自己会了。但真实 ADC 数据往往连“怎么把一个文件里的二进制变成一帧一帧的距离像”都是问题。张陈峰把 A100 原始数据从文件解析开始做起等于把最脏最累的一段路走了一遍这对社区后续的人省了很多功夫。1.2 为什么选 MATLAB 而不是其他工具他选 MATLAB 而不是直接上 FPGA 或者 Python我觉得很合理。第一个原因是社区里大部分同学的算法原型都是 MATLAB 写的尤其是雷达信号处理工具箱里的函数比如匹配滤波、CFAR 检测器、多普勒处理这些和教科书上的公式一一对应容易核对。第二个原因是数据一次处理量不小A100 的采样率下一帧数据就是几百万个样本MATLAB 的向量化操作在这类处理上有天然优势写起来比 Python 循环快得多也比 C 语言容易调试。还有一个隐性原因Simulink。后续做双实现验证时MATLAB 脚本和 Simulink 模型之间数据交换非常顺滑同一个工作空间里放数据固定步长设置好跑完直接对波形。如果用 Python 做第二版实现跨语言比对不是不行但要在数据格式、库函数版本、浮点精度上多花不少时间。我自己的经验是验证算法一致性第一优先级永远是让你自己省力所以 MATLAB Simulink 这个组合在“快速验证”这个场景下比 C/Python 更合适。1.3 “双实现验证”到底验证什么“双实现验证”很容易被理解成“跑两遍看结果差不多”。但张陈峰这个工作里验证的核心不是最终检测结果而是中间每一步的信号。我在社区回复里问过他你验证的是距离像、多普勒图还是最终点迹他说是把脉冲压缩输出、MTD 输出、CFAR 检测结果三层都对比了。这才是双实现验证该有的样子。为什么中间层验证重要因为两个实现如果只在最终点迹上一致可能只是掩盖了中间的 Bug。比如脉冲压缩的窗函数权重错了可能方向图主瓣还行旁瓣抬高但点迹照样能检出来或者 MTD 的 FFT 点数两边不一致速度维栅栏可能恰好落在目标上结果也一样。所以必须把处理链上的关键节点全部对齐哪怕有一点点偏差也要能说清楚偏差来自滤波器系数还是浮点精度。这也是我在后面写实现细节时坚持的原则每处理完一步先和参考实现对比再走下一步。2. A100 ADC 数据格式解析与预处理2.1 理解 A100 的采样参数与数据组织拿到 A100 数据的第一件事不是写代码而是搞明白文件里的数据是怎么组织的。这步没有捷径必须看采集时记录的参数表。我这里列一组我们常用的典型配置张陈峰这次的数据也基本对齐这个结构ADC 位数12 bit文件里按 16 bit 短整型存储高 12 位有效低 4 位补零采样率250 MHz双通道交替采样等效 500 MHz 采样率信号格式中频实信号中心频率 60 MHz带宽 200 MHz数据文件二进制每个采样点 2 字节小端字节序通道 0 和通道 1 交织排列每帧长度8192 个采样点帧与帧之间有 128 个点的消隐区用于区分脉冲重复周期这个交织结构特别容易踩坑。我见过好几个同学直接把文件前 8192 个点当成一帧结果发现波形像被劈开了一样其实就是忘了通道交织。正确做法是先按 2 个通道交织解析再把消隐区跳过去最后得到实实在在的每帧 8192 点回波。提示拿到任何采集文件先看采集软件导出的参数记录不要靠猜。字节序、通道数、采样率、消隐区长度这四个参数错一个后面全白做。2.2 MATLAB 中高效读取与解析二进制数据文件读取用 memmapfile 或者 fread 都行。数据文件如果只有一两百兆用 fread 就可以了如果是好几个 G建议 memmapfile省内存也方便随机访问某一帧。这里我给出一个 fread 的版本配合参数表把交织通道拆开。% A100 ADC data reader fs 500e6; % 等效采样率 500 MHz fc 60e6; % 中频频率 60 MHz chirpB 200e6; % 信号带宽 200 MHz numCh 2; samplesPerChirp 8192; blankLen 128; fid fopen(a100_adc_data.bin, rb); raw fread(fid, [numCh, samplesPerChirp blankLen], *int16, 0, b); fclose(fid); % 因为是交织存储先转成矩阵再读时已经是两列了。 % 如果文件是按块连续存储则需要手动 reshape。在实际项目里我会把读取封装成一个函数readA100Frame(fileID, frameIdx)这样处理多帧数据时不容易乱。需要注意fread 的第四个参数skip是字节数不是点数交织场景经常在这里写错另外小端字节序在 MATLAB 里默认就是小端不用特别指定但如果你在 x86 机器上处理来自其他平台的数据最好显式指定b或l。2.3 数据质量检查直流偏置、坏点与噪声底真实采集数据进处理链路之前一定要先做质量检查。我通常画三个东西原始时域波形、频谱、幅度统计直方图。张陈峰在社区分享里也提到A100 数据的直流偏置很稳定大概在 ADC 满量程的 2% 左右但这个偏置如果不去掉后面做 MTI 时零频附近会有一条很强的亮线把低速目标完全淹没。直流偏置的去除方法很简单直接减均值或者用高通滤波都行。但要注意如果同一段数据里有脉冲干扰或者强杂波直接减全局均值不如减每个脉冲的均值稳健。我建议按帧去除也就是每一帧 8192 个点单独去均值这样对慢时间维的杂波非平稳变化更鲁棒。坏点检测也很重要。ADC 偶尔会出现一个点明显偏离正常值如果不处理在脉冲压缩之后会形成一长条旁瓣幅度甚至可能超过真实目标。检测方法不复杂计算每个点与前后相邻点的差值如果差值的绝对值超过该帧噪声标准差的 6 倍就标记为坏点用相邻点均值替换。这一步对真实数据尤其必要仿真数据永远不会给你这种惊喜。3. 核心信号处理链路的 MATLAB 实现3.1 距离维处理中频实信号的正交解调与脉冲压缩A100 采集的是中频实信号所以第一步是把实信号变成基带复信号否则后面脉冲压缩会出现镜像频率分量。正交解调的标准做法是用exp(-j*2*pi*fc*t)乘以中频信号再用低通滤波器滤掉二倍频分量。MATLAB 里可以这样写t (0:samplesPerChirp-1) / fs; baseband realSignal .* exp(-1j*2*pi*fc*t); % 低通滤波截止频率设为 chirpB/2 [b, a] butter(6, chirpB/2 / (fs/2), low); baseband filtfilt(b, a, baseband);做完正交解调之后脉冲压缩用匹配滤波器实现。匹配滤波器的本质是发射信号的反褶共轭与回波做卷积。如果发射信号是线性调频信号参考信号可以直接构造也可以从采集数据里截取一段泄漏脉冲作为参考。张陈峰这里用的是直接构造参考信号因为 A100 的参数表里给了调频斜率和脉宽构造比从数据里截取更干净能保证参考信号和理论完全一致。Tp 10e-6; % 脉冲宽度 K chirpB / Tp; % 调频斜率 tRef (0:round(Tp*fs)-1) / fs; ref exp(1j*pi*K*tRef.^2); % 基带参考信号 % 匹配滤波 mfOut fftfilt(conj(ref(end:-1:1)), baseband); mfOut mfOut / length(ref); % 归一化这里有个细节值得强调匹配滤波器长度和回波长度不一致时fftfilt的结果会比输入长要注意截取有效区间。另外如果对距离旁瓣有要求可以加窗比如海明窗。我实测下来加窗之后主瓣展宽一点但旁瓣从 -13 dB 降到 -40 dB 左右代价是距离分辨率稍有下降。在真实数据里加窗带来的旁瓣改善往往比理论仿真更明显因为真实回波里杂波和噪声分量多旁瓣压低后更容易直接看 CFAR 结果。3.2 多普勒维处理MTI 对消与 MTD 距离多普勒图单帧脉冲压缩只能得到距离像想分辨运动目标得沿着慢时间维做多普勒处理。张陈峰的处理链路里先做了一次三脉冲对消 MTI再做 MTD。三脉冲对消器很简单每个距离单元上做y(n) x(n) - 2*x(n-1) x(n-2)作用是把静止杂波和低速杂波抑制掉。为什么用三脉冲而不是两脉冲因为两脉冲对消的频率响应在零频处陷波宽度比较窄对低速目标的损伤较大三脉冲对消的零频陷波更宽抑制静止杂波更彻底代价是会让速度接近零的目标幅度也下降。在 A100 这套数据里我们关心的最低目标速度大约 3 m/s三脉冲对消后依然有足够的能量所以选了它。MTD 部分我按照社区里的通用配置把 64 帧数据拼成一个距离-慢时间矩阵然后在慢时间维上加窗、做 64 点 FFT。加窗用布莱克曼窗是为了压低多普勒维的旁瓣避免强目标在速度维泄漏出去遮住弱目标。核心代码numPulses 64; rdMatrix zeros(samplesPerChirp, numPulses); for k 1:numPulses rdMatrix(:, k) mfOutFrame{k}; end % 沿着慢时间维加窗 winDoppler blackman(numPulses).; rdMatrix rdMatrix .* winDoppler; % 慢时间维 FFT注意是沿着维度2 rdMap fftshift(fft(rdMatrix, numPulses, 2), 2); rdMap 20*log10(abs(rdMap) eps);这段代码里新手容易犯的错是把 FFT 做在距离维而不是慢时间维导致多普勒图完全错乱。所以我会习惯在代码注释里明确写“FFT 沿维度 2”。另外距离-多普勒图上横轴是多普勒频率要换算成速度得用到雷达工作波长。假设载频 5.8 GHz波长约 0.0517 m速度与多普勒频率的关系是v lambda * fd / 2。A100 数据的 PRF 是fs / (samplesPerChirp blankLen)代入后大概在 60 kHz 左右对应的最大不模糊速度能达到 1550 m/s远超实际需求所以不用担心速度模糊。3.3 恒虚警检测CFAR与参数选择距离多普勒图上做检测直接用固定阈值不可靠因为噪声和杂波强度在距离维上变化很大。张陈峰用的是 CA-CFAR单元平均恒虚警。这种检测器取待检测单元周围一圈参考单元幅度平均值作为噪声估计再乘以一个门限系数得到检测门限。CFAR 参数需要结合数据调。我记录一组在这批 A100 数据上表现不错的参数可以作为起点参数数值说明参考窗长度距离维16左右各 8 个单元保护窗长度距离维4左右各 2 个单元防止目标能量泄漏进参考窗参考窗长度多普勒维8上下各 4 个单元保护窗长度多普勒维2上下各 1 个单元虚警概率 Pfa1e-6常规中等要求虚警少又不太漏检门限系数alpha在均匀高斯噪声假设下可以通过公式计算alpha N * (Pfa^(-1/N) - 1)其中 N 是参考单元总数。如果距离维参考窗 16、多普勒维参考窗 8N 16*8 128带入 Pfa1e-6算出的 alpha 大概在 14 到 15 之间。很多工具箱会自动算但自己算一次能理解为什么门限系数不是拍脑袋定的。CA-CFAR 在均匀背景下效果很好但如果参考窗里出现另一个强目标会把门限抬得过高导致弱目标漏检。所以在有多个目标的场景我会建议换 GO-CFAR也就是取左右两半参考窗较大的那个平均值做估计对强目标遮挡弱目标的情况更稳。张陈峰这批数据里目标数不多用 CA-CFAR 就够了。实测下来两个目标只要距离维相隔超过 20 个单元互相影响就可以忽略。4. 双实现验证从 MATLAB 脚本到 Simulink 模型4.1 参考实现的选择与接口设计张陈峰在社区里说的“双实现”第一套是普通的 MATLAB 脚本第二套是 Simulink 模型。两套实现跑同一批 A100 数据比较每一步的输出。我一开始觉得 Simulink 的意义不大毕竟脚本已经能出结果但真做完之后才发现Simulink 模型把数据流、模块延迟、位宽变化都显式化了很多脚本里“隐式”的假设在模型里藏不住。比如脚本里用矩阵操作天然对齐了每一帧但 Simulink 里用 Buffer 模块就得明确每帧点数、重叠点数和缓冲初始状态这对理解处理链路帮助很大。接口设计上我用From Workspace把 A100 数据导入 Simulink用To Workspace把关键节点的信号导出。为了让两边数据完全对齐Simulink 的固定步长必须设成1/fs求解器用离散求解器不要用连续求解器否则时间步和采样点对不上后面对比全是虚的。4.2 中间信号级对比与容差设置验证时我在两条链路里设置了四个对比点正交解调后的基带实部和虚部脉冲压缩输出的距离像MTD 输出的距离多普勒图CFAR 检测到的目标坐标列表前三个对比用归一化均方误差 NRMSE 和相关系数。归一化均方误差的计算方式是sqrt(mean((x - y).^2)) / (max(x) - min(x))。为什么用归一化而不是直接用 MSE因为不同节点的信号幅度量级差很多比如距离像幅度可能上万但多普勒图用 dB 表示可能只有几十不归一化的话没法设通用容差。我在这批数据上测出来的典型结果是前三个节点 NRMSE 都小于 1e-6相关系数超过 0.999999。这说明两边实现完全一致差异基本来自浮点累加顺序不同。最终 CFAR 检测坐标两边完全一致。这里有个经验如果 NRMSE 在 1e-3 这个量级可以接受一旦到 1e-2 以上就不要用“误差是浮点引起”来搪塞大概率是哪里算法实现不一样。4.3 验证结论与指标双实现验证最后要给出一个能写进文档的结论。张陈峰的做法是列出了对比表对比节点信号维度NRMSE相关系数是否通过基带 I/Q8192 x 643.2e-70.99999993通过脉冲压缩距离像8192 x 648.6e-70.99999971通过距离多普勒图dB8192 x 645.1e-70.99999995通过CFAR 目标列表N x 3距离、速度、幅度完全一致完全一致通过我觉得这个表格特别适合直接挂在项目文档里。做双实现验证不是为了走流程而是为了让后面的人接手时能很确定地说“脚本和模型可以互相替代。”在这个项目里Simulink 模型后续可以直接生成 C 代码部署到实时处理平台脚本则可以用来做算法研究两边验证通过说明两条路的算法逻辑是一样的迁移风险很低。5. 常见问题与排查技巧实录5.1 数据解析阶段的几个典型坑第一个坑是文件字节序。有次社区里另一位同学把 A100 数据当成大端读读出来的波形完全像噪声查了半天才发现是字节序问题。如果你在 Windows 上用 fread 默认读出来不对就试一试显式指定l小端或者b大端往往立刻看到正确的时域包络。第二个坑是通道交织和消隐区。A100 的双通道数据如果按单通道连续存储直接 reshape 成两列会有半帧错位我建议先用前 64 个点画个波形看看如果两个通道波形一样但错位几个点多半是交织顺序没解对。消隐区这块也容易漏漏了之后每帧之间会混入 128 个无效点压缩后的距离像上会出现周期性毛刺。第三个坑是帧对齐。真实采集数据如果没打同步标记处理完一帧之后下一帧的起点可能不在目标上。A100 数据好在每帧长度固定只要找到第一帧起点之后按固定步长读就行。如果数据里有触发通道优先用触发沿对齐这样即使丢帧也能重新对齐。5.2 脉冲压缩旁瓣过高或噪声底偏高旁瓣过高先看参考信号对不对。如果参考信号和发射信号的调频斜率、脉宽不一致脉冲压缩输出会从一根尖峰变成一片散焦的波形。我排查时先对参考信号做自相关自相关峰旁边如果出现明显的寄生峰说明参考信号本身就不干净。还有一种情况是 A100 采样率没有完全等于标称值频率源有微小偏差会导致压缩输出有轻微的失配损失这时用小范围搜索调频斜率微调参考信号通常能把旁瓣压回去。噪声底偏高多半是正交解调没做好。中频实信号直接匹配滤波镜像分量会把噪声底抬高 3 dB并且会造成目标距离像左右对称出现假峰。判断方法很简单看距离像远端理论上没有目标的地方是不是比近端高出 3 dB 左右。如果是就回到正交解调那一步检查低通滤波器是否生效。5.3 双实现结果不一致的定位方法如果你做双实现验证时发现 NRMSE 很大别急着怀疑浮点误差先隔离节点。我的做法是在两个实现里同时插入断点把第一个对比点之前的信号波形画出来叠加对比。如果从第一个节点就开始偏问题在数据导入或预处理如果第一个节点一致、第二个节点偏问题在两步之间的处理模块。还有一种很隐蔽的情况Simulink 模型里 Buffer 模块设置了重叠但脚本里做帧间处理时用的帧头位置和模型不同导致后续信号整体偏移。这种问题在时域波形叠加对比时一眼就能看出来相位差是线性递增的不是随机扰动。5.4 给新人的快速上手建议如果你第一次用 A100 数据跑这套流程我建议不要一上来就追求完整链路。先写一个脚本只读取一帧数据画出原始时域波形和频谱确认数据和参数表对得上。然后只做脉冲压缩看距离像上能不能看到一个明显的目标峰。走通这一步再做 MTD 和 CFAR最后再考虑 Simulink 验证和双实现对比。这个顺序能让你每一步错在哪里都清清楚楚而不是到最后对着一个乱糟糟的距离多普勒图无从下手。张陈峰这次能在社区里把工作闭环很大程度上就是因为他把“数据解析 - 单帧处理 - 多帧处理 - 双实现验证”这条路拆得很细。我后来看到他写的 README里面对每一帧数据的处理流程、每一步的预期输出、可能出现的异常都记录得很清楚这让其他人接手时少踩了很多坑。我这段时间把这套流程重新跑了几遍最大的体会是真实 ADC 数据里的“脏”其实才是最好的老师。你在仿真里永远想不到一个坏点会在脉冲压缩后造成多大的影响也想不到直流偏置能让零频附近的杂波高到什么程度。把这些问题一个个解决掉再回头看那些漂亮的理想仿真图你会知道每一步背后到底在对抗什么。也正因为这样我特别建议社区里做雷达信号处理的同学都去拿一份真实 ADC 数据从头到尾跑一遍别只停留在工具箱里点几个按钮。亲自解析二进制文件、亲自调 CFAR 参数、亲自做双实现比对跑下来比看十篇论文都管用。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门