写在前面
深知新手在接触毫米波雷达板硬件时需要花费的沉没成本,因此在行将告别毫米波雷达之际,总结这两年以来在毫米波雷达上的一些经验和教训。
本文档用于为实现基于AWR1243BOOST
等单板毫米波雷达开发提供参考指南与解决方案,主要包括硬件配置
、基础参数
、信号模型
、应用DEMO开发
以及可深入研究方向思考
等;为更好地匹配后续级联雷达应用的学习路线,在本手册中会尽可能同化单板雷达和级联雷达中的相关表述。
本指南作者信息:Xuliang
,联系方式:[email protected]
。未经本人允许,请勿用于商业和学术用途。
希望后者在使用本指南时可以考虑引用作者在毫米波雷达旅途中的相关工作,如本文参考文献[1].
本章节为可深入研究方向思考章节之恒虚警率算法,主要讨论均值类、有序统计类、自动筛选类、逻辑类等恒虚警率检测算法,并给出了多目标和单目标场景下的不同算法关于SNR和虚警率的性能实例程序。
欢迎各位读者通过邮件形式与笔者交流讨论,本章节完整程序请私信笔者,希望使用本代码时能够提供一份引用和Star,以表示对笔者工作的尊重,谢谢!在后续将定时维护更新。
https://github.com/DingdongD/TDMA-MIMO
本文原文指向:
厚积薄发:毫米波雷达开发手册之大话恒虚警率检测
往期内容:
一统江湖:毫米波雷达开发手册之大话线谱估计
炉火纯青:毫米波雷达开发手册之大话空间谱估计
登堂入室:毫米波雷达开发手册之信号模型
初出茅庐:毫米波雷达开发手册之基础参数
扬帆起航:毫米波雷达开发手册之硬件配置
眼观四海:自动驾驶&4D成像毫米波雷达 如今几何?
简介
恒虚警率检测算法是现代雷达信号处理和目标检测系统中较为关键的部分。恒虚警率检测算法是在系统中给检测策略提供检测阈值并且保持虚警概率稳定、不随外界杂波和干扰而变化的信号处理算法。(本部分内容摘自笔者的本科毕业设计)
目前,为满足不同特定环境下的检测需求,恒虚警率检测算法研究已经出现了多个研究方向,但恒虚警率检测算法的分类至今仍没有一个规范的国际国内标准。针对大多数恒虚警率检测算法面临在海杂波环境下多目标背景检测性能显著下降的问题,本节主要从经典恒虚警率检测算法、海杂波环境下恒虚警率检测算法、多目标背景恒虚警率检测算法这三者展开论述。
经典恒虚警率检测算法主要有均值类恒虚警率(ML CFAR)检测算法、有序统计类恒虚警率(OS CFAR)检测算法。均值类恒虚警率检测算法中较为经典的是单元平均恒虚警率(CA CFAR)检测算法,该算法基于均匀背景且各参考单元间独立同分布的假设,将检测单元两侧的参考单元样本平均值作为背景功率估计值[2],能够在均匀背景下实现较好的目标检测性能,但在多目标背景中存在目标掩蔽效应以及在杂波边缘背景中存在虚警和漏警。为改进CA CFAR杂波边缘背景下的检测缺陷,Hansen提出的单元平均选大(GO CFAR)检测算法[3],通过将较大参考窗中参考单元采样值的平均作为背景功率估计值,减少了杂波边缘强杂波区域发生漏警。Trunk提出的单元平均选小恒虚警率(SO CFAR)检测算法[4],通过将较小参考窗中参考单元采样值的平均作为背景功率估计值,减少了杂波边缘弱杂波区域发生虚警,同时能够克服一侧参考窗中存在多目标干扰时带来的目标遮蔽效应,但当其两侧参考窗中存在多目标干扰时其检测性能略显逊色。为更好抑制两侧参考窗中存在多目标时的目标遮蔽效应,Rohling提出了有序统计量恒虚警率(OS CFAR)检测算法[5],将排序后的参考窗中第k个单元功率值作为背景功率估计值,相比SO CFAR,该算法在两侧参考窗中存在多目标时具有更好的包容性,但当参考窗中干扰目标数目超过算法所能容纳最大干扰阈值N-k时其检测性能会开始衰减。此外,有序统计类检测算法的检测性能十分依赖选择序号k的值,k值大小可能会影响目标的命中率。
现有的关于海杂波环境下恒虚警率检测算法研究较少,本节主要从海杂波的非均匀性入手来论述在非均匀环境下恒虚警率检测算法的研究与发展现状。由于CA CFAR检测算法在非瑞利环境下无法克服海杂波的拖尾效应,因而Goldstein等提出了适合于对数正态分布杂波模型的对数-T恒虚警率(Log-t CFAR)检测算法[6],通过引入辅助单元实现了检测门限的调整,该算法在对数正态分布和威布尔分布杂波环境下能够控制虚警概率来维持良好的目标检测性能。后来,Guida等人又提出了适合于威布尔分布杂波模型的最优线性无偏估计恒虚警率(BLUE CFAR)检测算法[7],通过对数变换将Weibull概率密度函数退化为Gumbel概率密度函数,并利用位置尺度参数的最佳线性无偏估计调整检测门限,该算法具有一定的抵抗局部不均匀性能力。近年,刘怡等人依据信号的中心极限定理和对数压缩准则提出了综合恒虚警率(COMP CFAR)检测算法[8],其中主要包含对信号的对数压缩处理和信号幅度平均值累积这两个步骤,该算法在非均匀环境中具有较好的鲁棒性,并且在多目标与杂波边缘背景中均具有很好的检测性能。
多目标背景恒虚警率检测算法,顾名思义,是研究当参考窗中存在一侧或两侧多目标干扰时如何有效提升检测算法虚警调节性能和目标分辨性能的问题。在有序统计类算法的基础上,Rickard和Dillard提出了删除平均(CMLD CFAR)[9]恒虚警率检测算法,在对参考窗中样本的功率值进行排序后来删除前r个较大的样本值,再对剩余的样本采样加权作为检测单元的杂波背景功率估计值,与OS CFAR相比,该算法在多目标背景中实现相同的检测性能时损失的信噪比更小。但OS CFAR与CMLD CFAR分别受参数k、r的限制,这极大程度上限制了雷达回波的实时运算,因此Gálvez等人提出了神经网络单元平均有序统计类恒虚警率(NNCAOS CFAR)检测算法[10][11],通过神经网络对雷达回波进行先验分析,设置两个神经网络块NN1和NN2来搜索并判断背景属于多目标背景、杂波边缘背景、均匀背景的哪一种,根据背景类型从经典CFAR检测算法中选择最优策略完成门限估计,该算法既能提高回波的实时运算能力,又能保持检测性能不随杂波的均匀性变化而严重衰减。为降低经典CFAR检测算法的计算复杂度,ChiaHung等人提出了深度学习恒虚警率(DL CFAR)检测算法[12],通过训练卷积神经网络来学习距离多普勒图中目标的结构,在剔除目标结构后得到具有纯噪声的距离多普勒图并估计门限水平,该算法在多目标背景下不同信杂比的情况能够保持鲁棒的检测性能与虚警调节能力,缓解了目标掩蔽效应。
均值类
均值类算法包括单元平均、单元平均选大、单元平均选小等经典算法。
%% CA-CFAR标称因子计算
function alpha = ca_threhold(Pfa,N)
% Pfa:虚警概率
% N:参考单元数
alpha = N .* (Pfa .^ (-1 / N) - 1 );
end
%% CA-CFAR恒虚警率检测算法的函数实现
function result = func_cfar_ca(x,alpha,NSlide,Pro_cell)
%x:原始杂波数据
%alpha:标称因子
%Nslide:滑动窗大小
%Pro_cell:保护单元大小
persistent left;
persistent right;
persistent Half_Slide;
persistent Half_Pro_cell;
persistent len;
if isempty(left)
Half_Slide = NSlide / 2; %半滑动窗
Half_Pro_cell = Pro_cell / 2; %一侧保护单元长度
len = length(x); %杂波单元
left = 1 + Half_Pro_cell + Half_Slide; %设置左边界
right = length(x) - Half_Pro_cell - Half_Slide; %设置右边界
end
T = zeros(1,len); %检测阈值
% target = java.util.LinkedList; %利用Java链表来实现目标的存储
target = [];
for i = 1:left - 1 %左边界
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Slide * 2 + Half_Pro_cell);
T(1,i) = mean(cell_right) * alpha;
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = left:right %中间区域
cell_left = x(1,i - Half_Slide - Half_Pro_cell:i - Half_Pro_cell - 1);
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Pro_cell + Half_Slide);
T(1,i) = (mean(cell_left) + mean(cell_right)) / 2 * alpha; %求解门限
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = right + 1:len %右边界
cell_left = x(1,i - Half_Pro_cell - Half_Slide * 2 : i-Half_Pro_cell-1);
T(1,i) = mean(cell_left) * alpha;
if T(1,i) < x(i)
target = [target, i];
end
end
result = {
'CFAR_CA',T,target};
end
%% SO-CFAR的虚警概率计算
function Pfa = SO_Pfa(alpha,N)
Pfa = 0;
n = ceil(N / 2);
for i = 0:n-1
Pfa = Pfa + 2 * gamma(n+i) ./ gamma(i+1) ./ gamma(n) .* (2 + alpha ./ n) .^ (-(n+i));
end
end
%% SO-CFAR恒虚警率检测算法的函数实现
function result = func_cfar_so(x,alpha,NSlide,Pro_cell)
%x:原始杂波数据
%alpha:标称因子
%Nslide:滑动窗大小
%Pro_cell:保护单元大小
persistent left;
persistent right;
persistent Half_Slide;
persistent Half_Pro_cell;
persistent len;
if isempty(left)
left = 1 + Half_Pro_cell + Half_Slide; %设置左边界
right = length(x) - Half_Pro_cell - Half_Slide; %设置右边界
Half_Slide = NSlide / 2; %半滑动窗
Half_Pro_cell = Pro_cell / 2; %一侧保护单元长度
len = length(x); %杂波单元
end
T = zeros(1,len); %检测阈值
% target = java.util.LinkedList; %利用Java链表来实现目标的存储
target = [];
for i = 1:left - 1 %左边界
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Slide * 2 + Half_Pro_cell);
T(1,i) = mean(cell_right) * alpha;
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = left:right %中间区域
cell_left = x(1,i - Half_Slide - Half_Pro_cell:i - Half_Pro_cell - 1);
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Pro_cell + Half_Slide);
T(1,i) = min(mean(cell_left),mean(cell_right)) * alpha; %求解门限
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = right + 1:len %右边界
cell_left = x(1,i - Half_Pro_cell - Half_Slide * 2 : i-Half_Pro_cell-1);
T(1,i) = mean(cell_left) * alpha;
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
result = {
'CFAR_SO',T,target}; %采用字典类型
end
%% GO-CFAR标称因子计算
function [alpha] = go_threhold(Pfa,N)
% Pfa:虚警概率
% N:参考单元数
scope = [0,100]; %区间
precision = 0.01; %精度
func = @GO_Pfa;
parameter = [N,Pfa];
[alpha] = binary_solution(scope,precision,func,parameter);
end
%% GO-CFAR恒虚警率检测算法的函数实现
function result = func_cfar_go(x,alpha,NSlide,Pro_cell)
%x:原始杂波数据
%alpha:标称因子
%Nslide:滑动窗大小
%Pro_cell:保护单元大小
persistent left;
persistent right;
persistent Half_Slide;
persistent Half_Pro_cell;
persistent len;
if isempty(left)
left = 1 + Half_Pro_cell + Half_Slide; %设置左边界
right = length(x) - Half_Pro_cell - Half_Slide; %设置右边界
Half_Slide = NSlide / 2; %半滑动窗
Half_Pro_cell = Pro_cell / 2; %一侧保护单元长度
len = length(x); %杂波单元
end
T = zeros(1,len); %检测阈值
target = [];
for i = 1:left - 1 %左边界
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Slide * 2 + Half_Pro_cell);
T(1,i) = mean(cell_right) * alpha;
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = left:right %中间区域
cell_left = x(1,i - Half_Slide - Half_Pro_cell:i - Half_Pro_cell - 1);
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Pro_cell + Half_Slide);
T(1,i) = max(mean(cell_left),mean(cell_right)) * alpha; %求解门限
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = right + 1:len %右边界
cell_left = x(1,i - Half_Pro_cell - Half_Slide * 2 : i-Half_Pro_cell-1);
T(1,i) = mean(cell_left) * alpha;
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
result = {
'CFAR_GO',T,target}; %采用字典类型
end
有序统计类
有序统计类算法包括有序统计、有序统计选大、有序统计选小等经典算法。
%% OS-CFAR的虚警概率计算
function Pfa = OS_Pfa(alpha,N,rate)
k = ceil(N .* rate);
Pfa = gamma(N+1) .* gamma(N-k+alpha+1) ./ gamma(N-k+1) ./ gamma(N+alpha+1);
end
%% OS-CFAR恒虚警率检测算法的函数实现
function result = func_cfar_os(x,alpha,NSlide,Pro_cell,rate)
%x:原始杂波数据
%alpha:标称因子
%Nslide:滑动窗大小
%Pro_cell:保护单元大小
%rate:有序比例,OS中选择序号如k=3/4N时rate=0.75
persistent left;
persistent right;
persistent Half_Slide;
persistent Half_Pro_cell;
persistent len;
persistent K;
if isempty(left)
left = 1 + Half_Pro_cell + Half_Slide; %设置左边界
right = length(x) - Half_Pro_cell - Half_Slide; %设置右边界
Half_Slide = NSlide / 2; %半滑动窗
Half_Pro_cell = Pro_cell / 2; %一侧保护单元长度
len = length(x); %杂波单元
K = round(rate * NSlide); %有序序号
end
T = zeros(1,len); %检测阈值
target = [];
for i = 1:left - 1 %左边界
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Slide * 2 + Half_Pro_cell);
cell_right = sort(cell_right);
T(1,i) = cell_right(K) * alpha;
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = left:right %中间区域
cell_left = x(1,i - Half_Slide - Half_Pro_cell:i - Half_Pro_cell - 1);
cell_right = x(1,i + Half_Pro_cell + 1 : i + Half_Pro_cell + Half_Slide);
cell = sort([cell_left,cell_right]); %合并左右侧滑动窗
T(1,i) = cell(K) * alpha; %求解门限
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
for i = right + 1:len %右边界
cell_left = x(1,i - Half_Pro_cell - Half_Slide * 2 : i-Half_Pro_cell-1);
cell_left = sort(cell_left);
T(1,i) = cell_left(K) * alpha;
if T(1,i) < x(i)
target = [target, i]; %加入目标
end
end
result = {
'CFAR_OS',T,target}; %采用字典类型
end
%% OSGO-CFAR的虚警概率计算
function Pfa = OSGO_Pfa(alpha,N,rate)
k = ceil(N * rate / 2);
pfa = 0;
for j = 0:N/2-k
for i = 0:N/2-k
pfa = pfa + nchoosek(N/2-k,j)*nchoosek(N/2-k,i)*(