问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

雷达信号处理中的恒虚警检测(CFAR)技术详解

创作时间:
作者:
@小白创作中心

雷达信号处理中的恒虚警检测(CFAR)技术详解

引用
CSDN
1.
https://blog.csdn.net/wzz110011/article/details/135519391

雷达信号处理中的恒虚警检测(CFAR)技术是现代雷达系统中不可或缺的一部分,它通过自动调整检测门限来实现目标检测的准确性。本文将详细介绍CFAR检测的概念、原理、算法类型及其应用场景,并提供具体的MATLAB编程实现。

雷达信号处理的流程

雷达信号处理的一般流程包括:ADC数据 -> 1D-FFT -> 2D-FFT -> CFAR检测 -> 测距、测速、测角。

雷达目标检测

雷达在探测时会出现很多峰值,这些峰值可能来自目标、噪声或干扰。雷达目标检测问题就是利用信号的统计特性和噪声的统计特性,在受噪声干扰的观测中,判断信号是否存在。其数学基础是统计判决理论,又称假设检验理论。

恒虚警检测概念

恒虚警检测(CFAR,Constant False Alarm Rate Detector)是一种常见的雷达目标检测手段。在雷达检测中,可以选用两个假设:目标存在(H1)或不存在(H0)。检测器的判决结果可以是D0(无信号)或D1(有信号)。理想情况下,我们希望正确不发现概率(Pan)和正确检测概率(Pd)越高越好,而虚警概率(Pfa)和漏警概率(Pla)越低越好。

虚警概率的设置

实际系统中,为了实现较好的检测效果,虚警概率通常设置为10^-12量级。

恒虚警检测算法——CA-CFAR

CA-CFAR(Cell Average CFAR)算法通过在检测单元周围设置保护单元和参考单元来实现目标检测。具体做法是计算参考单元的均值,然后乘以门限因子α,与设定的阈值T进行比较。如果检测单元的检测值Y大于T,则判断为有目标。

门限因子α的计算方法

α = N * (Pfa^(-1/N) - 1)

其中N是参考单元的数量,Pfa是虚警概率。

MATLAB编程实现

下面是三种不同方式实现的CA-CFAR算法:

  1. 不进行补零操作的CA-CFAR:
function [position, threshold, start_cell, stop_cell] = cacfar(signal, Pfa, ref_num, guard_num)
% ======>INPUT:
% signal: Data of signal(include signal and noise).[DATATYPE: row vector]
% Pfa: Probability of false alarm.[DATATYPE: scalar]
% ref_num: Number of reference cell.[DATATYPE: scalar]
% guard_num: Number of guard cell.[DATATYPE: scalar]
% ======>OUTPUT:
% position: positions of target.[DATATYPE: row vector]
% threshold: CFAR threshold of input signal.[DATATYPE: row vector]
position = [];
left_num = guard_num + ref_num;
start_cell = left_num + 1;
stop_cell = length(signal) - left_num;
N = 2*ref_num;
alpha = N * (Pfa ^ (-1/N) - 1);
threshold = zeros(1, stop_cell - start_cell + 1);
for ii = start_cell : stop_cell
    tmp_data = [signal(ii-left_num : ii-guard_num-1), ...
        signal(ii+guard_num+1 : ii+left_num)];
    mean(tmp_data);
    tmp = mean(tmp_data) * alpha;
    % threshold(ii - left_num)
    tmp;
    threshold(ii - left_num) = tmp;
    if tmp < signal(ii)
        position = [position, ii];
    end
end
return
  1. 进行补零操作的CA-CFAR:
function [position, threshold] = MYCACFAR(signal, Pfa, ref_num, guard_num)
% 该函数用于进行CA-FAR恒虚警检测,在信号首位两端进行补零,使得输出的阈值序列和信号长度一致
% ======>INPUT:
% signal: Data of signal(include signal and noise).[DATATYPE: row vector]
% Pfa: Probability of false alarm.[DATATYPE: scalar]
% ref_num: Number of reference cell.[DATATYPE: scalar]
% guard_num: Number of guard cell.[DATATYPE: scalar]
% ======>OUTPUT:
% position: positions of target.[DATATYPE: row vector]
% threshold: CFAR threshold of input signal.[DATATYPE: row vector]
position = []; %存储高于检测门限的信号区域的位置
left_num = guard_num + ref_num; %检测单元两边的单元数
sigLen = length(signal); %信号长度
tempSig = zeros(1,sigLen+2*left_num); %补零后的信号向量
tempSig((left_num + 1) :(sigLen + left_num)) = signal; %对中间部分进行信号的赋值,首位两端各有left_num个零值
N = 2*ref_num; %参考单元总数
alpha = N * (Pfa ^ (-1/N) - 1); %门限因子,横虚警概率越小,参考单元数越多,因子越大,检测阈值也越大
threshold = zeros(1, sigLen); %用于储存检测阈值
for ii = 1 : 1 :sigLen
    centNum = ii+left_num; %对应的检测单元下标
    tmp_data = [tempSig((centNum-left_num):(centNum-guard_num-1)), ...
        tempSig((centNum+guard_num+1):(centNum+left_num))]; %取检测单元的值
    tmp = mean(tmp_data) * alpha; %与门限因子相乘得到检测阈值
    threshold(ii) = tmp; %进行存储
    if tmp < signal(ii) %阈值小于信号
        position = [position, ii];  %存储被检测到的下标
    end
end
return
  1. 进行翻转补充首位的CA-CFAR:
function [position, threshold] = MYCACFAR2(signal, Pfa, ref_num, guard_num)
% 该函数用于进行CA-FAR恒虚警检测,在信号首位两端进行翻转,使得输出的阈值序列和信号长度一致
% ======>INPUT:
% signal: Data of signal(include signal and noise).[DATATYPE: row vector]
% Pfa: Probability of false alarm.[DATATYPE: scalar]
% ref_num: Number of reference cell.[DATATYPE: scalar]
% guard_num: Number of guard cell.[DATATYPE: scalar]
% ======>OUTPUT:
% position: positions of target.[DATATYPE: row vector]
% threshold: CFAR threshold of input signal.[DATATYPE: row vector]
position = []; %存储高于检测门限的信号区域的位置
left_num = guard_num + ref_num; %检测单元两边的单元数
sigLen = length(signal); %信号长度
tempSig = zeros(1,sigLen+2*left_num); %补零后的信号向量
tempSig(1:left_num) = signal(1:left_num);
tempSig(sigLen + left_num+1:end) = signal(sigLen-left_num+1:end);
tempSig((left_num + 1) :(sigLen + left_num)) = signal; %对中间部分进行信号的赋值,首位两端各有left_num个零值
N = 2*ref_num; %参考单元总数
alpha = N * (Pfa ^ (-1/N) - 1); %门限因子,横虚警概率越小,参考单元数越多,因子越大,检测阈值也越大
threshold = zeros(1, sigLen); %用于储存检测阈值
for ii = 1 : 1 :sigLen
    centNum = ii+left_num; %对应的检测单元下标
    tmp_data = [tempSig((centNum-left_num):(centNum-guard_num-1)), ...
        tempSig((centNum+guard_num+1):(centNum+left_num))]; %取检测单元的值
    tmp = mean(tmp_data) * alpha; %与门限因子相乘得到检测阈值
    threshold(ii) = tmp; %进行存储
    if tmp < signal(ii) %阈值小于信号
        position = [position, ii];  %存储被检测到的下标
    end
end
return

仿真结果


图2 单目标脉冲压缩结果及CA-CFAR阈值图

对目标峰值部分局部放大后:


图3 局部放大

其他CFAR算法

选小SO-CFAR

当参考单元内存在一个强目标时,CA-CFAR检测门限会提高,导致信号较弱的目标难以被检测到。这种情况下SO-CFAR比较适用。如下图所示,一个弱目标的右侧存在一个强目标,SO-CFAR能够将两个目标顺利检测出来。


图4 参考单元内存在强目标情况下CA-CFAR和SO-CFAR的检测结果

选大GO-CFAR

当杂波严重不均匀时,采用CA-CFAR检测杂波边缘会产生虚警。GO-CFAR将左右两侧的杂波的平均功率进行单独计算,并取其中较大的估计值作为待检测单元杂波的平均功率来计算门限。因此它的适用场景是非均匀杂波。


图5 杂波严重不均匀的情况下CA-CFAR和GO-CFAR的检测结果

有序OS-CFAR

当参考单元内存在多个强干扰目标时,多个目标会导致估计的杂波的平均功率过高,从而抬高检测门限、导致虚警。这种情况下,OS-CFAR将各参考单元的回波功率进行排序,选取中间的某个值作为待检测单元杂波平均功率来计算门限。


图5 参考单元内存在多个强目标情况下SO-CFAR和OS-CFAR的检测结果

附录

二维CFAR仿真代码地址:https://github.com/tooth2/2D-CFAR

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号