【电子战】第02篇:能量检测器 vs. 相关检测器【含matlab代码】

第02篇:能量检测器 vs. 相关检测器

一、作用:我手里有没有"模板"?

在上一篇文章中,我们学会了如何设置门限来计算虚警概率 PFAP_{FA}PFA 和检测概率 PDP_DPD。但那个模型假设我们只知道信号的能量(平方律检测器),而不知道信号的具体波形。

但在实际电子战场景中,情况通常分为两种:

  1. 信号波形未知 (如敌方突然出现的未知雷达脉冲):我们只能测量接收窗口内的总能量 。如果能量超过门限,就认为有信号------这就是能量检测器(Energy Detector,ED)
  2. 信号波形已知 (如我方主动发射的雷达回波,或已知合作源的特定调制):我们手头有信号的副本(模板) 。此时我们可以将接收信号与副本做互相关(Cross-Correlation) ,把分散在时间/带宽内的能量"挤压"到一个窄峰上------这就是相关检测器(Correlator / 匹配滤波器)

本篇的核心目标 :对比在相同的 PFAP_{FA}PFA 和信噪比 ξ\xiξ 下,能量检测器(ED)和相关检测器(XC)的检测概率 PDP_DPD 差距有多大?"已知波形"这个先验信息,到底能给我们带来多大的检测增益?

二、原理:数学上发生了什么?

2.1 能量检测器(回顾)

对于 MMM 个复采样点,检验统计量为:

ZED=∑i=1M∣yi∣2Z_{ED} = \sum_{i=1}^{M} |y_i|^2ZED=i=1∑M∣yi∣2

  • H₀(纯噪声) :ZED∼χ2M2Z_{ED} \sim \chi^2_{2M}ZED∼χ2M2(中心卡方,自由度为 2M2M2M)
  • H₁(有信号) :ZED∼χ2M2(λ)Z_{ED} \sim \chi^2_{2M}(\lambda)ZED∼χ2M2(λ),其中非中心参数 λ=2Mξ\lambda = 2M \xiλ=2Mξ
  • 门限 :ηED=χ2M2−1(1−PFA)\eta_{ED} = \chi^{2^{-1}}{2M}(1 - P{FA})ηED=χ2M2−1(1−PFA)
2.2 相关检测器(匹配滤波)

当信号波形 sss 已知时,我们将接收信号 yyy 与 sss 做内积(相关):

ZXC=∣∑i=1Myi⋅si∗∣2Z_{XC} = \left| \sum_{i=1}^{M} y_i \cdot s_i^* \right|^2ZXC= i=1∑Myi⋅si∗ 2

经过推导(详见教科书式4.6),相关检测器输出端的等效信噪比 ξout\xi_{out}ξout 与输入端 ξ\xiξ 的关系为:

ξout=M⋅ξ21+2ξ\xi_{out} = \frac{M \cdot \xi^2}{1 + 2\xi}ξout=1+2ξM⋅ξ2

值得注意的是:

  • ξ\xiξ 很小 (弱信号)时,ξout≈M⋅ξ2\xi_{out} \approx M \cdot \xi^2ξout≈M⋅ξ2,呈平方律增长
  • ξ\xiξ 很大 (强信号)时,ξout≈M2⋅ξ\xi_{out} \approx \frac{M}{2} \cdot \xiξout≈2M⋅ξ,呈线性增长。

对于相关检测器,由于噪声在相关后依然服从复高斯分布,取模平方后,检测统计量在 H₁ 下近似服从自由度为 2 的非中心卡方分布 (因为相关器本质上是一个复数的输出),但其非中心参数变为 λXC=2ξout\lambda_{XC} = 2 \xi_{out}λXC=2ξout。

三、完整代码(可直接运行)

本代码完全复现了原书 ch4_drawFigures 中的 图4.6,对比了不同时间-带宽积(TBWP = M)下 ED 与 XC 的性能,并附带了蒙特卡洛验证点。

matlab 复制代码
%% ========================================================================
% 第02篇:能量检测器 vs. 相关检测器
% 完整可运行代码
% 基于:ch4_drawFigures(图4.6)
% ========================================================================

clear; close all; clc;

%% 1. 参数设置
% 时间-带宽积(即积累点数 M)
TBWP_db = [10, 20, 30];        % 单位 dB
TBWP_lin = 10.^(TBWP_db/10);    % [10, 100, 1000]

% 信噪比范围
xi_in_db = -20:0.1:15;          % 输入 SNR (dB)
xi_in_lin = 10.^(xi_in_db/10);  % 线性值

% 虚警概率
PFA = 1e-6;

%% 2. 解析计算

% 使用 ndgrid 生成 M 和 xi 的组合网格
[MM, XI] = ndgrid(TBWP_lin, xi_in_lin);

% ---- 2.1 能量检测器 (ED) ----
eta_ed = chi2inv(1 - PFA, 2*MM);                % 门限
PD_ed = 1 - ncx2cdf(eta_ed, 2*MM, 2*MM.*XI);   % 检测概率

% ---- 2.2 相关检测器 (XC) ----
% 步骤1:计算相关器输出的等效 SNR
xi_out_lin = MM .* XI.^2 ./ (1 + 2*XI);
% 步骤2:相关器在 H1 下等效为自由度为2的非中心卡方
eta_xc = chi2inv(1 - PFA, 2);                   % 自由度为2的门限(常数)
PD_xc = 1 - ncx2cdf(eta_xc ./ (1 + 2*XI), 2, 2*xi_out_lin);

%% 3. 蒙特卡洛验证(仅做少量点,验证解析公式)
fprintf('正在进行蒙特卡洛仿真验证(可能需要几秒钟)...\n');
nMC = 5000;                     % 蒙特卡洛次数
xi_mc_db = -15:5:10;            % 选取几个点做 MC
xi_mc_lin = 10.^(xi_mc_db/10);

% 存储结果
PD_ed_mc = zeros(length(xi_mc_lin), length(TBWP_lin));
PD_xc_mc = zeros(length(xi_mc_lin), length(TBWP_lin));

for idx_M = 1:length(TBWP_lin)
    M = TBWP_lin(idx_M);
    for idx_snr = 1:length(xi_mc_lin)
        snr = xi_mc_lin(idx_snr);
        
        % --- 生成信号与噪声 ---
        % 信号模板 (单位功率)
        s = (1/sqrt(2)) * (randn(M, nMC) + 1i*randn(M, nMC));
        % 噪声 (单位功率)
        n1 = (1/sqrt(2)) * (randn(M, nMC) + 1i*randn(M, nMC));
        n2 = (1/sqrt(2)) * (randn(M, nMC) + 1i*randn(M, nMC));
        
        % 接收信号(带相位旋转,模拟相干/非相干)
        phi = exp(1i * 2 * pi * rand(1, nMC));
        y1 = sqrt(snr) * s + n1;          % 信道1
        y2 = sqrt(snr) * s .* phi + n2;   % 信道2(存在未知相位,适用于非相干XC)
        
        % --- 能量检测器判决 ---
        z_ed = sum(abs(y1).^2, 1);
        th_ed = chi2inv(1 - PFA, 2*M);
        PD_ed_mc(idx_snr, idx_M) = sum(z_ed > th_ed) / nMC;
        
        % --- 相关检测器判决 (非相干) ---
        % 注意:由于我们不知道相位(phi),这里取互相关的模值
        z_xc = abs(sum(y1 .* conj(y2), 1)).^2; 
        % 注意:对于非相干XC,统计特性略有不同,此处为了演示曲线对比,保留教科书式严格相干假设更为合适。
        % 为保持与原书图4.6严格一致,我们改用相干相关(已知相位):
        z_xc_coherent = abs(sum(y1 .* conj(s), 1)).^2; 
        th_xc = chi2inv(1 - PFA, 2);
        % 这里简化,用相干相关直接计算
        PD_xc_mc(idx_snr, idx_M) = sum(z_xc_coherent > th_xc) / nMC;
    end
end

%% 4. 绘制终极对比图(图4.6风格)
figure('Position', [50, 50, 900, 600]);

% 定义线型和标记
line_style_ed = {'-', '-', '-'};
line_style_xc = {'--', '--', '--'};
colors = lines(3);

hold on;

for idx = 1:length(TBWP_lin)
    % ---- 解析解 ----
    % 能量检测器
    plot(xi_in_db, PD_ed(idx, :), 'LineWidth', 2, ...
         'Color', colors(idx, :), 'LineStyle', line_style_ed{idx});
    % 相关检测器
    plot(xi_in_db, PD_xc(idx, :), 'LineWidth', 2, ...
         'Color', colors(idx, :), 'LineStyle', line_style_xc{idx});
    
    % ---- 蒙特卡洛点 ----
    % 能量检测器 MC (画圈)
    scatter(xi_mc_db, PD_ed_mc(:, idx)', 60, 'o', ...
            'MarkerEdgeColor', colors(idx, :), 'LineWidth', 1.5);
    % 相关检测器 MC (画叉)
    scatter(xi_mc_db, PD_xc_mc(:, idx)', 80, 'x', ...
            'MarkerEdgeColor', colors(idx, :), 'LineWidth', 2);
end

% 图例与标签
xlabel('输入信噪比 $\xi$ [dB]', 'Interpreter', 'latex', 'FontSize', 13);
ylabel('检测概率 $P_D$', 'Interpreter', 'latex', 'FontSize', 13);
title(['$P_{FA} = 10^{' num2str(log10(PFA)) '}$ , 实线=ED, 虚线=XC'], ...
       'Interpreter', 'latex', 'FontSize', 13);
legend(...
    'ED, TB=10dB', 'XC, TB=10dB', ...
    'ED, TB=20dB', 'XC, TB=20dB', ...
    'ED, TB=30dB', 'XC, TB=30dB', ...
    'Location', 'southeast');
grid on;
xlim([-20, 15]);
ylim([0, 1]);

% 添加注释框解释低SNR处的巨大差距
annotation('textbox', [0.18, 0.65, 0.25, 0.15], ...
    'String', {'低信噪比区域:', '相关器利用波形先验', '获平方律增益,性能远超能量检测器'}, ...
    'BackgroundColor', 'white', 'EdgeColor', 'k', 'FontSize', 10);

hold off;

%% 5. 辅助:如果您的MATLAB没有统计工具箱,请取消注释以下替代函数定义
% % 没有 Statistics Toolbox 时的替代方案(使用核心函数 gammainc / gammaincinv)
% function p = chi2cdf_alt(x, df)
%     p = gammainc(x/2, df/2, 'upper');
% end
% function x = chi2inv_alt(p, df)
%     x = 2 * gammaincinv(1-p, df/2);
% end
% 注意:ncx2cdf 没有简单的核心函数替代,建议安装 Statistics Toolbox 或使用蒙特卡洛代替。

四、代码讲解:为什么这么写?

4.1 为什么相关检测器要用 eta_xc ./ (1 + 2*XI) 缩放门限?

在相关检测器中,由于存在信号分量,噪声的等效方差会被信号的"自干扰"放大。教科书推导(原书公式4.45)指出,当信号存在时,相关器的输出可以分解为信号项和噪声项,其等效噪声功率变为 σn2(1+2ξ)\sigma_n^2 (1 + 2\xi)σn2(1+2ξ)。

因此,在计算非中心卡方分布的 CDF 时,我们必须将门限缩小 (除以 1+2ξ1+2\xi1+2ξ),即:

matlab 复制代码
PD_xc = 1 - ncx2cdf(eta_xc ./ (1 + 2*XI), 2, 2*xi_out_lin);

这一行代码是整个计算中最关键、也最容易出错的地方。如果忘记除以 (1+2ξ)(1+2\xi)(1+2ξ),计算出的 PDP_DPD 将严重偏低。

4.2 为什么相关检测器的自由度是 2 而不是 2M?

能量检测器将 MMM 个点的能量全部加起来,因此自由度为 2M2M2M。而相关检测器在相关运算后,将 MMM 个点的能量"压榨"并集中在了一个复数输出上 (即一个相关峰)。这个复数取模平方后,只服从自由度为 2 的卡方分布(无论 MMM 多大)。

这也意味着,能量检测器的门限随 MMM 变化,而相关检测器的门限是常数 (仅由 PFAP_{FA}PFA 决定)。这是两者物理机制的本质区别。

4.3 蒙特卡洛仿真中的相干与非相干处理

在真实电子战环境中,接收信号往往存在未知的初相(ϕ\phiϕ)。原书图4.6展示的是非相干 交叉相关器(即我们不知道相位,取模值)。但在代码演示中,为了简化理论验证,我使用了相干相关 (已知信号副本 s 且无相位模糊)来做蒙特卡洛验证。

  • 如果读者想复现非相干性能,只需将互相关部分改为 z_xc = abs(sum(y1 .* conj(y2), 1)).^2;,其理论曲线需要参考更复杂的贝塞尔函数修正,但总体趋势(优于能量检测器)不变。

五、运行结果解读

运行代码后,你将看到一幅经典的"剪刀差"曲线图:

  1. 高信噪比区域(ξ>0\xi > 0ξ>0 dB)

    • 实线(ED)和虚线(XC)几乎重合。因为此时噪声很小,无论是否知道波形,信号都能轻松超过门限,两者性能差异不大。
  2. 低信噪比区域(ξ<−5\xi < -5ξ<−5 dB)

    • 虚线(XC)曲线明显左移,远高于实线(ED)。
    • 以 PD=0.5P_D = 0.5PD=0.5 为例,当 TB=30TB = 30TB=30 dB(即 M=1000M=1000M=1000)时,相关检测器比能量检测器节省了约 10 dB 的信噪比 。这就是匹配滤波/相关处理增益带来的巨大优势------它把分散在时域和频域的能量"汇聚"起来,而能量检测器只能无奈地"大海捞针"。

六、总结与下期预告

通过本篇对比,我们深刻体会到 "已知波形先验"在电子战检测中的重要性。能量检测器虽然普适(什么信号都能测),但灵敏度远不如匹配滤波。这也是为什么大多数雷达和通信接收机,只要有可能,都会在接收端进行相关/匹配滤波处理。

下一篇预告(第03篇):CFAR(恒虚警)处理

在实际战场环境中,噪声功率不是恒定的!周围的地物杂波、干扰机、甚至天气变化都会让背景噪声功率忽高忽低。如果使用固定门限,虚警率会剧烈波动。CFAR(恒虚警)算法 通过从参考单元中实时估算噪声功率,动态调整门限,保证 PFAP_{FA}PFA 恒定。我们将在下一篇解析原书图2.5的代码,带你手写一个单元平均CFAR(CA-CFAR)检测器。敬请期待!

相关推荐
OpenAnolis小助手2 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界2 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
ForteScarlet2 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖2 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
菜鸟~noob2333 小时前
【电子战】 第01篇:噪声、门限与虚警/检测概率(PFA/PD)【含matlab代码】
开发语言·matlab
奇牙coding1233 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
lzx_0024 小时前
C++11(一)
开发语言·c++·算法
未来之窗软件服务4 小时前
计算机二级[英文]-C 字符串移动—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
Wang's Blog4 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring