DDMA信号处理以及数据处理的流程---cfar检测
Hello,大家好!我是Xiaojie。很高兴见到你!欢迎加入我们的学习交流。为了更好地向大家普及毫米波雷达技术的相关知识,Xiaojie将发起一个专题系列文章——《毫米波雷达信号处理与数据分析》,本系列文章将系统地从以下几个方面展开讲解:首先是目标生成原理及其实现方法,其次是信号仿真技术的应用,接着是测距与测速算法的具体实现,随后是基于CFAR检测的目标识别技术,再后是角度估计与目标聚类方法的探讨,最后是目标追踪算法的优化与应用。预计共约7至8篇内容,请持续关注我们的更新
最终效果如下:

整体文件的目录树如下:

本篇文章主要讲的是cfar检测部分。
cfar分析是雷达信号处理技术的核心内容,在CFAR算法运行过程中,雷达对检测目标实施的两项关键挑战:误报和漏检
主要原因是:
雷达在检测目标时受到强杂波和干扰的影响;
在捕获目标信号的过程中,系统也会随之而来的伴随接收到噪声、杂波以及干扰源产生的各种干扰信号;这些干扰呈现出随机特征,并且其数值持续波动。
在杂波和噪声等背景信号的影响下自适应地调节判决门限的过程不仅能够确保 radar 始终保持恒定的虚报概率而且构成了其核心机制的基础
恒虚警率就是保证虚警概率不变。虚警概率可以用如下式子表示
P_F = \int _{\gamma}^{\infty}p(T|H_0)dT
积分界限相当于判别阈值,在这里由检验统计量T确定。零假设H_0假定无信号状态存在与否的问题。通常情况下,在二元假设体系中包括两个假设:零假设(即无信号状态)和备择假设(即有信号状态)。为了控制虚报率(即假阳性情况),我们可以根据需求设定合理的判别阈值。一旦确定了这一阈值,则可以通过其来计算系统的检测能力。值得注意的是,在这种情况下所涉及的概率计算范围虽然相似——都是基于相应的前提条件——但具体应用的对象却有所不同。
CFAR检测器的类型
固定门限检测器
在该情况下,噪声大小遵循瑞利分布;其中的积分内容的概率密度被确定为;当门限被设定时,则其数值也随之固定下来。
自适应门限检测器
单元平均CFAR:CA-CFAR
选小CFAR检测器:SO-CFAR
选大CFAR检测器:GO-CFAR
有序CFAR检测器:OS-CFAR
代码解读
在不同距离区间内,杂波的平均功率表现出差异性,在系统设计中必须先对杂波的平均功率进行估算,并在此基础上通过计算得到相应的检测阈值以维持一致的虚警概率水平
1. 估计杂波平均功率:利用相邻单元的杂波平均功率近似相等这一条件,通过邻近距离单元回波功率来估计待检测距离单元杂波平均功率。
2. 将估计的杂波平均功率乘以一个系数作为检测门限
代码解读
CA-CFAR

SO-CFAR
若在某一参考距离单元内出现一个强力干扰源,则会导致CA-CFAR检测门限出现显著提升,并从而使那些较弱信号的探测变得困难。

对上图内容的说明:在左图中的特定距离单元位置进行阈值计算时,默认是以该距离单元为中心点左右两侧的位置作为基准区域,在绘制过程中发现由于弱目标区域内的背景中混杂了更强的目标存在,则会导致弱目标区域内的检测阈值过高从而容易出现误判情况;而右方图表采用了自适应CFAR(Constant False Alarm Rate)技术构建特征向量矩阵以提高检测效果
一种解决方案是分别对左右参考距离单元独立计算其杂波均值功率,并选取其中最小的那个估计值作为待检测的目标单元的杂波功率用于确定检测门限从而有效防止弱目标被遗漏。

适用场景:参考距离单元某一侧邻近距离单元存在强目标
GO-CFAR
当杂波严重不均匀时,采用CA-CFAR检测杂波边缘会产生虚警

对于上图的说明:左侧图表显示,在特定距离单元位置杂波幅度较高已超出了设定阈值从而造成了虚报右侧采用了GO-CFAR处理方法以提高检测精度
解决方法:分别对左右参考单元计算其杂波平均功率,并选择这些结果中的较大者作为待检测的距离单元

适用场景:非均匀杂波
OS-CFAR
在存在多个强干扰目标的情况下,在这种情况下,这些目标的存在会显著提高杂波平均功率。这将导致检测门限被抬高,并最终导致漏报现象的发生。

关于上图的解释:左图使用的是SO_CFAR;右图使用的是OS_CFAR
解决方法:对各参考单元的回波功率进行排序,并选择一个中间值用于表示待检测的距离单元杂波的平均功率以计算门限
接收信号

使用场景:存在多个强干扰目标的场景
本文cfar检测
在本文中采用了一种基于CFAR(Constant False Alarm Rate)检测算法,在该算法中采用固定门限机制来实现对目标信号的探测。当目标信号的能量超过设定门限时能够实现目标识别。在仿真过程中采用的是基于DDMA体制的雷达模型,在这种模型下发射信号会伴随60度的相位偏移,在这种情况下通过快速傅里叶变换和慢速傅里叶变换相结合的方式进行频谱分析,在这种处理方法下会产生六个频段,在这些频段中会有四个属于有效的信道响应区域而另外两个则是由于系统设计特性所形成的空子带区域。
在检测过程中,在6个频段中(即6个通道内),有4个频段的信号强度超过预设阈值(即达到设定的最小幅度),而剩下的两个频段的信号强度低于该阈值(即幅度未达到设定水平)。根据这一结果判定为有效目标;如果判定为有效目标,则需解速度模糊
基于Empty-band的DDMA解调

代码仿真
cfar.m文件
cfar.m文件专注于处理非相干累积后的RD图,并完成目标识别过程;其输出结果即为这些目标对应的点云数据。
function [pointList] = cfar(parameter,detectionMatrix)
globalNoise = getGlobalNoise(parameter,detectionMatrix); %全局底噪
dopplerNoise = getDopplerNoise(detectionMatrix); %doppler维度底噪
pointIndex = 1;
for rangeIdx = 1:1:parameter.rangeBin %循环所有rangebin
currentRangeRegionThresh = parameter.cfarRangeRegionThresh(ceil(rangeIdx / parameter.cfarEachRegionRangeBinNums)); %当前距离单元的cfar阈值
currentDopplerNoise = dopplerNoise(rangeIdx); %获取当前range index的doppler维度噪声
currentRangeThresh = currentDopplerNoise + currentRangeRegionThresh; %当前range index总阈值
for dopplerIdx = 1:1:parameter.subDopplerBin %循环一半dopplerBin
for subBandIdx = 1:1:parameter.subBand %循环6个子带
dopplerIdx1 = mod(dopplerIdx + parameter.subBandRelation(1) + parameter.subDopplerBin * (subBandIdx - 1), parameter.dopplerBin) + 1; %dopplerIdx1
dopplerIdx2 = mod(dopplerIdx + parameter.subBandRelation(2) + parameter.subDopplerBin * (subBandIdx - 1), parameter.dopplerBin) + 1; %dopplerIdx2
dopplerIdx3 = mod(dopplerIdx + parameter.subBandRelation(3) + parameter.subDopplerBin * (subBandIdx - 1), parameter.dopplerBin) + 1; %dopplerIdx3
dopplerIdx4 = mod(dopplerIdx + parameter.subBandRelation(4) + parameter.subDopplerBin * (subBandIdx - 1), parameter.dopplerBin) + 1; %dopplerIdx4
currentCellPower1 = detectionMatrix(dopplerIdx1,rangeIdx);%dopplerIdx1对应的power
currentCellPower2 = detectionMatrix(dopplerIdx2,rangeIdx);%dopplerIdx2对应的power
currentCellPower3 = detectionMatrix(dopplerIdx3,rangeIdx);%dopplerIdx3对应的power
currentCellPower4 = detectionMatrix(dopplerIdx4,rangeIdx);%dopplerIdx4对应的power
currentCellPower = [currentCellPower1,currentCellPower2,currentCellPower3,currentCellPower4]; %4个点的能量
maxPowerCurrentCell = max(currentCellPower); %4个点中最大的能量值
minPowerCurrentCell = min(currentCellPower); %4个点中最小的能量值
if (currentCellPower1 > currentRangeThresh && currentCellPower2 > currentRangeThresh && currentCellPower3 > currentRangeThresh && currentCellPower4 > currentRangeThresh && ...
(maxPowerCurrentCell - minPowerCurrentCell) < parameter.cfarChannelUnbalancedThresh) %条件判决, 进入判决的条件内的为目标点
pointList(pointIndex).rangeIdx = rangeIdx; %rangeIdx赋值
pointList(pointIndex).dopplerIdx = dopplerIdx1; %dopplerIdx赋值
if dopplerIdx1 > parameter.dopplerBinHalf %dopplerIdx1大于dopplerBinHalf
pointList(pointIndex).dopplerShiftIdx = dopplerIdx1 - parameter.dopplerBin; %dopplerShiftIdx赋值
else
pointList(pointIndex).dopplerShiftIdx = dopplerIdx1; %dopplerIdx赋值
end
% 普通DDM range和doppler赋值
%pointList(pointIndex).range = rangeIdx * parameter.rangeRes; %普通range赋值
%pointList(pointIndex).speed = pointList(pointIndex).dopplerShiftIdx * parameter.dopplerRes; %doppler赋值
pointList(pointIndex).range = range; %range赋值
pointList(pointIndex).speed = speed;
pointList(pointIndex).power = maxPowerCurrentCell; %功率赋值
pointList(pointIndex).snr = maxPowerCurrentCell - globalNoise; %信噪比赋值
pointList(pointIndex).txOrder = subBandIdx; %天线顺序
pointList(pointIndex).conf1 = 0; %置信度1赋值
pointList(pointIndex).conf2 = 0; %置信度2赋值
pointList(pointIndex).quality = 0; %点云质量赋值
pointIndex = pointIndex + 1;
end
end
end
end
end
%%
% 获取全局底噪
function noise = getGlobalNoise(parameter,detectionMatrix)
rangeIdx = parameter.cfarGlobalNoiseRangeIdx;
dopplerIdx = parameter.cfarGlobalNoiseDopplerIdx;
rangeLen = parameter.cfarGlobalNoiseRangeLen;
dopplerLen = parameter.cfarGlobalNoiseDopplerLen;
region1Noise = mean(mean(detectionMatrix(dopplerIdx - dopplerLen:dopplerIdx,rangeIdx - rangeLen:rangeIdx)));
region2Noise = mean(mean(detectionMatrix(dopplerIdx:dopplerIdx + dopplerLen,rangeIdx - rangeLen:rangeIdx)));
region3Noise = mean(mean(detectionMatrix(dopplerIdx - dopplerLen:dopplerIdx,rangeIdx:rangeIdx + rangeLen)));
region4Noise = mean(mean(detectionMatrix(dopplerIdx:dopplerIdx + dopplerLen,rangeIdx:rangeIdx + rangeLen)));
noise = min([region1Noise,region2Noise,region3Noise,region4Noise]);
end
%%
% 获取doppler维度底噪
function dopplerNoise = getDopplerNoise(detectionMatrix)
dopplerNoise = mean(detectionMatrix,1);
end
代码解读
参考文献
统计信号处理检测理论:CFAR检测
统计信号处理检测理论:CFAR检测
基于AWR2944的汽车雷达DDMA波形研究及其应用
深入探讨统计信号处理中的检测理论及其在CFAR(Constant False Alarm Rate)检测中的应用
至此,本片文章就此结束了。
