雷达信号处理中的恒虚警检测(CFAR)技术详解
雷达信号处理中的恒虚警检测(CFAR)技术详解
雷达信号处理的一般流程为:ADC数据——1D-FFT——2D-FFT——CFAR检测——测距、测速、测角。
雷达目标检测是判断信号中是否存在目标的过程。其数学基础是统计判决理论,通过假设检验来判断接收机输入信号是否存在。
恒虚警检测概念
恒虚警检测(CFAR,Constant False Alarm Rate Detector)是雷达目标检测的一种常见手段。在雷达信号处理中主要应用的CFAR检测算法有四种:CA-CFAR、SO-CFAR、GO-CFAR、WCA-CFAR。
虚警概率的设置
虚警概率(Pfa)是衡量检测系统性能的重要指标。实际系统中为了实现较好的检测效果,虚警概率通常设置为10^-12量级。
恒虚警检测算法——CA-CFAR
CA-CFAR算法通过设定检测单元(CUT)、保护单元和参考单元来实现目标检测。具体做法是先在测试单元的周围放置保护单元,以消除信号在测试单元周围的多余能量,然后再保护单元的周围选择参考单元。
阈值计算方法
CA-CFAR算法通过计算参考单元的均值来设定检测门限。门限因子α的计算公式为:
α = N * (Pfa^(-1/N) - 1)
其中,N为参考单元总数。
MATLAB编程实现
下面是三种不同实现方式的CA-CFAR算法MATLAB代码:
- 不进行补零操作的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
- 进行补零操作的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
- 进行翻转补充首位的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
仿真结果
下面是单目标脉冲压缩结果及CA-CFAR阈值图:
对目标峰值部分局部放大后:
其他CFAR算法
- 选小SO-CFAR
当参考单元内存在一个强目标时,CA-CFAR检测门限会提高,导致信号较弱的目标难以被检测到。这种情况下SO-CFAR比较适用。如下图,一个弱目标的右侧存在一个强目标,SO-CFAR能够将两个顺利的检测出来。
- 选大GO-CFAR
当杂波严重不均匀时,采用CA-CFAR检测杂波边缘会产生虚警。GO-CFAR将左右两侧的杂波的平均功率进行单独计算,并且取其中较大的估计值作为待检测单元杂波的平均功率来计算门限。因此它的适用场景是:非均匀杂波。
- 有序OS-CFAR
当参考单元内存在多个强干扰目标时,多个目标会导致估计的杂波的平均功率过高,从而抬高检测门限、导致虚警。这种情况下,OS-CFAR将各参考单元的回波功率进行排序,选取中间的某个值作为待检测单元杂波平均功率来计算门限。
附录
二维CFAR仿真代码地址:https://github.com/tooth2/2D-CFAR