【电子战】 第01篇:噪声、门限与虚警/检测概率(PFA/PD)【含matlab代码】

第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 整体结构

代码分为四个层次:

  1. 参数定义 :积累点数MMM、虚警概率PFAP_{FA}PFA、SNR范围
  2. 解析计算:利用卡方分布计算门限和检测概率
  3. 蒙特卡洛验证:用随机仿真验证解析结果的正确性
  4. 可视化:四个子图从不同角度展示检测性能
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ξ体现了信噪比的影响------信噪比越高,分布越向右偏移,检测概率越大。

⚠️ 注意chi2invncx2cdf来自MATLAB的Statistics and Machine Learning Toolbox。如果没有该工具箱,原书代码提供了utils.chi2invutils.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所展示的内容。

五、运行结果解读

运行代码后,你会看到:

  1. 左上图 :M=1M=1M=1时曲线最平缓,M=100M=100M=100时曲线最陡。这说明积累点数越多,检测性能越好------这是时间带宽积(TBWP)带来的处理增益。

  2. 右上图 :门限随MMM增大而升高。因为积累的能量更多,噪声的统计幅度更大,门限自然要上调才能维持相同的虚警概率。

  3. 左下图 :PFAP_{FA}PFA越低(如10−610^{-6}10−6),曲线越靠右。更低的虚警概率意味着更高的门限,从而需要更高的信噪比才能达到相同的检测概率------这就是检测性能的基本权衡。

  4. 右下图:红色圆点(蒙特卡洛)紧密贴合蓝色曲线(解析解),验证了理论公式的正确性。

六、延伸思考

  1. 如果MMM不是整数怎么办? 实际中M=BTM = BTM=BT(带宽×脉冲宽度),通常是整数。如果非整数,可以用伽马分布近似。

  2. 如果信号是起伏的(Swerling模型)怎么办? 此时信号幅度本身是随机的,检测概率需要对信号分布再做一次平均。原书第3章对此有详细讨论。

  3. 实际系统中如何估计噪声功率? 这就是CFAR(恒虚警)技术要解决的问题------从参考单元中实时估计噪声功率,动态调整门限。我们将在第03篇中详细讨论。


下一篇预告(第02篇):能量检测器 vs. 相关检测器

当信号波形已知时,相关检测器能获得比能量检测器更好的性能。我们将从交叉相关器的原理出发,推导其检测概率公式,并用MATLAB复现原书图4.6的经典对比曲线。

相关推荐
奇牙coding1231 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
lzx_0022 小时前
C++11(一)
开发语言·c++·算法
未来之窗软件服务2 小时前
计算机二级[英文]-C 字符串移动—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring
谢尔登3 小时前
01_Java基础速通
java·开发语言
前端炒粉3 小时前
DOM 常用 API 速查表
开发语言·javascript·ecmascript
en.en..4 小时前
C语言核心解析:#define与typedef本质区别
开发语言·c++·算法
2601_966949654 小时前
批量获取多只股票五档盘口的极简方案:QuantDash Python SDK 实战指南
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
点心的游戏开发世界5 小时前
GDScript 入门笔记:目录
开发语言·笔记·游戏引擎·godot