统计信号处理检测理论:CFAR检测

恒虚警检测(Constant False Alarm Rate, CFAR) 雷达领域的经典方法,之前一直读C F A R,其实应该读 C FAR 😀😀
关于CFAR算法的相关理论知识及代码网上已经有了较多的参考,所以本文的目的主要是整理一下学习过程,文章的最后给出了一些参考书籍、网课以及相关博客。

  • 相关的统计检测理论的概念:二元/多元假设简单/复合假设白噪声/色噪声检测高斯/非高斯检测虚警概率检测概率漏景概率检验统计量检测门限贝叶斯准则/奈曼皮尔逊准则ROC曲线偏移系数等。如果概念不清晰的,建议先查缺不漏。

1. CFAR检测的概念

雷达检测目标时所面临的两大问题:虚警、漏报

主要原因为:1.雷达在检测目标时受到强杂波和干扰的影响;2.接收目标信号时,还会接收噪声、杂波和干扰信号,这些信号具有随机性,信号的强度时刻发生变化。
雷达如何根据杂波、噪声等背景信号自适应调整判决门限以保证雷达具有恒定的虚警概率是雷达CFAR检测的关键
也就是说恒虚警就是保证虚警概率不变。虚警概率可以用如下式子表示
目标检测 虚警率 虚警概率和检测门限_多目标积分下限是判决门限,T是检验统计量,H_0是无信号的假设:二元假设:H_0:无信号;H_1:有信号
一般是设定虚警概率,可以解出判决门限,通过判决门限计算检测概率:检测概率的积分区间跟虚警概率的积分区间是一样的,只是基于的假设不同。
关于虚警概率、判决门限、检测概率的关系不再展开了,可以自行查阅文末提及的网课中的检测理论部分。实际系统中为了实现好的检测效果,虚警概率设置为10e-12量级。

2. CFAR检测器的特性:

如何判断检测器是否具有CFAR检测特性?

  • 在H_0条件下检验统计量的概率密度函数中不包含未知参数则可以认为是CFAR检测

3. CFAR检测器的类型

  • 固定门限检测器
  • 自适应门限检测器
  • 单元平均CFAR: CA-CFAR
  • 选小CFAR检测器:SO-CFAR
  • 选大CFAR检测器:GO-CFAR
  • 有序CFAR检测器:OS-CFAR

4. CFAR检测器的实现

  • 白噪声背景下的CFAR——固定门限检测器
    这种情况下噪声幅度服从瑞利分布,上述积分里的概率密度精确已知,确定了门限那么积分值就定了
    噪声平均功率:P_n=kTBF (雷达原理内容)
  • 瑞利分布杂波背景下的CFAR检测——自适应门限检测器
    不同距离段的杂波平均功率是不同的,为了保证虚警概率恒定,需要估计杂波平均功率,然后根据杂波平均功率设置检测门限
估计杂波平均功率:利用相邻单元的杂波平均功率近似相等这一条件,通过邻近距离单元回波功率来估计待检测距离单元杂波平均功率。
 将估计的杂波平均功率乘以一个系数作为检测门限。

(1)平均CA-CFAR(代码见下文)

目标检测 虚警率 虚警概率和检测门限_目标检测 虚警率_02

(2)选小SO-CFAR(代码见下文)

当参考距离单元内存在一个强干扰目标时,CA-CFAR检测门限会提高,导致信号较弱的目标难以检测。

目标检测 虚警率 虚警概率和检测门限_目标检测 虚警率_03


关于上图的解释: 左图某个距离单元处的门限计算是以该距离单元为中心左侧跟右侧是参考单元,在左图中由于弱目标的参考单元中包括了强的目标,使得在弱目标处的门限计算偏大,造成漏检;右图使用的的SO_CFAR.

解决方法: 将左右参考距离单元的杂波平均功率单独计算,并取其中较小的估计值作为待检测距离单元杂波平均功率来计算检测门限以避免弱目标被漏检。

目标检测 虚警率 虚警概率和检测门限_自适应_04

适用场景: 参考距离单元某一侧临近距离单元存在强目标

(3)选大GO-CFAR(代码见下文)

当杂波严重不均匀时,采用CA-CFAR检测杂波边缘会产生虚警。

目标检测 虚警率 虚警概率和检测门限_自适应_05


关于上图的解释: 左图表示某些距离单元处杂波幅度值比较大,超过了门限,导致了虚警; 右图使用的是GO_CFAR;

解决方法: 将左右参考单元的杂波平均功率单独计算,并取其中较大的估计值作为待检测距离单元杂波平均功率来计算检测门限。

目标检测 虚警率 虚警概率和检测门限_目标检测 虚警率_06

适用场景: 非均匀杂波

(4)有序OS-CFAR(代码见下文)

当参考单元内存在**多个强干扰目标**时,多个目标的存在会导致估计的杂波平均功率过高,从而抬高检测门限、导致漏警。

目标检测 虚警率 虚警概率和检测门限_多目标_07

关于上图的解释: 左图使用的是SO_CFAR;右图使用的是OS_CFAR

解决方法: 将各参考距离单元回波功率进行排序,选取中间某个值作为待检测距离单元杂波平均功率来计算门限。

目标检测 虚警率 虚警概率和检测门限_算法_08


适用场景: 存在多个强干扰目标的场景

仿真代码

%% 程序初始化
clc;clear all;close all;
%% 均匀背景噪声(单目标&多目标)
shape=300;
variance=1;
noise_db=8;
noise_p=10.^(noise_db./10);
c=10^(noise_db/10);     % 这里是幅度——功率
xc=c + random('Normal',0,variance,1,shape);
% 单目标 or 多目标
SNR1=14;    
signal1_p=10.^(SNR1./10).*noise_p;
xc(1,110)=signal1_p;
SNR2=4;
signal2_p=10.^(SNR2./10).*noise_p;
xc(1,100)=signal2_p;
%%下方目标在使用OS_CFAR时添加
SNR3=12;
signal3_p=10.^(SNR3./10).*noise_p;
xc(1,105)=signal3_p;
SNR4=4;
signal4_p=10.^(SNR4./10).*noise_p;
xc(1,115)=signal4_p;
SNR5=12;
signal5_p=10.^(SNR5./10).*noise_p;
xc(1,120)=signal5_p;
%% 算法结果&图谱显示
N=36;
pro_N=2;
PAD=0.2;
k=2.*N./4;
alpha=N.*(PAD.^(-1./N)-1);
index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2;
XT=zeros(1,length(index));
%% CA_CFAR
% for i=index
%     cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1);
%     cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2);
%     Z=(sum(cell_left)+sum(cell_right))./N;
%     XT(1,i-N/2-pro_N/2)=Z.*alpha;
% end
%% SO_CFAR
% for i=index
%     cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1);
%     cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2);
%     Z=min([mean(cell_left),mean(cell_right)]);
%     XT(1,i-N/2-pro_N/2)=Z.*alpha;
% end
%% OS_CFAR
% %需要再加一个信号
for i=index
    cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1);
    cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2);
    cell_all=cat(2,cell_left,cell_right);
    cell_sort=sort(cell_all);
    Z=cell_sort(1,k);  %%需要设定一个位置k
    XT(1,i-N/2-pro_N/2)=Z.*alpha;
end
figure;
plot(10.*log(abs(xc))./log(10),"LineWidth",1,'Color',[0 0 1]),hold on;
plot(index,10.*log(abs(XT))./log(10),"LineWidth",1,'Color',[1 0 0]),hold on;
legend("接收信号","检测门限")
xlabel("距离单元","FontWeight","bold")
ylabel("信号幅度(dB)","FontWeight","bold")
grid on

GO_CFAR需要修改杂波形式,另起一个文件

%% 程序初始化
clc;clear all;close all;
%% 非均匀背景噪声(单目标&多目标)
shape=300;
variance=1;
noise_db=8;
noise_p=10.^(noise_db./10);
c=10^(noise_db/10);     % 这里是幅度——功率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xc=c +random('Normal',0,variance,1,shape(1,end));
xc(1,150:180)=xc(1,150:180)*14;  %% 此处应该使用乘法:取对数后变成加法,对应图像中的杂波加的偏置
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 单目标 or 多目标
SNR1=14;    
signal1_p=10.^(SNR1./10).*noise_p;
xc(1,110)=signal1_p;
%% 算法结果&图谱显示
N=36;
pro_N=2;
PAD=0.2;
k=2.*N./4;
alpha=N.*(PAD.^(-1./N)-1);
index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2;
XT=zeros(1,length(index));
%% CA_CFAR
for i=index
    cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1);
    cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2);
    Z=(sum(cell_left)+sum(cell_right))./N;
    XT1(1,i-N/2-pro_N/2)=Z.*alpha;
end
%% GO_CFAR需要修改杂波形式,另起一个文件
for i=index
    cell_left=xc(1,i-N/2-pro_N/2:i-pro_N/2-1);
    cell_right=xc(1,i+pro_N/2+1:i+N/2+pro_N/2);
    Z=max([mean(cell_left),mean(cell_right)]);

    XT2(1,i-N/2-pro_N/2)=Z.*alpha;
end
figure;
subplot(121)
plot(10.*log(abs(xc))./log(10),"LineWidth",1,'Color',[0 0 1]),hold on;
plot(index,10.*log(abs(XT1))./log(10),"LineWidth",1,'Color',[1 0 0]),hold on;
legend("接收信号","检测门限")
xlabel("距离单元","FontWeight","bold")
ylabel("信号幅度(dB)","FontWeight","bold")
title("CA_ CFAR")
grid on
subplot(122)
plot(10.*log(abs(xc))./log(10),"LineWidth",1,'Color',[0 0 1]),hold on;
plot(index,10.*log(abs(XT2))./log(10),"LineWidth",1,'Color',[1 0 0]),hold on;
legend("接收信号","检测门限")
xlabel("距离单元","FontWeight","bold")
ylabel("信号幅度(dB)","FontWeight","bold")
title("GO_ CFAR")
grid on

#---------------------------------------------------------------其他杂波分布下的CFAR---------------------------------------------------------------------#

  • 对数正态分布杂波下的CFAR检测器——详情见参考3
    概率密度与杂波幅度均值和方差有关,此时检测器的实现需要估计杂波的均值和方差
  • 韦布尔分布杂波下的CFAR ——详情见参考3
    与对数正态分布下的CFAR检测器结构相同,包括:取对数、取均值、标准差归一化后进行判决

#----------------------------------------------------------------------------参考----------------------------------------------------------------------------------#

#-------------------------------------------------------------------------下一步计划----------------------------------------------------------------------------#

  • 自适应/杂波图CFAR
  • 二维CFAR
  • CFAR的实际应用:毫米波雷达、自动驾驶等

浅·总结

介绍了基本的一维CFAR,通过仿真对比了优缺点,仿真代码已经全部附上~
供大家参考😁