雷达编程实战之恒虚警率(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…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...