第01篇:噪声、门限与虚警/检测概率(PFA/PD)

一、作用:检测器在做什么?
在电子战和雷达系统中,接收机面前永远摆着一个核心问题:这段信号里到底有没有目标?
接收机天线拾取到的信号,几乎永远混杂着噪声。检测器的任务,就是根据一段观测数据,判决"有信号"(H₁)还是"只有噪声"(H₀)。这个二元假设检验问题,构成了所有信号检测理论的基石。
然而,判决不可能永远正确。两种错误不可避免:
- 虚警(False Alarm) :实际上只有噪声,却判决为有信号
- 漏检(Missed Detection) :实际上有信号,却判决为只有噪声
本篇博客要解决的核心问题是:给定一个虚警概率的要求,门限应该设在哪里?对应的检测概率又是多少?
这就是Neyman-Pearson准则的精髓------在约束虚警概率的前提下,最大化检测概率。
二、原理:数学上发生了什么?
2.1 噪声服从什么分布?
假设噪声是零均值复高斯白噪声,实部和虚部独立同分布,方差各为σ2/2\sigma^2/2σ2/2。对MMM个独立同分布的复噪声样本求平方和:
Z=∑i=1M∣ni∣2=∑i=1Mℜ(ni)2+ℑ(ni)2 Z = \sum_{i=1}^{M} |n_i|^2 = \sum_{i=1}^{M} \left \\Re(n_i)\^2 + \\Im(n_i)\^2 \\right Z=i=1∑M∣ni∣2=i=1∑Mℜ(ni)2+ℑ(ni)2
每个样本的实部和虚部平方和服从自由度为2的卡方分布,MMM个样本加起来就服从自由度为2M2M2M的中心卡方分布。
2.2 有信号时服从什么分布?
当存在确定信号时,每个样本的均值不再为零。此时ZZZ服从自由度为2M2M2M、非中心参数为λ=2M⋅ξ\lambda = 2M \cdot \xiλ=2M⋅ξ的非中心卡方分布 ,其中ξ\xiξ是信噪比。
2.3 检测概率与虚警概率的闭式表达
- 虚警概率 PFAP_{FA}PFA:噪声超过门限η\etaη的概率
PFA=Qχ2M2(η) P_{FA} = Q_{\chi^2_{2M}}(\eta) PFA=Qχ2M2(η)
其中Qχ2Q_{\chi^2}Qχ2是中心卡方分布的右尾概率。
- 检测概率 PDP_DPD:有信号时超过门限η\etaη的概率
PD=Qχ2M2(λ)(η) P_D = Q_{\chi^2_{2M}(\lambda)}(\eta) PD=Qχ2M2(λ)(η)
其中Qχ2(λ)Q_{\chi^2(\lambda)}Qχ2(λ)是非中心卡方分布的右尾概率。
2.4 门限怎么定?
给定PFAP_{FA}PFA,门限η\etaη由中心卡方分布的分位数决定:
KaTeX parse error: Double superscript at position 20: ...a = \chi^2_{2M}^̲{-1}(1 - P_{FA}...
然后在相同门限下计算PDP_DPD。
三、完整代码(可直接运行)
matlab
%% ========================================================================
% 第01篇:噪声、门限与虚警/检测概率(PFA/PD)
% 完整可运行代码
% 基于:ch2_drawFigures(图2.2、2.3)、ex2_2
% ========================================================================
clear; close all; clc;
%% 参数设置
M = [1, 10, 100]; % 积累点数(时间带宽积)
PFA_target = 1e-6; % 目标虚警概率
xi_dB = -20:0.1:20; % SNR范围(dB)
xi_lin = 10.^(xi_dB/10); % SNR线性值
%% 计算门限与检测概率(解析解)
% 使用ndgrid生成M和xi的所有组合
[MM, XI] = ndgrid(M, xi_lin);
% 计算门限(中心卡方分布的分位数)
eta = chi2inv(1 - PFA_target, 2*MM);
% 计算检测概率(非中心卡方分布的右尾概率)
lambda = 2 * MM .* XI; % 非中心参数
PD = 1 - ncx2cdf(eta, 2*MM, lambda);
%% 蒙特卡洛验证(可选,仅演示M=1情况)
nMC = 10000;
M_mc = 1;
snr_test_db = -10:2:10;
snr_test_lin = 10.^(snr_test_db/10);
PD_mc = zeros(size(snr_test_lin));
for idx = 1:length(snr_test_lin)
% 生成噪声(复高斯)
noise = (1/sqrt(2)) * (randn(M_mc, nMC) + 1i*randn(M_mc, nMC));
% 生成信号(单位功率,相位随机)
signal = (1/sqrt(2)) * (randn(M_mc, nMC) + 1i*randn(M_mc, nMC));
signal = signal * sqrt(snr_test_lin(idx)); % 按SNR缩放
% 接收信号 = 信号 + 噪声
y = signal + noise;
% 平方律检测器输出:能量
z = sum(abs(y).^2, 1);
% 判决:超过门限则判为检测到
threshold = chi2inv(1 - PFA_target, 2*M_mc);
detections = z > threshold;
PD_mc(idx) = sum(detections) / nMC;
end
%% 绘制结果
figure('Position', [100, 100, 800, 600]);
% 子图1:P_D vs SNR(不同M值)
subplot(2,2,1);
plot(xi_dB, PD, 'LineWidth', 2);
xlabel('SNR $\xi$ [dB]', 'Interpreter', 'latex');
ylabel('检测概率 $P_D$', 'Interpreter', 'latex');
title(['$P_{FA} = 10^{' num2str(log10(PFA_target)) '}$'], 'Interpreter', 'latex');
legend(arrayfun(@(x) sprintf('M = %d', x), M, 'UniformOutput', false), ...
'Location', 'southeast');
grid on;
xlim([-20, 20]);
ylim([0, 1]);
% 子图2:门限 vs M
subplot(2,2,2);
semilogy(M, chi2inv(1 - PFA_target, 2*M), 'ko-', 'LineWidth', 2, 'MarkerSize', 8);
xlabel('积累点数 $M$', 'Interpreter', 'latex');
ylabel('门限 $\eta$', 'Interpreter', 'latex');
title('门限随M的变化');
grid on;
% 子图3:不同PFA下的P_D曲线
subplot(2,2,3);
PFA_set = [1e-6, 1e-4, 1e-2];
colors = lines(length(PFA_set));
M_plot = 10;
for idx = 1:length(PFA_set)
eta_tmp = chi2inv(1 - PFA_set(idx), 2*M_plot);
lambda_tmp = 2 * M_plot * xi_lin;
PD_tmp = 1 - ncx2cdf(eta_tmp, 2*M_plot, lambda_tmp);
plot(xi_dB, PD_tmp, 'Color', colors(idx,:), 'LineWidth', 2);
hold on;
end
xlabel('SNR $\xi$ [dB]', 'Interpreter', 'latex');
ylabel('检测概率 $P_D$', 'Interpreter', 'latex');
title(['$M = ' num2str(M_plot) '$'], 'Interpreter', 'latex');
legend(arrayfun(@(x) sprintf('$P_{FA} = 10^{%d}$', log10(x)), PFA_set, ...
'UniformOutput', false), 'Interpreter', 'latex', 'Location', 'southeast');
grid on;
xlim([-20, 20]);
ylim([0, 1]);
% 子图4:解析解 vs 蒙特卡洛
subplot(2,2,4);
% 解析解(M=1)
eta_mc = chi2inv(1 - PFA_target, 2);
lambda_mc = 2 * snr_test_lin;
PD_analytic = 1 - ncx2cdf(eta_mc, 2, lambda_mc);
plot(snr_test_db, PD_analytic, 'b-', 'LineWidth', 2, 'DisplayName', '解析解');
hold on;
plot(snr_test_db, PD_mc, 'ro', 'MarkerSize', 8, 'LineWidth', 1.5, ...
'DisplayName', '蒙特卡洛');
xlabel('SNR $\xi$ [dB]', 'Interpreter', 'latex');
ylabel('检测概率 $P_D$', 'Interpreter', 'latex');
title(['$M = 1, P_{FA} = 10^{' num2str(log10(PFA_target)) '}$, 蒙特卡洛验证'], ...
'Interpreter', 'latex');
legend('Location', 'southeast');
grid on;
xlim([-10, 10]);
ylim([0, 1]);
%% 导出图片
% exportgraphics(gcf, 'fig_detection_basics.png', 'Resolution', 300);

四、代码讲解:为什么这么写?
4.1 整体结构
代码分为四个层次:
- 参数定义 :积累点数MMM、虚警概率PFAP_{FA}PFA、SNR范围
- 解析计算:利用卡方分布计算门限和检测概率
- 蒙特卡洛验证:用随机仿真验证解析结果的正确性
- 可视化:四个子图从不同角度展示检测性能
4.2 核心数学函数
matlab
eta = chi2inv(1 - PFA_target, 2*MM);
chi2inv是卡方分布的逆累积分布函数 (分位数函数)。给定右尾概率PFAP_{FA}PFA,返回对应的门限η\etaη。这是Neyman-Pearson准则的核心操作------先定虚警,再求门限。
matlab
PD = 1 - ncx2cdf(eta, 2*MM, lambda);
ncx2cdf是非中心卡方分布的累积分布函数 。1 - cdf就是右尾概率,即检测概率PDP_DPD。非中心参数λ=2Mξ\lambda = 2M\xiλ=2Mξ体现了信噪比的影响------信噪比越高,分布越向右偏移,检测概率越大。
⚠️ 注意 :
chi2inv和ncx2cdf来自MATLAB的Statistics and Machine Learning Toolbox。如果没有该工具箱,原书代码提供了utils.chi2inv和utils.ncx2cdf作为替代实现。
4.3 为什么要用ndgrid?
matlab
[MM, XI] = ndgrid(M, xi_lin);
ndgrid将MMM和ξ\xiξ的所有组合展开成矩阵,使得我们可以一次性计算所有参数组合下的门限和检测概率,无需写双层for循环。这是MATLAB向量化编程的典型技巧,既简洁又高效。
4.4 蒙特卡洛验证模块
matlab
noise = (1/sqrt(2)) * (randn(M_mc, nMC) + 1i*randn(M_mc, nMC));
signal = (1/sqrt(2)) * (randn(M_mc, nMC) + 1i*randn(M_mc, nMC));
signal = signal * sqrt(snr_test_lin(idx));
复高斯噪声的构造:实部和虚部各用randn生成,乘以1/21/\sqrt{2}1/2 使总功率为1。信号同样构造为单位功率,再按SNR缩放。
matlab
z = sum(abs(y).^2, 1);
这就是平方律检测器 的核心------取模平方后求和。为什么叫"平方律"?因为输出与输入幅度的平方成正比。
4.5 四子图的设计意图
| 子图 | 内容 | 教学目的 |
|---|---|---|
| 左上 | PDP_DPD vs SNR,不同MMM | 展示积累增益:MMM越大,曲线越陡 |
| 右上 | 门限 vs MMM | 展示MMM对门限的影响 |
| 左下 | PDP_DPD vs SNR,不同PFAP_{FA}PFA | 展示虚警概率与检测概率的权衡 |
| 右下 | 解析解 vs 蒙特卡洛 | 验证理论公式的正确性 |
这正是原书图2.2、2.3和ex2_2所展示的内容。
五、运行结果解读
运行代码后,你会看到:
-
左上图 :M=1M=1M=1时曲线最平缓,M=100M=100M=100时曲线最陡。这说明积累点数越多,检测性能越好------这是时间带宽积(TBWP)带来的处理增益。
-
右上图 :门限随MMM增大而升高。因为积累的能量更多,噪声的统计幅度更大,门限自然要上调才能维持相同的虚警概率。
-
左下图 :PFAP_{FA}PFA越低(如10−610^{-6}10−6),曲线越靠右。更低的虚警概率意味着更高的门限,从而需要更高的信噪比才能达到相同的检测概率------这就是检测性能的基本权衡。
-
右下图:红色圆点(蒙特卡洛)紧密贴合蓝色曲线(解析解),验证了理论公式的正确性。
六、延伸思考
-
如果MMM不是整数怎么办? 实际中M=BTM = BTM=BT(带宽×脉冲宽度),通常是整数。如果非整数,可以用伽马分布近似。
-
如果信号是起伏的(Swerling模型)怎么办? 此时信号幅度本身是随机的,检测概率需要对信号分布再做一次平均。原书第3章对此有详细讨论。
-
实际系统中如何估计噪声功率? 这就是CFAR(恒虚警)技术要解决的问题------从参考单元中实时估计噪声功率,动态调整门限。我们将在第03篇中详细讨论。
下一篇预告(第02篇):能量检测器 vs. 相关检测器
当信号波形已知时,相关检测器能获得比能量检测器更好的性能。我们将从交叉相关器的原理出发,推导其检测概率公式,并用MATLAB复现原书图4.6的经典对比曲线。