一、内容复习
CFAR检测算法属于信号检测中的自动检测算法,在雷达信号处理中主要应用的有三种,即CA-CFAR、SO-CFAR、GO-CFAR,这三种也是初学者最常采用的算法,要求每一个雷达工程师必须掌握其基本原理,如表所示,其中OS-CFAR一般不常用。
CFAR 类型 |
参考电平 Z |
适用场合 |
缺点 |
CA-CFAR |
(X+Y)/2 |
均匀杂波背景 |
在杂波边缘会引起虚警率的上升;多目标环境中的检测性能较差。 |
SO-CFAR |
min{X, Y} |
在干扰目标位于前沿或后沿滑窗之一的多目标环境中能分辨出主目标。 |
杂波边缘和均匀杂波环境中的检测性能较差。 |
GO-CFAR |
max{X, Y} |
在杂波边缘和均匀杂波环境能保持较好的检测性能。 |
多目标环境中的检测性能较差。 |
OS-CFAR |
(ascend_sort{X, Y}) |
多目标检测性能较好。 |
依赖于参考窗内的所有样本数据,且 k 的取值直接决定了检测结果的优劣。 |
一维CFAR检测流程图如下所示

二、距离多普勒矩阵(Range-Doppler Matrix,RDM)
在检测过程中,除了要知道到目标的距离信息以外,还要知道目标的速度信息,因此1D-CFAR不再满足我们的要求,而是需要采用2D-CAFR。而2D-CAFR处理的对象就是距离多普勒矩阵(Range-Doppler Matrix),RDM的形成过程如下所示

2D-CFAR是对两个维度同时检测,

还有一种方法是两次CFAR,即先对某一个维度做一次,然后又对另一个维度做一次,总共两次CFAR。比如先对速度维做一次CA-CFAR,然后对距离维做一次OS-CFAR,如图7所示。这样做的目的可以减少计算量,节约计算时间。因为当检测出具有速度的目标后,只针对动目标检测要比检测全部元素点要快速。

三、二维CFAR(2D-CFAR)算法原理与仿真
前面阐述了一些概念性内容,下面是本文的核心部分。
如图所示,是2D-CFAR的原理模型。我们可以设计一个循环程序,通过在参考单元和保护单元的边缘提供边距,使 CUT 在距离多普勒图上滑动。对于每次迭代,求所有参考单元中所有信号电平的和并取平均。接下来,将 CUT (被检测单元)下的信号与此阈值进行比较。如果CUT > 阈值,则认为是目标信号,并为其分配值 1,否则认为是噪声信号,并将其置为0。(类似神经网络里的conv2D有木有?)
上述过程将生成一个阈值块,如图中绿色和红色组成的区域。因为 CUT 不能位于RDM谱矩阵的边缘,故而该阈值块小于距离多普勒图, 因此存在一部分点不会被检测到,但需要对这部分未检测到的点进行处理,关于这个问题后面会讨论。

四、仿真
- 生成FMCW信号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
B = c /(2*range_resolution); Tchirp= (5.5*2*max_range)/c; slope = B/Tchirp; disp(slope); fc= 1.5e3;
Nd=128;
Nr=1024;
t=linspace(0,Nd*Tchirp,Nr*Nd);
|
- 信号生成与移动目标仿真
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| for i=1:length(t) r_t(i) = target_range+ target_velocity*t(i); td(i) = 2*r_t(i)/c; Tx(i) = cos(2*pi*(fc*t(i) + (slope*t(i)^2)/2));
Rx(i) = cos(2*pi*(fc*(t(i)-td(i)) + (slope*(t(i)-td(i))^2)/2)); Mix(i) = Tx(i).*Rx(i); end
|
- 距离-多普勒响应 (RDM)
该部分实现了 2D FFT,用于生成距离-多普勒图 (RDM)。 后续可以基于该 RDM 进行 CFAR 检测。
二维 FFT 的输出是一个包含距离和多普勒频移响应的图像,其坐标轴单位最初是FFT bin(频率单元格)。 因此,为了直观反映目标的实际距离和速度, 需要根据最大取值将坐标轴从 bin 索引转换为实际的距离 (m) 和多普勒速度 (m/s)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| Mix=reshape(Mix,[Nr,Nd]);
sig_fft2 = fft2(Mix,Nr,Nd);
sig_fft2 = sig_fft2(1:Nr/2,1:Nd);
sig_fft2 = fftshift(sig_fft2); RDM = abs(sig_fft2); RDM = 10*log10(RDM) ;
doppler_axis = linspace(-100,100,Nd); range_axis = linspace(-200,200,Nr/2)*((Nr/2)/400);
figure; surf(doppler_axis,range_axis,RDM); xlabel('doppler');ylabel('range');zlabel('RDM');title('2D FFT');
|
- CFAR 检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
Tr = 8; Td = 4;
Gr = 4; Gd = 2;
offset = 1.4;
noise_level = zeros(1,1);
RDM = RDM/max(max(RDM)); for i = Tr+Gr+1 : Nr/2-(Gr+Tr) for j = Td+Gd+1 : Nd-(Gd+Td)
noise_level = zeros(1,1);
for p = i-(Tr+Gr): i+ (Tr+Gr) for q = j-(Td+Gd): j+(Td+Gd)
if (abs(i-p)> Gr ||abs(j-q)>Gd) noise_level = noise_level+ db2pow(RDM(p,q)); end end
end threshold = pow2db(noise_level/(2*(Td+Gd+1)*2*(Tr+Gr+1)-(Gr*Gd)-1)); threshold = threshold + offset; CUT= RDM(i,j); if (CUT<threshold) RDM(i,j)=0; else RDM(i,j)= 1; disp(i); disp(j); end end end
RDM(RDM~=0 & RDM~=1) = 0;
figure('Name', 'CFAR') surf(doppler_axis,range_axis,RDM); colorbar; title('offset 1.4');
|
后续内容待补充……
完整代码:https://github.com/Vanillaholic/2D-CFAR-detection-of-FMCW
(本文只是学习笔记,侵删)参考:
[1] https://mp.weixin.qq.com/s/Gs8xTeQt5dtY8jMBfZ2xYA
[2] https://mp.weixin.qq.com/s/iC18AWIRj6jOnR8SJMbpZw