雷达编程实战之恒虚警率(CFAR)检测
在雷达系统中,目标检测是一项非常重要的任务。检测本身非常简单,它将信号与阈值进行比较,超过阈值的信号则认为是目标信号,所以目标检测的真正工作是寻找适当的阈值。由于目标误检的严重后果,因此雷达系统希望有一个检测阈值,该阈值不仅能最大限度地提高检出概率,而且能将误报概率保持在预设水平以下。
有大量的文献对使用多个接收信号样本检测高斯白噪声中的信号的情况进行了分析,并获得了一些众所周知的结果,然而,所有这些经典结果都基于理论概率,并且仅限于具有已知方差与期望的高斯白噪声。在实际应用中,噪声通常是有色的,其功率是未知的🌒。
本文介绍了雷达编程中常会遇到的目标检测技术---CFAR(Constant False-Alarm Rate),还是笔者的老习惯,先来过一下文中涉及的一些公式以及解释📌。
,这个公式我们后边称为公式一,它计算具有已知方差与期望的高斯白噪声符合虚警概率为
的阈值T。
是
的反函数,erf可在matlab中直接使用,定义是
,
是噪声的标准差,
是数学期望,而
为阈值。
,这个公式我们称之为公式二,它反映了阈值与根据给定的检测窗口(CUT)估计出来的噪声功率
以及虚警概率之间的关系。
常为检测窗口的均值,表示为
。假设传入检测系统的脉冲为单个脉冲(不涉及脉冲积分),则
,其中
为虚警概率,N为估计检测窗口的大小。
恒定阈值即指提前对传入检测系统的噪声参数进行估计,并根据一定的虚警概率计算出一个恒定的阈值,在目标检测时大于预设的阈值即判断为有目标。然而,当雷达接收机输出到检测系统的噪声发生变化时(比如功率的变化),检测系统无法做出适当的调整,将会导致实际的虚警率发生了变化。
在雷达信号检测中,当外界噪声强度变化时,雷达能自动调整其目标检测阈值,使雷达的虚警概率保持不变,具有这种特性的检测手段称为恒虚警率检测。
基础理论知识
检测的作用就是在含有噪声的情况下确定目标的存在和不存在。在我们不知道目标是否存在的情况下,目标检测的工作就变成了针对两种可能假设的概率,来对当前的信号做出判决。
一种叫原假设,也叫零假设,用H0表示,我们针对雷达系统理解为噪声,另外一种叫备择假设,用H1表示,理解为目标。
表示当功率x为噪声的功率,
表示当输入信号功率x为信号的概率。Critial value为决策边界(判断阈值),大于边界(阈值)的我们认为是目标,而小于阈值的我们认为是噪声。因为我们的原假设是噪声,所以对应的接受区域在下图左侧,拒绝区域在下图右侧。对应的假拒绝概率(虚警概率)与假接收概率(漏检概率)如下图所示。

从雷达接收机输入到检测系统的信号是目标信号+噪声,如下图中的实线,我们可以计算噪声回波信号的统计特性,将噪声的概率密度函数也画出,如下图的虚线,然后根据确定的虚警概率,我们就可以知道检测阈值的大小,这也是恒定阈值法的基本思路。

我们假设噪声是高斯白噪声,功率表现符合高斯分布。通过计算噪声的统计特性之后,就可以通过公式一计算出相关的阈值。这个是恒定阈值的目标检测。而我们的噪声一般是有色的(不是纯的随机数,有一定相关性),功率的期望也是未知的。为了解决这个问题,我们先复习一下高斯分布与标准差之间的关系。

我们可以将这种有色,功率未知的噪声信号理解成很多个符合正态分布,但是具有不同统计特性的噪声拼接而成。我们根据上图可以看出,符合高斯分布的噪声概率分布与噪声的统计特性诸如标准差
和数学期望
都有关系,也就是说,我们可以根据噪声的统计特性来表示一个符合确定虚警率的阈值,
,这就是我们公式公式2的由来,我们通过把噪声切割成具有一定尺寸的窗口来获得当前检测单元的阈值,即每一个检测单元都对应一个根据周围单元估算出的噪声统计特性再乘以一个由虚警概率确定的
算出的判决阈值。所以对于CFAR,我们的阈值不是个定值,而是如下图一个蓝色曲线。

雷达一维恒虚警多算法Matlab实现
背景噪声生成函数
下面这个function主要实现了根据输入的统计特性输出符合高斯分布的均匀背景噪声矩阵,输入的参数包括标准差,噪声点数,平均dB,以及是否将噪声画出来的开关量。输出噪声一维矩阵。
在这里先说明一个dB的概念,dB表示的是系统的输出功率相对输入功率的增益。这里dB的引入是为了把乘除关系变换为加减,便于工程中的运算。
,后边的Matlab程序传递的参数,都将功率值转换为了dB.
%均匀背景噪声
function [ xc ] = env_uniform(variance, shape, power_db, show_out)c=10^(power_db/10); % power_db这里是幅度对应功率tes=random('Normal',0,variance,1,shape);xc=c + tes; if show_out==1plot(10.*log10(abs(xc)));end
end下面这个function也是输出噪声矩阵,只不过输出的噪声类型是杂波边缘背景噪声,即由多个不同均值的的噪声拼接而成,因此输入的平均dB也是一个具有多个元素的一维向量。
%杂波边缘背景噪声
function [ xc ] = env_edge(variance, shape, power_db, show_out)c=10.^(power_db./10); % 这里是幅度——功率xc=random('Normal',0,variance,1,shape(1,end)); xc(1,1:end)=xc(1,1:end)+c(1,1);index=1;for i=1:length(power_db)xc(1,index:shape(1,i))=xc(1,index:shape(1,i)).*c(1,i)./c(1,1);index=shape(1,i)+1;endif show_out==1plot(20.*log10(abs(xc)));end
end恒虚警率算法
到了最重要的CFAR算法实现了,本篇文章讨论最常见的均值类算法,核心思想是通过对参考窗内采样数据取平均来估计背景噪声功率。被检测单元由保护单元与训练单元所包围,保护单元不参与计算噪声平均功率。算法利用保护单元计算平均功率
,然后再乘以用虚警概率确定的系数
,最终得出针对当前检测单元的判决阈值。

CA-CFAR、GO-CFAR、SO-CFAR算法这三个是最经典的均值类CFAR算法,后续有其变形log-CFAR算法但是原理是相同的👀。

下面是这三种算法的Matlab实现,输入信号,训练单元数,保护单元数,以及恒定的虚警概率,输出与信号尺寸一样的阈值曲线。
function [ index, XT ] = cfar_ac( xc, N, pro_N, PAF)alpha=N.*(PAF.^(-1./N)-1);index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2;XT=zeros(1,length(index));for i=indexcell_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
endfunction [ index, XT ] = cfar_go( xc, N, pro_N, PAF)alpha=N.*(PAF.^(-1./N)-1);index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2;XT=zeros(1,length(index));for i=indexcell_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)]);XT(1,i-N/2-pro_N/2)=Z.*alpha;end
endfunction [ index, XT ] = cfar_so( xc, N, pro_N, PAF)alpha=N.*(PAF.^(-1./N)-1);index=1+N/2+pro_N/2:length(xc)-N/2-pro_N/2;XT=zeros(1,length(index));for i=indexcell_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
end三种算法在目标检测方面各有优缺点,总结如下表🔢:
算法名称 | 优点 | 缺点 |
CA-CFAR(单元平均恒虚警) | 损失率最少的一种算法 | 多目标遮掩,杂波边缘性能也欠佳 |
GO-CFAR(最大选择恒虚警) | 杂波边缘区域虚警概率降低 | 多目标遮掩 |
SO-CFAR(最小选择恒虚警) | 多目标效果有改进; | 杂波边缘区域虚警概率提升 |
算法测试程序
最后要讲述的Matlab程序,是一段针对这三个算法其中一个算法的测试程序。程序模拟单目标,使用均匀噪声背景,噪声20dB,目标的信噪比是15dB。程序使用之前介绍的Function,最终画出信号曲线与阈值曲线。
clc
clear all
close allshape=[200];
variance=200;
noise_db=20;
noise_p=10.^(noise_db./10);
show_out=0;
[ xc ] = env_uniform(variance, shape, noise_db,show_out);SNR1=15; signal1_p=10.^(SNR1./10).*noise_p;
xc(1,90)=signal1_p;
N=36;
pro_N=2;
PAF=10^(-4);
[ index, XT ] = cfar_so( abs(xc), N, pro_N, PAF);
%[ index, XT ] = cfar_go( abs(xc), N, pro_N, PAF);
%[ index, XT ] = cfar_ac( abs(xc), N, pro_N, PAF);figure(3);
plot(10.*log10(abs(xc))),hold on;
plot(index,10.*log10(abs(XT))),hold on;
legend('噪声pdf','信号pdf')Matlab程序执行结果如下:

我们还可以针对杂波边缘背景噪声来试验不同算法在杂波的边缘的性能,我们也可以往噪声中多叠加一些不同信噪比的目标来观察不同算法在多目标情况下的效果。点击这里跳转到一个github上一个利用MATLAB GUI设计平台,设计多算法雷达一维恒虚警检测CFAR可视化界面的项目代码。
加速核嵌入式软件配置
下面的某平台针对Cfar加速核的配置代码段:
void BB_CFAR_Init(void){cfarCfg0_st.wrapDirA = CFAR_CFG0_WRAPDIR_INC;cfarCfg0_st.wrapDirB = CFAR_CFG0_WRAPDIR_INC;cfarCfg0_st.sumMode = CFAR_CFG0_SUMMODE_ABS;cfarCfg0_st.interCnt = USE_RANGE;cfarCfg0_st.intraCnt = NUM_VEL;cfarCfg0_st.thresDiv = CFAR_CFG0_THRESDIV4; // = searchSize numcfarCfg0_st.divFac = CFAR_CFG0_DIVFAC1;cfarCfg0_st.mulFac = r2_str.cfarThV;cfarCfg0_st.searchSize = r2_str.cfarThVS;cfarCfg0_st.guardSize = r2_str.cfarThVG;cfarCfg0_st.totalSize = cfarCfg0_st.searchSize+cfarCfg0_st.guardSize;cfarCfg0_st.pdEn = CFAR_CFG0_PEAKDET_DIS; cfarCfg0_st.cfarMode = CFAR_CFG0_CFARMODE_GO;BB_CFAR_CFG0(&cfarCfg0_st); //STRUCT_CFAR_CFG0BB_CFAR_CFG1(CFAR_MAX_NUM,NUM_BYTE32); //interIncBB_CFAR_CFG2(bb_prep.cfg2.jumpInc,FFT2D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32);//intraInc,intraAddrBB_CFAR_CFG3((FFT2D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32+(NUM_VEL-cfarCfg0_st.totalSize)*bb_prep.cfg2.jumpInc),FFT2D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32);//wrapAddrA,wrapAddrBBB_CFAR_CFG4(CFAR_CACHE_ADDR);//dstBaseAddr
}其中searchSize 对应的是训练单元的大小,guardSize是保护单元,
等于上面Matlab程序中的alpha,即阈值系数。
需要与searchSize保持一致。加速核支持不同算法的选择,这里cfarMode选择的是GO-CFAR。
此平台默认的将采样的窗口滑动的模式配置称为环状,即第一个检测点的左窗由信号末尾部分充当,最后一个检测点的右窗由信号的起始部分充当。

最后,我们可能会针对项目的技术需求调整CFAR的参数,这就需要我们知道这些参数和一些概念相互如何影响,下面简单的总结一些参数调整的影响。
检测单元数N:在相同信噪比下,检测单元数越多的CFAR对应的检测概率越高,但同时计算量加大。
保护单元数:保护单元过大或过小都会使检测概率降低,应不同实验选取适中的保护单元数。
虚警概率
:在相同检测单元数目下,虚警概率的越高CFAR对应的检测概率越高,但虚警数也增多。
信噪比SNR:当信噪比不断增加,检测概率也不断增加。
相关文章:
雷达编程实战之恒虚警率(CFAR)检测
在雷达系统中,目标检测是一项非常重要的任务。检测本身非常简单,它将信号与阈值进行比较,超过阈值的信号则认为是目标信号,所以目标检测的真正工作是寻找适当的阈值。由于目标误检的严重后果,因此雷达系统希望有一个检…...
Github隐藏功能:显示自己的README,Github 个人首页的 README,这样玩儿
内容概览 前言创建仓库修改 README 的内容总结前言 大家最近有没有发现这个现象,有些名人的 Github 首页变得更丰富了?尤其是那个夺目的 README 板块!!! 请看,这是 iOS 喵神 的 Github 首页: …...
@JsonSerialize—优雅地封装返回值
1.场景项目开发中给前端提供查询接口时,经常遇到需要将从数据库中取出来的字段值做一层重新封装。比如数据库中存的状态值是数字,返回给前端的时候,前端并不知道这个数值代表什么意思。此时,有两种方式:(1&…...
【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验。 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器。 2.服务…...
fuzz测试之libfuzzer使用小结
fuzz测试之libfuzzer使用小结背景基本原理使用方法主调DEMO参考资料背景 项目中,为测试算法的鲁棒性,经常会用到fuzz测试进行压力测试。fuzz测试是一种模糊测试方法,本质是通过灌入各种变异的随机数据,去遍历不同函数分支…...
电子标签拣货系统——外接供电版
Power_DC24v 型号:Power_DC24v24V电源适配器级联线:长30cm直径:15mmCK_Wire_V1 型号:CK_Wire_V1连接电源适配器级联线:长30cm公线:长宽厚 14*11*9mm母线:长宽厚 13*5.5*3mmCK_Wire_V2 型号&…...
为什么启动一个线程不用run()方法,而是用start()方法
在使用java多线程时,有三种方式创建线程 复习传送门 当使用继承Thread来实现多线程时, 我们会把线程执行的代码写在run() 方法中, 使用Thread的start()方法来启动一个线程。 代码如下: public class ThreadDemo extends Thread{O…...
Java File相关操作
文章目录File文件操作IO流处理流缓冲流转换流对象流File文件操作 利用File类来操作。 文件操作中常用到相对目录和绝对路径 package org.File; import java.io.File; public class demo01 { public static void main(String[] args) { try{ File file new File("…...
LabVIEW利用矢量量化直方图开发人脸识别
LabVIEW利用矢量量化直方图开发人脸识别通常,人脸识别系统会检查场景的静止图像或视频图像,然后使用存储的人脸数据库识别或验证场景中的一个或多个人。我程序专注于静止图像人脸识别,使用来自众所周知的人脸数据库的人脸图像,用于…...
RK3568工业开发板工控板说明
说明HW356X-GKA是采用中高端的通用型 SOC,一款基于Rockchip公司RK3568处理器的工控主板。主板标配处理器为Cortex-A55四核,最高主频2GHz的RK3568处理器,内置4GB DDR4内存(最大8GB),32GB eMMC存储。集成4核 arm架构 A55 处理器和Ma…...
JavaScript Web API 来构建你不了解的网站
随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。 但据了解,在100 多个 API中,只有5%被开发人员积极使用。 随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 A…...
KeePass敏感信息明文传输漏洞复现 (CVE-2023-24055)
一、漏洞描述 漏洞简述 KeePass 是一款免费的开源密码管理器,可帮助您以安全的方式管理您的密码。您可以将所有密码存储在一个数据库中,该数据库由一把万能钥匙锁定。因此,您只需记住一个主密钥即可解锁整个数据库。数据库文件使用目前已知…...
Android 11 中的权限更新
官网:https://developer.android.com/about/versions/11/privacy/permissions#audit-by-feature Android 11 使用户能够为位置、麦克风和摄像头指定更精细的权限。此外,系统会重置针对 Android 11 或更高版本的未使用应用程序的权限,如果应用…...
october-cms
环境准备 靶机链接:百度网盘 请输入提取码 提取码:3e4s 虚拟机网络链接模式:桥接模式 攻击机系统:kali linux 2021.1 信息收集 1.探测目标靶机ip。 2.探测靶机开放端口和服务情况。 漏洞探测 1.访问网页 2.用dirsearch扫描…...
抖音怎样报白?报白需要审核哪些资料呢
抖音怎样报白?报白需要审核哪些资料呢 抖音报白需要什么资料,翡翠原石产品如何开通报白#报白#小店报白#小店运营#抖音#抖音小店运营 文/专栏作家百收 随着抖音在国内流行起来,抖音上每天会有大量的视频更新,越来越多的年轻人也加…...
Spring中的AOP
Spring中的AOP 文章目录Spring中的AOPAOP概述相关术语总结作用AOP概述 AOP(Aspect Programming) 是一种设计思想,是面向切面编程思想 跟OOP(面向对象编程)有什么关系呢? AOP面向切面编程然后是OOP(面向对象编程)的补充和完善。…...
文件系统与动静态库的基本了解
目录文件系统与动静态库的基本了解文件系统了解Access Modify Changeinode硬链接软链接静态库与动态库概念静态库的制作使用静态库动态库的制作使用动态库总结如何制作文件系统与动静态库的基本了解 文件系统 了解Access Modify Change 当文件没有被打开时,他们存…...
netty——IO、NIO、AIO进化之路
IO、NIO、AIO进化之路BIO——同步阻塞IO伪异步阻塞IONIO——同步非阻塞IOAIO——异步IO总结本文会说明各种IO的特点、分别解决了什么样的问题做一个分析阐述,并结合Java代码例子来辅助理解,像这些的历史演进和详细的底层原理网上很多,所以我们…...
AI稳定生成图工业链路打造
前沿这篇文章会以比较轻松的方式,跟大家交流下如何控制文本生成图片的质量。要知道如何控制文本生成质量,那么我们首先需要知道我们有哪些可以控制的参数和模块。要知道我们有哪些控制的参数和模块,我们就得知道我们文本生成图片的这架机器或…...
20230220华南金牌主板u盘启动
20230220华南金牌主板u盘启动 2023/2/20 10:29 百度搜索:华南金牌主板u盘启动 https://www.zhihu.com/question/498121895?utm_id0 华南金牌主板b85u盘启动怎么设置? 华南金牌主板b85u盘启动怎么设置 海的那边 上小学后才发现还是幼儿园好混…… 华南一般是F7和F1…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
