【电子战】 第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ξ体现了信噪比的影响------信噪比越高,分布越向右偏移,检测概率越大。

⚠️ 注意 :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所展示的内容。

五、运行结果解读

运行代码后,你会看到:

  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的经典对比曲线。

相关推荐
andyweike2 小时前
php笔记
开发语言·笔记·php
Circ.3 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
现任明教教主~5 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
Zhou1411365 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
码匠许师傅6 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
小小小小钰儿7 小时前
1.5-Python网络编程
开发语言·网络·python·web安全·计算机·网络安全
hiahiahia1237 小时前
实现完整 Tool Dispatcher
开发语言·前端
AC赳赳老秦7 小时前
公开音频转写信息提取:OpenClaw 处理发布会与听证会文本并提取核心决策信息
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw