CFAR 目标检测算法详解(附 MATLAB 示例)

CFAR 目标检测算法,毫米波雷达工程师必须掌握的第一种检测算法
一、为什么雷达需要“目标检测算法”?
在毫米波雷达中,我们最终想知道的不是“信号长什么样”,而是:
哪里有目标?目标有多少?哪些是噪声?
然而,雷达接收到的信号永远是下面三者的混合:
- 真实目标回波
- 环境杂波(地面、墙面、人体、车辆反射)
- 系统噪声(热噪声、量化噪声等)
在经过 ADC → FFT → 距离谱 / 多普勒谱 后,你会看到大量起伏的谱线。
问题来了:
在一个噪声水平不断变化的环境中,如何“公平、稳定”地判断某个峰值是不是目标?
这正是 CFAR(Constant False Alarm Rate,恒虚警率)算法存在的意义。
二、CFAR 的核心思想(一句话版)
门限不固定,而是根据“周围环境噪声”动态调整。
换句话说:
- 噪声大 → 门限自动抬高
- 噪声小 → 门限自动降低
- 始终保持一个“近似恒定”的虚警概率
这比“固定阈值法”工程上可靠得多。
三、CFAR 的物理意义(非常重要)
1️⃣ 雷达不是在“找最大值”,而是在“找异常”
CFAR 的本质不是:
“这个点是不是很大?”
而是:
“这个点是否显著高于它周围的统计背景?”
如果你把雷达距离谱想象成一条“地形起伏的山脉”:
- 噪声 = 起伏的地面
- 目标 = 突然冒出的山峰
CFAR 做的事情就是:
先估计地面高度,再判断某个山峰是否“足够突出”。
2️⃣ 为什么必须是“周围噪声”?
因为在雷达系统中:
- 噪声功率随距离变化
- 杂波随场景变化
- AGC、窗口函数都会改变谱形
固定门限 = 工程灾难
CFAR 利用 局部统计,是唯一实用的方法。
四、CFAR 的基本结构(工程视角)
对每一个被检测单元(Cell Under Test, CUT),CFAR 都会定义三类区域:
| Training | Guard | CUT | Guard | Training |
1️⃣ CUT(被检测单元)
- 当前要判断是否为目标的点
2️⃣ Guard Cells(保护单元)
- 防止目标能量泄漏进噪声估计
- 一般 1–4 个
3️⃣ Training Cells(训练单元)
- 用来估计背景噪声功率
- 一般 8–32 个(甚至更多)
五、最常见的 CFAR 类型
1️⃣ CA-CFAR(Cell Averaging CFAR)——最基础
思想:
用训练单元的“平均功率”估计噪声
优点:
- 简单
- 易实现
- 适合噪声均匀场景
缺点:
- 多目标、强杂波下性能下降
公式(功率域):
T = α ⋅ 1 N ∑ i = 1 N P i T = \alpha \cdot \frac{1}{N}\sum_{i=1}^{N} P_i T=α⋅N1i=1∑NPi
其中:
- α :门限系数(由虚警率决定)
- N:训练单元数
2️⃣ OS-CFAR(Order Statistic CFAR)
思想:
不用均值,用排序后的第 k 大值
优点:
- 抗强杂波
- 抗多目标
缺点:
- 计算量略大
3️⃣ GO-CFAR / SO-CFAR(左右不对称场景)
- GO-CFAR:取左右两侧噪声估计中的“较大者”
- SO-CFAR:取“较小者”
常用于 边缘目标、遮挡目标 场景。
六、CFAR 在毫米波雷达中的位置
在典型 FMCW 雷达处理链路中:
ADC
↓
Range FFT
↓
Doppler FFT
↓
Range-Doppler Map
↓
CFAR(2D)
↓
目标点云
- 1D CFAR:距离检测
- 2D CFAR:距离-速度联合检测(工程中更常见)
七、MATLAB 示例:一维 CA-CFAR 演示
下面给出一个 可直接运行的 MATLAB 示例,适合初学者理解 CFAR 的工作方式。
📌 示例功能
- 构造一条含噪声的距离谱
- 人工加入目标
- 使用 CA-CFAR 检测目标
✅ MATLAB 示例代码(ca_cfar.m)
%% CFAR 目标检测算法演示
% 作者:雷达物联
clc; clear; close all;
%% 1. 构造模拟距离谱
N = 256; % 距离单元数
noise_power = 1;
signal = sqrt(noise_power/2) * ...
(randn(1,N) + 1j*randn(1,N));
% 加入两个目标
signal(80) = signal(80) + 10;
signal(150) = signal(150) + 15;
% 功率谱
power_spectrum = abs(signal).^2;
%% 2. CFAR 参数
num_train = 12; % 训练单元数(单侧)
num_guard = 2; % 保护单元数
P_fa = 1e-4; % 虚警概率
N_train = 2 * num_train;
alpha = N_train * (P_fa^(-1/N_train) - 1);
%% 3. CA-CFAR 检测
threshold = zeros(1, N);
cfar_out = zeros(1, N);
for i = num_train + num_guard + 1 : N - num_train - num_guard
% 左右训练单元
training_cells = ...
[power_spectrum(i-num_guard-num_train : i-num_guard-1), ...
power_spectrum(i+num_guard+1 : i+num_guard+num_train)];
noise_est = mean(training_cells);
threshold(i) = alpha * noise_est;
if power_spectrum(i) > threshold(i)
cfar_out(i) = power_spectrum(i);
end
end
%% 4. 绘图
figure;
plot(10*log10(power_spectrum), 'b'); hold on;
plot(10*log10(threshold), 'r--', 'LineWidth',1.2);
stem(find(cfar_out), ...
10*log10(cfar_out(cfar_out>0)), ...
'g','filled');
grid on;
xlabel('Range Bin');
ylabel('Power (dB)');
legend('Range Spectrum','CFAR Threshold','Detected Targets');
title('CA-CFAR Target Detection Example');

八、如何理解这段代码(工程直觉版)
- training_cells:模拟“你站在 CUT 周围观察地面高度”
- noise_est:背景噪声估计
- alpha:控制“你有多谨慎”
- threshold:动态门限
- cfar_out:最终被认为是“目标”的点
九、CFAR 工程实践中的常见坑
⚠️ 1. 直接在幅度域做 CFAR
✔ 正确:功率域(|x|²)
⚠️ 2. Guard Cell 太少
- 目标能量泄漏 → 门限抬高 → 漏检
⚠️ 3. 虚警率随便选
- 工程常用:
1e-3 ~ 1e-6 - 需要结合系统帧率、算力
⚠️ 4. 忽略窗口函数影响
FFT 窗口会改变噪声统计分布,需注意门限系数是否匹配。
十、总结(给初学者的关键结论)
- CFAR 不是“雷达算法”,而是“统计检测算法”
- 它解决的是:在不确定噪声环境下,如何稳定找目标
- CA-CFAR 是所有 CFAR 的起点
- 几乎所有毫米波雷达系统都离不开 CFAR
- 理解 CFAR = 理解“雷达如何做决策”
十一、进阶学习建议
如果你希望进一步学习:
- 2D CFAR(Range-Doppler)
- OS-CFAR / GO-CFAR
- 多目标遮挡下的 CFAR 行为
- CFAR + 聚类 + 跟踪(工程完整链路)
建议在 真实 FMCW 雷达数据 上动手实验。
关注我们(雷达物联),一起学习。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)