雷达信号处理之恒虚警(CFAR)
恒虚警率(Constant False Alarm Rate, CFAR)是一种自适应阈值目标检测技术,在雷达信号处理中用于从噪声和杂波背景中检测出目标回波。其核心思想是:无论背景噪声或杂波的功率如何变化,都保持虚警概率 $P_{fa}$ 为一个预先设定的常数。
基本原理与流程
CFAR 算法通过实时估计待检测单元(Cell Under Test, CUT)周围的背景噪声或杂波功率,并根据期望的虚警率 $P_{fa}$ 自适应地确定检测阈值 $T$。
核心流程其实很直观:
- 滑动窗口:在待检测数据(通常是距离 - 多普勒图或距离向数据)上设定一个固定大小的滑动窗口。
- 单元划分:窗口内的单元被划分为三个部分:
- 待检测单元(CUT):位于窗口中心,是我们要判断是否包含目标的单元。
- 保护单元(Guard Cells, $G$):紧邻 CUT 两侧,用于防止目标能量泄露污染噪声估计,不参与噪声功率计算。
- 参考/训练单元(Training Cells, $N$):位于保护单元外侧,用于估计背景噪声/杂波的平均功率。
门限计算:根据估计的背景功率 $\hat{\sigma}^2$ 和一个比例因子(门限系数)$\alpha$,确定检测阈值 $T$: $$T = \alpha \cdot \hat{\sigma}^2$$ 其中,$\alpha$ 是根据期望的虚警率 $P_{fa}$ 和噪声统计分布推导出来的。
目标检测:将 CUT 的功率值 $P_{\text{CUT}}$ 与阈值 $T$ 进行比较:
- 如果 $P_{\text{CUT}} \le T$,则判断不存在目标。
- 如果 $P_{\text{CUT}} > T$,则判断存在目标。
常见 CFAR 算法分类
CFAR 算法根据参考单元功率的计算方式不同,可以分为多种类型,以适应不同的杂波环境:
| 算法类型 | 噪声估计方式 | 适用场景 | 关键特点 |
|---|---|---|---|
| CA-CFAR | 对所有参考单元的功率进行算术平均 | 背景噪声/杂波均匀、同性 | 性能最优良的基准算法,但对于多目标或杂波边界性能差 |
| GO-CFAR | 取左右两侧平均功率较大值 | 适用于杂波功率突变的情况 | 在杂波边界处能有效抑制虚警 |
| SO-CFAR | 取左右两侧平均功率较小值 | 适用于多目标环境 | 在双目标或密集目标环境下,检测性能优于 CA-CFAR |
| OS-CFAR | 选取排序后第 k 个值作为背景估计 | 适用于多目标、非均匀杂波环境 | 鲁棒性强,可有效去除训练单元中的干扰目标 |
MATLAB 实际用例:CA-CFAR 实现
下面我们通过一段 MATLAB 代码来具体看看它是如何工作的。这是一个一维雷达距离向数据的检测示例。
%% 1. 模拟雷达数据生成
N_data = 1000; % 总数据点数
P_noise_dB = 0; % 背景噪声功率
P_noise = 10^(P_noise_dB/10);
noise_power = exprnd(P_noise, 1, N_data);
target_amp_dB = 15;
target_amp = 10^(target_amp_dB/10);
target_cell_1 = 200;
target_cell_2 = 600;
data = noise_power;
data(target_cell_1) = data(target_cell_1) + target_amp;
data(target_cell_2) = data(target_cell_2) + target_amp;
%% 2. CA-CFAR 参数设置
N_ref = 10; % 参考单元数量
N_guard = 2; % 保护单元数量
Pfa = 1e-4; % 期望的虚警率
alpha = N_ref * (Pfa^(-1/N_ref) - 1); % 门限因子
threshold = zeros(1, N_data);
detection = zeros(1, N_data);
%% 3. CA-CFAR 检测主循环
for CUT = 1 : N_data
idx_start = CUT - N_ref - N_guard;
idx_end = CUT + N_ref + N_guard;
if idx_start < 1 || idx_end > N_data
threshold(CUT) = NaN;
continue;
end
idx_L = [idx_start : CUT - N_guard - 1];
idx_R = [CUT + N_guard + 1 : idx_end];
training_cells = [data(idx_L), data(idx_R)];
P_avg = mean(training_cells);
T = alpha * P_avg;
threshold(CUT) = T;
if data(CUT) > T
detection(CUT) = 1;
end
end
%% 4. 结果可视化
figure;
subplot(2,1,1);
plot(1:N_data, 10*log10(data), 'b', 'LineWidth', 1.5);
hold on;
plot(1:N_data, 10*log10(threshold), 'r--', 'LineWidth', 2);
scatter(find(detection), 10*log10(data(find(detection))), 50, 'r', 'filled');
xlabel('距离单元'); ylabel('功率 (dB)');
title(['CA-CFAR 目标检测结果 (P_{fa} = ', num2str(Pfa), ')']);
legend('雷达功率', 'CFAR 阈值', '检测到的目标', 'Location', 'NorthEast');
grid on;
subplot(2,1,2);
plot(1:N_data, detection, 'k', 'LineWidth', 1.5);
xlabel('距离单元'); ylabel('检测状态');
title('目标检测状态');
ylim([-0.1 1.1]);
grid on;

