TI雷达硬件加速器核心模块解析:CFAR、FFT拼接与统计模块实战 1. 项目概述与核心价值在毫米波雷达、激光雷达这类实时信号处理系统中我们开发者最头疼的就是如何在有限的功耗和算力下既要保证算法的精度又要满足严苛的实时性要求。传统的通用处理器CPU或数字信号处理器DSP在处理大规模FFT快速傅里叶变换和CFAR恒虚警率检测这类密集型运算时常常会捉襟见肘成为系统性能的瓶颈。德州仪器TI在其雷达片上系统SoC中集成的雷达硬件加速器Radar Hardware Accelerator正是为了解决这一痛点而生的专用硬件模块。它不是一个简单的协处理器而是一个高度定制化、可编程的流水线引擎专门为雷达信号处理链中的核心算法进行了硬件级优化。今天我们不谈那些宽泛的架构而是深入到最核心的“计算单元”Core Computational Unit把里面三个最硬核、也最让工程师感到困惑的模块掰开揉碎了讲清楚CFAR检测引擎、FFT拼接机制以及统计模块。如果你正在基于TI的AWR或IWR系列芯片进行雷达开发或者对高性能嵌入式信号处理硬件设计感兴趣那么理解这三个模块的工作原理、配置细节和实战技巧将直接决定你能否榨干硬件的最后一点性能设计出响应更快、检测更准、功耗更低的雷达系统。它们分别解决了信号处理链中“目标检测”、“大点数频谱分析”和“数据特征提取”这三个关键环节的加速问题。接下来我将结合手册中的技术细节和我自己在项目中的踩坑经验带你彻底搞懂它们。2. 核心计算单元架构与数据流总览在深入每个模块之前我们必须先建立起对核心计算单元整体数据流的宏观认识。这就像打仗前先看明白地图知道兵力数据从哪里来经过哪些关卡处理模块最终到哪里去。整个核心计算单元是一个高度可配置的流水线。数据从输入格式化器Input Formatter流入之后根据ACCEL_MODE寄存器的配置选择两条主要路径之一FFT引擎路径ACCEL_MODE 00b或CFAR引擎路径ACCEL_MODE 01b。这两条路径在硬件上是互斥的同一时刻只能激活一条。FFT引擎路径是处理的主干道它又串联了三个关键子模块预处理模块Pre-Processing这是数据进入计算核心的第一站。它负责一些“粗加工”比如利用可编程阈值对强干扰脉冲进行归零Interference Zero-Out或者进行复数乘法。这个复数乘法功能非常灵活共有七种模式包括频率搬移、慢速DFT计算、FFT拼接所需的旋转因子乘法、求模平方、标量乘法以及两种向量乘法模式。它就像是食材进入厨房后的清洗、切配环节。加窗与FFT模块WindowingFFT这是核心的“烹饪”环节。数据经过加窗减少频谱泄漏后送入FFT引擎进行变换。需要注意的是该FFT引擎原生支持的最大点数是1024点复数。这对于许多应用来说已经足够但对于需要极高距离分辨率或速度分辨率的场景1024点可能不够。对数幅度后处理与统计模块Log-Magnitude Post-processing Statistics这是“装盘和质检”环节。FFT输出的复数结果可以在这里被转换为幅度或对数幅度常用于CFAR检测。同时统计模块会实时计算每个处理批次iteration中数据的最大值、最大值索引以及和值或平均值。这些统计结果既可以存入专用寄存器供CPU读取也可以直接输出到内存。CFAR引擎路径则是一条并行的“快速检测通道”。当ACCEL_MODE设置为01b时输入数据直接绕过FFT引擎送入CFAR检测器。这条路径也包含一个对数幅度预处理模块用于将输入的复数数据转换为CFAR算法所需的实数值幅度、幅度平方或对数幅度。CFAR引擎内部实现了完整的CA、CAGO、CASO检测算法并能输出检测到的峰值列表或原始的噪声平均值。两条路径最终都汇入输出格式化器Output Formatter将处理结果写入加速器的本地内存如ACCEL_MEM0/1/2或通过DMA传输到系统主存L3。理解这个数据流至关重要因为它决定了你如何编排多个“参数集”Parameter-Set来形成一个完整的处理链。例如你可以先用一个参数集做FFT和对数幅度计算将结果暂存再用另一个参数集切换为CFAR模式从内存中读取对数幅度结果进行峰值检测。这种灵活性是软件实现难以比拟的。3. CFAR检测引擎从原理到寄存器配置的实战解析恒虚警率检测是雷达自动目标检测的基石。它的目标是在背景噪声功率未知且可能变化的情况下保持一个恒定的虚警概率从而可靠地检测出目标。TI的硬件加速器实现了最经典的单元平均CFAR及其变种。3.1 CFAR-CA算法在硬件中的实现流程硬件加速器实现的CFAR流程可以形象地理解为一个滑动的“检测窗口”在数据序列上移动。对于窗口中心的每一个“待检测单元”硬件自动执行以下步骤参考窗选取以待检测单元为中心左右两侧分别忽略一定数量的“保护单元”CFAR_GUARD_INT。保护单元之外再各选取一定数量的“参考单元”用于估计背景噪声。左右参考单元的数量分别由CFAR_AVG_LEFT和CFAR_AVG_RIGHT寄存器控制实际用于平均的样本数是寄存器值的两倍。例如设置为16则每侧使用32个样本。噪声估计对左右两侧参考单元内的样本值可能是幅度、幅度平方或对数幅度分别求和。然后根据CFAR_CA_MODE的配置决定如何利用这两个和值00b (CFAR-CA)将左右两侧的和值相加共同估计噪声。01b (CFAR-CAGO)取左右两侧和值中的较大者作为噪声估计。这在多目标或杂波边缘环境下有助于避免漏警。10b (CFAR-CASO)取左右两侧和值中的较小者作为噪声估计。这在均匀杂波背景中能获得更好的检测性能。求平均与阈值计算将上一步得到的噪声和值右移CFAR_NOISE_DIV指定的位数即除以2^N得到“平均噪声水平”。这个设计很巧妙用简单的移位代替了除法器节省了硬件资源。然后用这个平均噪声水平乘以线性模式或加上对数模式一个由CFAR_THRESH寄存器设定的缩放因子得到最终的检测阈值。判决与输出比较待检测单元的值与阈值。如果大于阈值则判定为潜在目标点峰值。根据CFAR_OUT_MODE的配置结果可以有两种输出方式检测峰值列表模式只输出那些超过阈值的点的索引和值可以是噪声平均值或单元值本身。索引由迭代号高12位和样本号低12位组成共24位。FFTPEAKCNT寄存器会实时记录检测到的峰值数量告诉CPU该读取多少个结果。原始输出模式输出每一个待检测单元对应的噪声平均值和单元值或二值化的检测标志。这种方式会输出所有单元的结果数据量较大但便于后续进行更复杂的软件端处理。3.2 关键配置详解与避坑指南手册中的寄存器描述已经比较详细但结合实战有几个细节必须格外注意输入模式与预处理选择 (CFAR_INP_MODE,CFAR_ABS_MODE,CFAR_LOG_MODE)这是最容易配置出错的地方。这三个寄存器共同决定了输入数据的格式和算法模式。场景一输入已是实数值如FFT后的对数幅度结果如果你想直接对已经计算好的对数幅度数据进行CFAR检测配置应为CFAR_INP_MODE 1(输入为实数)CFAR_ABS_MODE 00(无关因为输入已是实数)CFAR_LOG_MODE 1(启用对数CFAR模式阈值做加法)。 此时CFAR_THRESH寄存器被解释为7.11格式的定点数7位整数11位小数。假设你根据虚警概率公式计算出的阈值为T单位为dB那么寄存器值应设置为round(T * 2^11)。例如阈值T 6.5 dB则寄存器值 round(6.5 * 2048) round(13312) 13312 (0x3400)。场景二输入为复数需在CFAR引擎内计算对数幅度如果你想对原始的复数FFT结果直接进行对数CFAR检测配置应为CFAR_INP_MODE 0(输入为复数)CFAR_ABS_MODE 11(启用对数幅度计算)CFAR_LOG_MODE 1(对数CFAR模式)。 硬件内部会先使用JPL近似算法计算复数幅度再通过查找表计算log2最后再进行CFAR检测。这里有一个关键点硬件内部的对数幅度输出是定点数其标度Scaling需要与你设定的CFAR_THRESH相匹配。TI的近似算法通常有一个固定的转换关系你需要查阅更底层的文档或通过实验来确定CFAR_THRESH的实际物理意义例如多少寄存器值对应多少dB。盲目设置阈值会导致检测性能严重偏离预期。场景三线性CFAR使用幅度或幅度平方对于线性CFARCFAR_LOG_MODE 0。此时CFAR_THRESH被解释为14.4格式的定点数。假设你根据虚警概率和参考窗长度计算出的标称阈值因子为α那么寄存器值应设置为round(α * 16)。因为.4表示4位小数分辨率是1/16。例如α 2.5则寄存器值 round(2.5 * 16) 40 (0x28)。避坑提示务必在系统初始化阶段通过注入已知幅度的测试信号来校准CFAR_THRESH寄存器值与实际虚警率/检测概率的对应关系。纸上谈兵的计算往往因为硬件量化、近似算法等因素而产生偏差。循环与非循环模式 (CFAR_CYCLIC)这是处理数据边界问题的关键。非循环模式 (CFAR_CYCLIC 0)这是默认模式。在数据序列的开头和结尾由于一侧的参考窗不足硬件会自动只使用另一侧完整的参考窗进行噪声估计。例如对于序列开头的点只使用右侧参考窗。此时为了保持CFAR损失一致硬件内部会对单侧噪声和值进行补偿例如乘以2以模拟两侧平均的效果。这种模式适用于处理普通的线性数据如一个 chirp 的FFT结果。循环模式 (CFAR_CYCLIC 1)这种模式将数据序列视为一个环。对于边界点不足的参考单元会从序列的另一端“借”数据。例如对于序列的第一个点其左侧参考单元由序列末尾的数据填充。这种模式特别适用于多普勒FFT速度维处理后的数据因为多普勒频谱本身在理论上是周期性的速度模糊。启用循环模式能消除边界处的检测性能损失。配置循环模式是个技术活你需要同时配置CFAR引擎和输入格式化器的相关寄存器。核心思想是让输入格式化器“重复发送”序列开头和末尾的一部分数据以构造出一个虚拟的、可供CFAR引擎进行循环索引的扩展序列。具体需要设置CIRCIRSHIFT循环起始偏移和CIRCSHIFTWRAP循环长度必须是2的幂。手册中的例子256点数据32个参考单元3个保护单元非常典型建议作为模板使用。4. FFT拼接突破1024点限制的工程魔法当你的应用需要2048点或4096点的大尺寸FFT来获取更高分辨率时而硬件原生只支持到1024点怎么办FFT拼接技术就是答案。它不是简单地让FFT引擎算得更久而是利用数学上的“分解-重组”原理通过两次或多次小尺寸FFT的巧妙组合来实现大尺寸FFT。4.1 FFT拼接的数学本质与硬件实现以4096点FFT为例其数学本质是利用了FFT的频域抽取或时域抽取思想。TI加速器采用的是类似频域抽取的方法将一个N点FFT分解为若干个小FFT和一级“缝合”FFT。第一步分解与子FFT计算假设原始4096点复数序列为x[n]。我们不是直接计算X[k] FFT{x[n]}而是将x[n]按每4个点抽取一次得到4个子序列x0[m] x[4m]x1[m] x[4m1]x2[m] x[4m2]x3[m] x[4m3]其中m 0, 1, ..., 1023。分别计算这4个子序列的1024点FFT得到X0[q],X1[q],X2[q],X3[q]q 0, 1, ..., 1023。 这一步在硬件上通过配置第一个参数集完成设置FFTSIZE10(1024点)REG_BCNT3(4次迭代)并巧妙配置SRCAINDX和SRCBINDX来实现对原始内存的“跳跃式”读取。SRCAINDX16意味着每次步进16字节4个复数样本正好跳过4个点SRCBINDX4意味着每次迭代的起始地址偏移4字节1个复数样本从而依次抓取x0,x1,x2,x3。第二步旋转因子乘法与缝合FFT根据FFT理论最终的4096点FFT结果X[k]可以通过X0[q],X1[q],X2[q],X3[q]组合得到但组合前每个Xi[q]需要乘以一个特定的复数旋转因子W_{4096}^{i*q}。这正是预处理模块中复数乘法器的FFT拼接模式(CMULT_MODE 011b) 所做的事情。TWIDINCR寄存器的低两位用于选择2K或4K拼接模式。 完成旋转因子乘法后对于每一个频率索引q我们得到了一个4点的序列[X0[q], X1[q], X2[q], X3[q]]。对这个4点序列再做一次FFT就得到了最终4096点FFT结果中频率索引为k q 0*1024,k q 1*1024,k q 2*1024,k q 3*1024的四个点。 这一步由第二个参数集完成设置FFTSIZE2(4点FFT)CMULT_MODE3TWIDINCR1(4K模式)REG_BCNT1023(执行1024次4点FFT)。通过精心设置DSTAINDX和DSTBINDX可以将这1024组4点FFT的输出以正确的顺序写回内存最终得到线性排列的4096点FFT结果。4.2 加窗处理的特殊考量在大尺寸FFT中加窗同样重要。但Window RAM只能存储1024个系数。对于4096点FFT我们需要4096个窗系数。硬件提供了线性插值功能来解决这个问题。系数存储你只需要将4096点窗函数每隔4点抽取一个得到1024个系数存入Window RAM。插值使能在第一个参数集计算4个1024点FFT中设置WINDOW_INTERP_FRACTION 01b(对于4K FFT)。硬件自动插值硬件在执行4次迭代时会自动为每次迭代生成不同的窗系数迭代0直接使用Window RAM中的系数C[m]。迭代1使用0.75*C[m] 0.25*C[m1]的插值结果。迭代2使用0.5*C[m] 0.5*C[m1]的插值结果。迭代3使用0.25*C[m] 0.75*C[m1]的插值结果。 这样就近似得到了完整的4096点窗函数。需要注意的是启用窗系数插值后对称窗模式 (WINSYMM1) 将不可用因为插值破坏了系数的对称性。实操心得FFT拼接会引入额外的计算开销和延迟因为它需要两个参数集顺序执行。在系统设计时务必评估4096点FFT带来的分辨率提升是否值得付出这些代价。对于许多汽车雷达应用1024点FFT已经足够盲目追求大点数可能会得不偿失。此外拼接过程涉及复杂的内存访问模式务必仔细核对SRCAINDX、SRCBINDX、DSTAINDX、DSTBINDX这些寄存器的值一个算错就会导致全盘数据错乱。建议先用一个已知的简单信号如单频正弦波进行验证。5. 统计模块不止于求和与最大值的智慧统计模块位于FFT引擎路径的末端看似简单只能计算和值与最大值但其在系统优化和高级算法实现中扮演着“瑞士军刀”般的角色。5.1 核心功能与输出模式统计模块主要提供两种统计量最大值统计记录每个处理迭代中输出数据的最大值及其索引。当使能了对数幅度计算时这直接就是该次迭代例如一个chirp的FFT结果中的最强峰值及其位置对于快速寻找潜在目标非常有用。和值统计记录每个处理迭代中输出数据的和对于复数数据是I、Q分别求和。这个功能更为强大。数据的输出有三种模式由FFT_OUTPUT_MODE控制00b默认模式。FFT或对数幅度等主处理结果正常输出到内存。10b最大值统计模式。每个迭代只输出一个最大值和其索引。11b和值统计模式。每个迭代只输出I、Q的和值。关键点当迭代次数由REG_BCNT控制大于4时统计模块内部的4组寄存器 (MAXn_VALUE,MAXn_INDEX,ISUMn,QSUMn) 就不够用了。此时必须使用统计输出模式10b或11b将每个迭代的统计结果直接输出到目的地内存才能获取完整的统计信息。5.2 高级应用场景实现慢速DFT与相关运算统计模块的真正威力在于与预处理模块中的复数乘法器联动。场景一实现高分辨率DFT频率精估FFT引擎提供的是整数倍频率分辨率的频谱。如果我们怀疑目标峰值落在两个FFT频点之间需要更精确的频率估计就需要在峰值附近进行局部DFT插值。这时可以设置CMULT_MODE 010b(频率搬移自动递增模式即慢速DFT模式)。配置输入格式化器将同一段时域数据重复发送N次N为需要计算的DFT点数。在每次迭代中复数乘法器会对数据乘以一个不同频率的旋转因子频率由TWIDINCR起始按FFTSIZE决定的步进自动递增。启用统计模块的和值输出模式 (FFT_OUTPUT_MODE 11b)。统计模块会对每次迭代中旋转后的所有数据点进行累加即实现DFT公式中的求和操作。 最终输出内存中得到的N个复数就是原始数据在N个精确频率点上的DFT结果。这就是利用硬件加速器实现“Goertzel”算法或局部频谱细化的硬件加速版本比用软件循环计算快得多。场景二实现向量点积相关运算复数乘法器的向量乘法模式 (CMULT_MODE 110b或111b) 可以将输入流与预存在内部RAM中的另一个向量进行逐元素相乘。如果再结合统计模块的和值功能就能在硬件中一次性完成两个向量的点积运算。将参考向量例如一个匹配滤波器的系数通过DMA预先加载到加速器的内部RAM中注意使用STG1LUTSELWR寄存器切换访问对象。配置CMULT_MODE 110b(向量乘法模式1每次迭代后地址复位)。输入格式化器将待处理的信号向量送入核心。启用统计模块的和值输出模式。硬件会在一次迭代内完成所有对应元素的乘加运算并输出最终的点积结果一个复数。这对于实现脉冲压缩、数字波束成形中的权重求和等算法是极佳的硬件加速。注意事项用于向量乘法的内部RAM与执行1024点FFT时使用的RAM是同一块。这意味着如果你先做了向量乘法紧接着又要做1024点FFT那么FFT运算会覆盖掉RAM中的向量系数。你必须在使用FFT前重新加载系数。因此在算法流程设计上要避免这种需要频繁重载系数的场景或者将FFT尺寸控制在512点及以下使用不同的RAM。6. 核心模块的联合应用与性能调优思路单独理解每个模块是基础但真正的功力体现在如何将它们串联起来构建一个高效、完整的处理链。这里分享几个实战中的设计思路和调优经验。思路一级联处理与内存管理一个典型的雷达处理链可能是ADC数据 - 干扰抑制预处理模块 - 2K FFTFFT拼接 - 对数幅度计算 - CFAR检测。这需要至少3个参数集。参数集0ACCEL_MODE00b。启用预处理干扰归零配置复数乘法器为FFT拼接模式执行第一步两个1024点FFT结果写入ACCEL_MEM2。参数集1ACCEL_MODE00b。从ACCEL_MEM2读取数据执行第二步1024个2点FFT这里应为1024个2点FFT的缝合步骤对于2K FFT第二步是2点FFT并启用对数幅度计算结果写入ACCEL_MEM0。参数集2ACCEL_MODE01b。从ACCEL_MEM0读取对数幅度数据配置CFAR引擎进行峰值检测输出峰值列表到ACCEL_MEM1。 关键是要规划好ACCEL_MEM0/1/2这三个128位宽本地内存的使用避免读写冲突。通常采用“乒乓”操作一个参数集写MEM0下一个就读MEM0并写MEM1如此循环。思路二利用统计模块进行系统健康监测你可以在正常的FFT处理参数集中偶尔插入一个“诊断”参数集。这个参数集将FFT_OUTPUT_MODE设置为最大值统计模式并让输入格式化器读取一段已知的、无目标的静态背景数据或测试信号。通过分析统计模块输出的噪声基底最大值和平均值可以在线监测接收链路的增益变化、噪声水平波动甚至实现自动增益控制AGC的辅助决策。这是一种低开销的系统健康管理手段。性能调优核心寄存器配置与数据流硬件加速器的性能瓶颈往往不在计算本身而在数据搬运和配置开销。最大化连续访问尽量让SRCAINDX、DSTAINDX等于416位实/虚部或832位实/虚部让SRCBINDX、DSTBINDX等于单个迭代数据块的大小这样可以保证内存访问是连续、高效的充分利用128位宽内存总线的带宽。减少参数集切换每次切换参数集都有小的延迟。如果可能尽量在一个参数集内通过设置REG_BCNT来完成多次相同的操作如对多个RX天线的数据做相同的FFT而不是为每个天线配置一个独立的参数集。巧用“内联”与“批处理”对于每个chirp都需进行的FFT距离维FFT使用加速器的内联模式FFT1DEN1可以让ADC数据直接进入加速器处理省去DMA搬运。对于跨chirp的FFT多普勒维FFT由于数据已存储在L3内存则使用批处理模式通过DMA批量搬入加速器处理。混合使用这两种模式可以最大化数据吞吐率。7. 常见问题排查与调试技巧实录即使理解了所有原理在实际调试中依然会遇到各种问题。下面是我在项目中总结的一些典型问题及其排查思路。问题1CFAR检测不到已知强度的目标信号。检查清单输入数据格式确认CFAR_INP_MODE、CFAR_ABS_MODE、CFAR_LOG_MODE的设置与输入数据的物理意义线性幅度、功率、对数幅度完全匹配。这是最高频的错误来源。阈值因子CFAR_THRESH确认寄存器值的格式14.4 或 7.11和计算是否正确。最可靠的方法是做校准输入一个纯噪声序列逐步提高阈值直到CFAR输出峰值列表为空记录此时的阈值寄存器值这个值就对应了你的系统在当前配置下的噪声基底。目标阈值应在此基础上增加。参考窗与保护单元检查CFAR_AVG_LEFT/RIGHT和CFAR_GUARD_INT。如果目标较宽占多个距离单元保护单元设置过小会导致目标能量“污染”参考窗拉高噪声估计从而淹没目标本身。数据饱和检查FFT输出或对数幅度计算后的数据是否发生了饱和例如超过24位有符号数的表示范围。饱和会导致信号失真影响CFAR检测。问题2FFT拼接后的频谱出现错误或镜像。检查清单内存索引寄存器这是重中之重。反复核对两个参数集中的SRCAINDX、SRCBINDX、DSTAINDX、DSTBINDX。一个常见的错误是搞混了“字节偏移”和“样本偏移”。寄存器值代表的是字节地址的偏移量。一个复数样本16位I16位Q占4字节一个复数样本32位I32位Q占8字节。旋转因子模式TWIDINCR确认在第二步的参数集中CMULT_MODE3(FFT拼接)且TWIDINCR的低2位正确设置00b for 2K, 01b for 4K。窗系数插值如果使用了加窗确认WINDOW_INTERP_FRACTION设置正确并且Window RAM中加载的是抽取后的窗系数。可以先用矩形窗所有系数为1测试排除窗函数的影响。数据顺序用一组已知的、频谱简单的测试数据如单频信号进行验证。观察拼接后的频谱峰值是否出现在正确的频率bin上。问题3统计模块输出的和值或最大值明显不合理。检查清单输出模式FFT_OUTPUT_MODE确认当前参数集确实配置为统计输出模式10b或11b。在默认模式00b下统计结果只会更新内部寄存器不会输出到内存。目的地内存配置在统计输出模式下DSTACNT、DSTAINDX等寄存器虽然手册说可以设成固定值但为了安全起见建议按手册推荐设置DSTACNT4095DSTAINDXDSTBINDX8DST16b32b1DSTREAL0。这确保了每个迭代的统计结果一个复数I和Q各24位能按32位对齐连续写入内存。和值缩放FFTSUMDIV当使用和值统计模式时内部36位的累加和需要右移FFTSUMDIV位后才变成24位输出。如果FFTSUMDIV设置过小输出会饱和设置过大输出精度会损失。需要根据输入数据的动态范围和迭代次数累加次数来估算一个合适的值。例如输入数据是16位1024次累加理论最大增长10位那么FFTSUMDIV至少需要设置为10才能保证36位累加器不溢出。通常可以设置得稍大一些比如12牺牲一点LSB精度来确保安全。问题4系统吞吐率达不到理论值。检查清单内存带宽使用TI的SysBIOS或Linux下的性能分析工具查看DMA传输是否占用了过多总线带宽与加速器计算产生了竞争。优化DMA传输的突发长度和优先级。加速器空闲在连续处理流数据时确保参数集链配置正确使得当前参数集处理完成后能立即启动下一个没有等待时间。检查参数集触发模式是自动链式还是软件触发。数据依赖如果后续处理如CFAR必须等待前序处理如FFT全部完成才能开始就会产生气泡。考虑使用双缓冲甚至三缓冲机制让FFT处理下一帧数据时CFAR处理上一帧数据实现流水线并行。调试这类硬件加速器最强大的工具往往是“最小化可复现测试案例”。不要一开始就在完整的雷达信号链上调试。先写一个最简单的测试程序在内存中构造一个已知的、幅度可控的单频复数信号然后配置加速器进行FFT-对数幅度-CFAR检测。观察每一步输出的内存数据与你在MATLAB或Python中计算的黄金参考值进行比对。一旦这个简单链路通了再逐步增加复杂度如加窗、多迭代、拼接等这样能最快地定位问题所在。