摘要:这篇文章接着上一篇文章并围绕着信号处理线程(SRR_DSS_mmWaveTask)来分析信号处理过程,首先对代码进行解读,然后将对信号处理链进行一个大致的总结。
1.函数原型
我们进入到该线程函数,可以看到函数一直运行在while循坏中,不出意外的话,DSS子系统将一直运行这个函数用来处理来着前端的原始数据。可以通过中断等操作阻塞这个线程函数。接下来我们直接进入到while循环体中,代码如下所示;
如上代码片段所示,进入函数之后首先就是通过标识符gSrrDSSMCB.frameStartIntToken来判断一个帧的是否处理完成,这个标识符是通过帧中断调用回调函数(如下所示)来标志为1的,表明一个帧的触发完成。
1.1 chirp处理
通过回调函数的触发来标识gSrrDSSMCB.chirpProcToken(如下所示),这个回调函数是当一个chirp可用时,触发中断,表明一个chirp需要被处理,这时应用程序将进入到这个if语句中执行相应的操作。
对应的操作如下代码所示;在这里我将讲述关于chirp处理的流程,由于代码篇幅过长,就不展开讲述了。
关于chirp的处理主要通过MmwDemo_processChirp函数来处理的,下面流程图是该chirp处理函数的大致流程图
数据流程图如下图所示;
1.2 帧间处理
在对一帧中所有的chirp处理之后,注意在这里说的一帧其实是一个子帧的单位(这个案例中配置了两个子帧),这时chirpCount标识符标志为1,并执行if语句中相对应的操作。帧间信号处理如下图1所示;
图 1
除了图中的基础算法之外,角度估计之后,还接着有聚类和跟踪算法。执行帧间处理主要由MmwDemo_interFrameProcessing
函数完成。进入帧间处理的if语句体,如下代码所示,部分代码已经注释。
可以将该if语句大致归结如下;
1.3 帧间处理链
这部分内容主要补充同于处理不同子帧中的帧间处理,即这部分内容主要由MmwDemo_interFrameProcessing函数完成,该行代码位于dss_main.c文件的第277行。由于该函数的篇幅过长,在这里通过流程图总结不同子帧帧间处理的处理链。如下图所示;
1.3.1 2DFFT
首先将存储在RadarCube(L3)中的数据通过EDMA搬移到DSS 的L2缓存区,依次通过加窗,FFT(慢时间维度)、log2(|*|)、非相干积累。这部分内容位于dss_data_path.c文件中的第1513行,该函数主要用于做上述的处理,流程图如下;
1.3.2 CFAR检测
接上一部分的内容,将上一部分非相干求和作为CFAR(恒虚警探测)的输入(当前CFAR是对当前距离bin进行),该算法利用DSP上运行的CFAR和Peak分组算法,通过距离/多普勒检测矩阵实现CFAR目标检测。CFAR检测在距离域和多普勒域进行。DPU输出在距离和多普勒域都被检测到的对象列表。首先在当前距离bin的前提下沿着Doppler维度进行CFAR,并经行峰值检测,如果当前处理的帧是SRR帧(子帧1)则利用中国剩余定理算法,获得更高的最大不模糊速度。其中使用DSP实现CFAR算法的流程图如下图1,应用程序的大致流程图如下图2;
图 1
图 2
1.3.3 角度估计
在上述的CFAR检测完成之后,接下来就是对探测到的目标沿着天线维度方向进行角度估计,这主要由azimuthProcessing函数完成的(在dss_data_path.c文件的第1767行),该函数执行第三维处理,包括方位角、x坐标和y坐标的计算。需要注意的是角度估计前需要对多普勒相偏进行补偿。大致流程图如下所示;
1.3.4 聚类和跟踪
在上述角度估计完成之后接着就是对输出的目标数据做更高级的算法,有关聚类算法和kalman追踪算法在Getting Start --SRR Demo中已经提到过,这里不在赘述,这部分内容的大致流程图如下所示;
总结
下面是整个过程的信号处理流程图:
这就是完整的信号处理流程图,另外由于本人较忙,收尾写得匆忙,不免有总结不到位的地方,顺便说一句,该案例就总结到此,后续文章将不在更新这案例的相关内容,如果想看其它案例的详解,可以联系小编商议。