草庐IT

【目标检测】雷达目标CFAR检测算法

Zhi Zhao 2023-09-17 原文

目录

一、概述

1、基本概念

雷达的检测过程可用门限检测来描述。几乎所有的判断都是以接收机的输出与某个门限电平的比较为基础的,如果接收机输出的包络超过了某一设置门限,就认为出现了目标。
雷达在探测时会受到噪声、杂波和干扰的影响,因而采用固定门限进行目标检测时会产生一定的虚警,特别是当杂波背景起伏变化时虚警率会急剧上升,严重影响雷达的检测性能。因此,根据雷达杂波数据动态调整检测门限,在虚警概率保持不变的情况下实现目标检测概率最大化,这种方法称为恒虚警率(Constant False Alarm Rate,CFAR)检测技术。

2、基础知识

雷达在判决过程中,可能会出现两类错误。第一类是在没有目标时判断为有目标,这类错误称为虚警。另一类是在有目标时判断为没有目标,这类错误称为漏警。以上两类错误以一定的概率出现,分别称为虚警概率和漏警概率。

二、CFAR检测算法

目前,研究人员针对各种杂波环境下提出了许多高效的CFAR检测算法,大体可分为两类:一类是均值类CFAR(CA-CFAR)算法,该类算法应用的前提是假设背景杂波是均匀分布的;另一类是有序统计类CFAR(OS-CFAR)算法,这类算法是为了应对邻域内多目标情况而设计的。不同CFAR检测算法各有优劣,都是针对具体情况而设计,我们只需要学习CFAR的基本原理以及熟悉几种典型的CFAR检测算法即可。

1、基本原理

CFAR检测器的输入一般包括检测单元 Y Y Y 2 n 2n 2n 个参考单元。参考单元位于检测单元两侧,前后各 n n n 个。保护单元主要用在单目标情况下,防止目标能量泄漏到参考单元影响检测效果。设参考门限电平为 V T H V_{TH} VTH V T H = T × Z V_{TH}=T×Z VTH=T×Z,其中: Z Z Z 为总的杂波功率水平的估计, T T T 为门限因子,则当 Y > V T H Y>V_{TH} Y>VTH 时,认为有目标;反之,认为没有目标。
CFAR算法的处理流程如下图所示:


一般情况下,杂波同噪声相互独立,且平方律检波后都满足指数分布。参考单元的概率密度函数为:

H 0 H_{0} H0 表示为没有目标, P [ Y > T Z ∣ H 0 ] P[Y>TZ|H_{0}] P[Y>TZH0] 则表示为在没有目标的条件下判断为有目标的概率,从而得到虚警概率的表达式为:

式中, μ μ μ 是噪声功率; Z Z Z 为随机变量,它的分布取决于CFAR算法的类型以及参考单元的分布; M Z ( u ) u = T / 2 μ M_{Z}(u)_{u=T/2μ} MZ(u)u=T/2μ 为矩母函数。

2、几种典型的CFAR检测算法

不同类型CFAR算法的差异主要体现为对参考单元处理的不同,亦为 Z Z Z 值选取的不同。在背景噪声独立同分布时,通过确定常数 T T T 来达到恒定的虚警概率。不同的检测算法,其确定常数 T T T 的方法也会相应的有所区别。下面将对几种典型CFAR算法的虚警概率表达式进行推导。

(1)CA(Cell Averaging)-CFAR检测算法

背景杂波功率水平 Z Z Z 的计算方式为 2 n 2n 2n个参考单元之和:
Z = ∑ i = 1 n X i + ∑ i = n + 1 2 n X i = ∑ i = 1 2 n X i Z=\sum_{i=1}^{n}X_{i}+\sum_{i=n+1}^{2n}X_{i}=\sum_{i=1}^{2n}X_{i} Z=i=1nXi+i=n+12nXi=i=12nXi
在推导 P f a P_{fa} Pfa T T T 的关系之前,我们先给出伽马(Γ)分布的相关知识。
Γ Γ Γ 分布的概率密度函数为:

其中, α , β α,β αβ 是两个参数,当 α = 1 , β = 2 μ α=1,β=2μ α=1β=2μ时,式(3)就退化成为式(1)中的指数分布; Γ ( α ) Γ(α) Γ(α)就是数学中的伽马函数,对于正整数 α α α,有 Γ ( α ) = ( α − 1 ) ! Γ(α)=(α-1)! Γ(α)=(α1)
G ( α , β ) G(α,β) G(α,β) Γ Γ Γ 分布的概率分布函数,若 X X X 为服从 Γ Γ Γ 分布的随机变量,则有 :

X X X 的矩母函数为:

假设输入信号中的各变量满足独立同分布的条件,则对于 2 n 2n 2n个随机变量之和的矩母函数等于各随机变量的矩母函数之积,所以有:

将式(5)和式(6)以及 u = T / 2 μ u=T/2μ u=T/2μ 代入式(2),可得:

即可得到虚警概率 P f a P_{fa} Pfa 与门限因子 T T T 的关系:

(2)GO-CFAR、SO-CFAR检测算法

最大选择GO(Greatest Of)-CFAR是选取前面 n n n 个参考单元之和与后面 n n n 个参考单元之和中的大者作为背景杂波功率水平 Z Z Z ;而最小选择SO(Smallest Of)-CFAR是选取前面 n n n 个参考单元之和与后面 n n n 个参考单元之和中的小者作为背景杂波功率水平 Z Z Z

对于GO-CFAR算法,Z的概率密度函数为 f Z ( z ) f_{Z}(z) fZ(z),进而推导其虚警概率为 P f a , g o P_{fa,go} Pfa,go,如下式:

同理,可得到SO-CFAR算法的概率密度函数为 f Z ( z ) f_{Z}(z) fZ(z),虚警概率为 P f a , s o P_{fa,so} Pfa,so,如下式:

(3)OS-CFAR检测算法

顺序统计量OS(Order Statistic)CFAR的原理是先对参考单元从小到大排序,再选取第 k k k 个样本作为 Z Z Z
设 OS-CFAR 算法的虚警概率为 P f a , o s P_{fa,os} Pfa,os,根据参考文献中的公式推导可得:

k k k 为OS-CFAR中的参数,其值的选取对算法的检测性能有较大影响。

(4) 补充说明

GO、SO、OS三类CFAR检测算法的门限因子 T T T 难以用数学表达式表示,可以通过迭代运算的方式求解出来。
当求解出门限因子 T T T 后,便可以将其代入检测概率的表达式,得到在不同信噪比的条件下,检测概率的变化情况。
在参考文献[4]和[5]中给出了检测概率 P d P_{d} Pd 的计算方法。

三、不同CFAR检测算法性能对比

1、MATLAB仿真结果

为了比较不同CFAR算法的检测性能,建立CA、GO、SO、OS四类CFAR算法的检测概率与信噪比的关系曲线,信噪比设置为0~30dB,参考单元的数目 2 n 2n 2n 分别取16、24、32、48、64、128,保护单元左右各3个,虚警概率 P f a = 1 0 − 6 P_{fa}=10^{-6} Pfa=106
MATLAB仿真结果如下图所示。

2、MATLAB代码

% ------ 程序功能:四类CFAR检测算法的检测概率与SNR的关系 %
clc
clear all;
close all;

%% 参数设置
R = 24;                     % 参考单元长度
n = R/2;                    % 半滑窗长度
k = R*3/4;                  % os-cfar的参数
P_fa = 1e-6;                % 虚警概率
SNR_dB = (0:30);            % 信噪比
SNR = 10.^(SNR_dB./10);     % 信号功率与噪声功率的比值
syms T;                     % 门限因子的符号变量
%% CA-CFAR
T_CA = P_fa^(-1/R)-1;           % CA-CFAR的门限因子
Pd_CA = (1+T_CA./(1+SNR)).^(-R);    % CA-CFAR的检测概率

%% SO-CFAR、GO-CFAR
Pfa_SO = 0;
syms T
for i = 0:n-1
    Pfa_SO = Pfa_SO+2*nchoosek(n+i-1,i)*(2+T)^(-(n+i));     % SO-CFAR的虚警概率表达式
end
T1_SO = solve(Pfa_SO == P_fa, T);       % 求解出虚警概率为P_fa时对应的门限因子T
T2_SO = double(T1_SO);
T_SO = T2_SO(T2_SO == abs(T2_SO));      % SO-CFAR的门限因子

Pfa_GO = 2*(1+T)^(-n)-Pfa_SO;           % GO-CFAR的虚警概率表达式
T1_GO = solve(Pfa_GO == P_fa, T);       % 求解出虚警概率为P_fa时对应的门限因子T
T2_GO = double(T1_GO);
T_GO = T2_GO(T2_GO == abs(T2_GO));      % GO-CFAR的门限因子

Pd_SO = 0;
Pd_GO = 0;
for j = 0:n-1
    Pd_SO = Pd_SO+2*nchoosek(n+j-1,j).*(2+T_SO./(1+SNR)).^(-(n+j));     % SO-CFAR的检测概率
    Pd_GO = Pd_GO+2*nchoosek(n+j-1,j).*(2+T_GO./(1+SNR)).^(-(n+j));
end
Pd_GO = 2.*(1+T_GO./(1+SNR)).^(-n)-Pd_GO;         % GO-CFAR的检测概率

%% OS-CFAR
Pfa_OS = k*nchoosek(R,k)*gamma(R-k+1-T)*gamma(k)/gamma(R+T+1);           % OS-CFAR的虚警概率表达式
T1_OS = solve(Pfa_OS == P_fa, T);       % 求解出虚警概率为P_fa时对应的门限因子T
T2_OS = double(T1_OS);
T_OS = T2_OS(T2_OS == abs(T2_OS));      % OS-CFAR的门限因子
Pd_OS = k*nchoosek(R,k)*gamma(R-k+1-T_OS./(1+SNR))*gamma(k)./gamma(R+T_OS./(1+SNR)+1);      % OS-CFAR的检测概率

%% 画图
figure;
plot(SNR_dB,Pd_CA,'r-*');
hold on;
plot(SNR_dB,Pd_SO,'k-^');
plot(SNR_dB,Pd_GO,'b-o');
plot(SNR_dB,Pd_OS,'m-.');
grid on;
xlabel('SNR','FontName','Time New Romans','FontAngle','italic');
ylabel('P_{d}','FontName','Time New Romans','FontAngle','italic');
title(['恒虚警率 P_{fa}= ',num2str(P_fa),',参考单元 2n= ',num2str(R)]);
legend('CA','SO','GO','OS');

3、优缺点总结


在实际应用中,由于雷达的硬件运算资源有限,较普遍采用的算法依然复杂度较低的CA-CFAR检测算法。

四、参考文献

[1] 邹成晓, 张海霞, 程玉堃. 雷达恒虚警率检测算法综述[J]. 雷达与对抗, 2021, 41(02): 29-35.
[2] 刘朝军, 张欣, 王守权. 雷达目标恒虚警检测算法研究[J]. 舰船电子工程, 2008(07): 107-109.
[3] 崔宁, 罗运华, 喻忠军, 等. 一种基于改进卷积核的快速二维CFAR算法[J]. 现代雷达, 2020, 42(08): 30-35.
[4] 王蓓. 基于杂波图的恒虚警处理技术研究[D]. 西安电子科技大学, 2018.
[5] Detection loss due to interfering targets in ordered statistics CFAR.

有关【目标检测】雷达目标CFAR检测算法的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

  4. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

  5. ruby - Ruby 脚本如何检测到它正在 irb 中运行? - 2

    我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_

  6. Ruby 无法检测字符串中的换行符 - 2

    我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h

  7. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  8. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  9. ruby - 在 Ruby 中实现 Luhn 算法 - 2

    我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s

  10. Ruby 斐波那契算法 - 2

    下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen

随机推荐