做雷达系统仿真这些年,有一类问题我见得太多了:波形设计做得漂漂亮亮,脉冲压缩处理得干干净净,可一到检测那一环就露馅——要么检测概率上不去,要么虚警多得压不住。很多朋友卡在这里,根源就是对“非相参累积和相参累积”的理解停留在概念层面,一到仿真里就靠猜。这篇文章把我自己在仿真中建模、实现、验证这两种累积检测的完整过程摊开来讲,包括公式推导、MATLAB代码、参数权衡和踩过的坑。
这篇内容适合所有正在做雷达信号处理仿真、算法验证或者相关课程设计的人。你只需要有一点雷达基础,最好写过简单的回波生成程序,跟着走完一遍,就能搞清楚两个问题:为什么累积能提升检测性能?相参和非相参到底差在哪、各自怎么用?
1. 为什么检测之前要先做累积——雷达检测的本质与单脉冲瓶颈
1.1 检测问题的本质:二元假设检验
雷达检测本质上是一个二元假设检验问题。假设 H0 是“该距离单元只有噪声”,假设 H1 是“噪声背景下存在目标回波”。检测器要做的事情,就是根据接收信号 x 的能量或幅度,跟一个预设门限做比较,超过门限判为有目标,没超过判为无目标。
这个过程中有两个指标是绕不开的:虚警概率 Pfa 和检测概率 Pd。Pfa 指在只有噪声时误判成有目标的概率,Pd 指真有目标时正确检测出来的概率。这俩是互相矛盾的一对——门限放低了,Pd 上去但 Pfa 也上去;门限抬高,Pfa 下来了,Pd 也跟着垮。所以工程上都是先给定一个可接受的 Pfa(比如 10^-6),再去反推需要多少信噪比才能达到系统要求的 Pd(比如 0.9 或 0.8)。
问题在于,单脉冲检测在低信噪比下的性能非常有限。举个例子,在 Pfa = 10^-6 的条件下,单脉冲要达到 Pd = 0.9,需要的信噪比大约是 13 dB 左右(用马库姆 Q 函数反算)。如果你的回波信噪比只有 5 dB,单脉冲检测概率可能就只有 0.3 到 0.4,根本没法用。这时候就需要累积:把多个脉冲的信息合并到一起,用时间换信噪比。
1.2 累积的两种思路:相参与非相参的本源区别
累积的基本思想是:目标回波在多个脉冲之间是有相关性的,而噪声在不同脉冲之间是不相关的,通过合并多个脉冲,可以把目标信号的能量集中起来,同时让噪声被平均掉,从而实现信噪比提升。
但“合并”的方式有两种截然不同的路径。相参累积发生在包络检波之前,是在 I/Q 复信号域直接做幅度和相位的同时叠加。因为目标回波的相位在脉冲之间是确定演变的(通常由多普勒频率决定),只要你知道或能补偿这个相位,就能让 N 个脉冲的信号幅度同相相加,信号幅度变成原来的 N 倍,信号功率变成 N² 倍;而噪声的功率只按 N 倍增长(因为噪声相位随机,功率叠加是线性的)。所以相参累积后信噪比改善为 N 倍,换算成分贝就是 10log10(N) dB。
非相参累积发生在包络检波之后,这时候相位信息已经丢掉了,只剩下幅度或功率。你在视频域把 N 个脉冲的包络或者功率加起来,信号功率是 N² 倍(因为都是正数,同向累加),噪声功率也近似 N 倍,但这里有个关键区别——包络检波本身会引入非线性,而且噪声包络不是高斯分布了,累积完的等效信噪比改善达不到理想的 N 倍,通常是 N 的 0.7 到 0.9 次方左右,取决于 N 和检测条件。这个差距就叫“检波损耗”或“累积损耗”。
我用一个生活化的类比帮大家记:相参累积就像一队人抬大石头,大家步调一致喊号子,力量全往一个方向使,效率最高;非相参累积就像一群人各自搬砖,每个人出力方向不完全一致,但是数量多了总能搬完,胜在不需要协调、谁都能干。
2. 理论建模与检测概率公式——仿真前必须搞清楚的数学底子
2.1 信号模型与噪声设定
仿真第一步是建立信号模型。一个典型的脉冲雷达回波,经过正交下变频和匹配滤波之后,基带复信号可以写成:
s(t) = A exp(j(2πfd·t + φ0)) + n(t)
其中 A 是回波幅度,fd 是目标多普勒频率,φ0 是初始相位,n(t) 是复高斯白噪声,实部和虚部独立同分布,均值为零,方差为 σ²。单脉冲信噪比 SNR_1 = A² / (2σ²)。
在仿真里,所有累积的起点都是这个复信号序列。相参累积处理的是复数序列本身,非相参累积处理的是它的模值或模平方。这两个分支的数学工具完全不同,下面分别展开。
2.2 相参累积的检测概率计算
相参累积在数学上非常简单:假设你对 N 个脉冲进行了理想的相位补偿(即多普勒频率已知且被精确补偿),那么累积后的信噪比就是 SNR_N = N × SNR_1。检测概率可以用马库姆 Q 函数直接算:
Pd = Q(√(2·N·SNR_1), √(-2·ln(Pfa)))
其中外面的 Q 是一阶马库姆 Q 函数,第一个参数是累积后的信号幅度,第二个参数是门限。这里要注意的是,马库姆函数里用的 SNR 是功率比,而且是复信号域的功率比。很多新手在代入公式时搞错 SNR 定义,导致算出来的检测概率对不上。
举个例子:假设单脉冲 SNR 是 6 dB(即功率比约 4),Pfa = 10^-6。单脉冲情况下 Pd 大概只有 0.35。如果做 16 个脉冲的相参累积,SNR 变成 16 × 4 = 64,也就是 18 dB,这时的 Pd 已经超过 0.999。这就是相参累积的威力——每增加 3 dB 累积增益,检测性能就跨一大步。
2.3 非相参累积的等效信噪比与 Albersheim 经验公式
非相参累积的精确检测概率计算要复杂得多。因为包络检波之后,噪声包络服从瑞利分布,信号加噪声的包络服从莱斯分布,N 个这样的随机变量相加,分布函数没有闭式表达式,只能数值积分或者用近似公式。工程上最常用的近似是 Albersheim 经验公式:
SNR_N(dB) = α(N, Pd) + β(N, Pfa)
具体形式是:
SNR_N = -5·log10(N) + [6.2 + 4.54/√(N+0.44)]·log10(A + 0.12·A·B + 1.7·B)
其中 A = ln(0.62 / Pfa),B = ln(Pd / (1 - Pd))。这个公式在 Pfa 从 10^-3 到 10^-7、Pd 从 0.1 到 0.9 的范围内误差小于 0.2 dB,是仿真验证时非常好用的对标工具。
从公式可以看出,非相参累积的增益不是严格的 10log10(N),而是有一个损耗因子。实际算一下会发现:N = 16 时,理论相参增益是 12 dB,但非相参累积的等效增益大概只有 10.5 到 11 dB,损失了 1 到 1.5 dB;N = 100 时,相参增益是 20 dB,非相参大概只有 17 dB 左右。这个损耗随着 N 增大而增大,所以不能想当然地把非相参累积增益当成理想值。
2.4 为什么不能用“功率直接相加”来近似非相参累积
我见过不少仿真代码,把非相参累积直接写成把所有脉冲的功率谱相加,然后用 SNR_total = N × SNR_1 去算检测概率。这在理论上是有问题的。原因是包络检波引入了非线性变换,信号和噪声的相互作用不再是简单的线性叠加,噪声项里会带有信号乘噪声的交叉项。尤其是低信噪比场景下,这种近似会严重高估检测性能,仿真出来的 Pd 虚高,一到外场实测就露馅。
正确的做法是:要么用蒙特卡洛仿真统计出真实的检测概率,要么用 Albersheim 公式或查表获得等效信噪比,再代入单脉冲公式。我在仿真里通常两种方法都做——先用 Albersheim 公式算一遍理论曲线,再用蒙特卡洛验证,两边对得上才敢把结果交给下一级。
3. 仿真设计与核心代码实现——从参数设定到蒙特卡洛统计的完整过程
3.1 仿真场景参数怎么定
仿真不是上来就写代码,先把场景参数定清楚。我做了一个典型的中程警戒雷达检测场景,参数如下表:
| 参数 | 数值 | 说明 |
|---|---|---|
| 载频 fc | 3 GHz | S 波段 |
| 脉冲宽度 τ | 10 μs | 决定距离分辨率 |
| 脉冲重复频率 PRF | 1000 Hz | 决定最大无模糊距离/多普勒 |
| 相干处理脉冲数 N | 16 | 相参与非相参累计统一用这个数 |
| 单脉冲信噪比 SNR_1 | 0 ~ 15 dB(扫描) | 用来画出检测性能曲线 |
| 目标多普勒频率 fd | 200 Hz | 对应径向速度约 10 m/s |
| 虚警概率 Pfa | 10^-6 | 系统指标 |
| 蒙特卡洛次数 | 10^5 | 保证统计精度 |
这套参数比较常规。选 N = 16 是因为它在仿真中既有代表性又不至于让计算量太大,而且 16 是 2 的整数次幂,方便用 FFT 做多普勒滤波器组来验证相参累积的结果。
3.2 相参累积的核心代码实现
相参累积的仿真核心:生成 N 个脉冲的复基带回波,叠加复高斯白噪声,然后直接把 N 个脉冲的复数据相加(理想相位补偿情况下),再做幅度检测。代码如下:
%% 参数初始化 clear; clc; rng(2024); % 固定随机种子,保证可复现 fc = 3e9; % 载频 3 GHz prf = 1000; % 脉冲重复频率 1000 Hz N = 16; % 累积脉冲数 fd = 200; % 多普勒频率 200 Hz Ts = 1 / prf; % 脉冲重复周期 Pfa = 1e-6; % 虚警概率 snr_dB = 6; % 单脉冲信噪比 6 dB snr_lin = db2pow(snr_dB); % 转线性值 A = sqrt(2 * snr_lin); % 信号幅度(噪声功率设为1) %% 生成 N 个脉冲的复基带信号(简化模型:每个脉冲取一个采样点) phase = 2 * pi * fd * (0:N-1) * Ts; % 各脉冲的相位演变 s = A * exp(1j * phase); % 理想回波复包络 noise = (randn(1, N) + 1j * randn(1, N)) / sqrt(2); % 复高斯白噪声,功率为1 x = s + noise; % 接收信号 %% 相参累积(理想相位补偿后直接相加) x_coh = sum(x); % 复信号域直接相加 det_coh = abs(x_coh)^2; % 累积后取功率 %% 检测门限(Pfa=1e-6,噪声功率为1,复信号域) % 相参累积后噪声为复高斯,功率为 N % 门限 = N * (-2 * ln(Pfa)) 的推导见正文 threshold_coh = N * (-2 * log(Pfa)); %% 判决 if det_coh > threshold_coh disp('相参累积:检测到目标'); else disp('相参累积:未检测到目标'); end这段代码是单次快照的演示。实际蒙特卡洛统计时要把“生成信号—累积—判决”循环 M 次,统计超过门限的次数占比就是 Pd。注意门限公式里乘了 N,因为是 N 个复数相加后噪声功率变为原来的 N 倍。
3.3 非相参累积的核心代码实现
非相参累积的代码差异主要在两点:一是取包络(abs)或功率(abs 的平方),二是在包络域设置门限。平方率检波情况下,N 个噪声包络平方之和服从自由度为 2N 的中心卡方分布,门限是:
threshold_env = chi2inv(1 - Pfa, 2*N) / 2
对应的代码段如下:
%% 非相参累积(平方率检波 + N 个脉冲累积) x_env_sq = abs(x).^2; % 每个脉冲取功率 x_noncoh = sum(x_env_sq); % 功率域直接相加 %% 检测门限(平方率检波 + N 个脉冲) % 噪声功率为1,自由度为2N的中心卡方分布 threshold_noncoh = chi2inv(1 - Pfa, 2*N) / 2; %% 判决 if x_noncoh > threshold_noncoh disp('非相参累积:检测到目标'); else disp('非相参累积:未检测到目标'); end这里有个容易踩坑的地方:线性检波(取模后相加)和平方率检波(取模平方后相加)的门限分布不一样。线性检波时噪声包络服从瑞利分布,N 个瑞利变量相加没有闭式分布,只能数值求;平方率检波正好对应卡方分布,工程上又好算又常用,所以仿真里我默认用平方率检波。如果你更习惯用 abs() 而不是 abs().^2,门限计算方法就完全不同,千万别混着用。
3.4 蒙特卡洛统计检测概率的完整流程
单次判决没有统计意义,必须跑蒙特卡洛。我一般这样组织仿真流程:
第一步,在给定 SNR_1 下循环 M 次(我习惯用 10^5 次),每一次都重新生成信号和噪声;第二步,分别计算相参累积和非相参累积的检测统计量;第三步,判断是否超过各自门限,记录命中次数;第四步,M 次结束后,命中次数除以 M 就是该 SNR 下的 Pd;第五步,把 SNR_1 从 0 扫到 15 dB,得到整条检测概率曲线。
完整框架如下:
%% 蒙特卡洛检测概率统计 M = 1e5; % 蒙特卡洛次数 snr_vec = 0:1:15; % 单脉冲SNR扫描范围 Pd_coh = zeros(size(snr_vec)); Pd_noncoh = zeros(size(snr_vec)); for k = 1:length(snr_vec) snr_lin = db2pow(snr_vec(k)); A = sqrt(2 * snr_lin); hits_coh = 0; hits_noncoh = 0; for m = 1:M phase = 2 * pi * fd * (0:N-1) * Ts; s = A * exp(1j * phase); noise = (randn(1, N) + 1j * randn(1, N)) / sqrt(2); x = s + noise; % 相参累积判决 x_coh = sum(x); if abs(x_coh)^2 > threshold_coh hits_coh = hits_coh + 1; end % 非相参累积判决 x_noncoh = sum(abs(x).^2); if x_noncoh > threshold_noncoh hits_noncoh = hits_noncoh + 1; end end Pd_coh(k) = hits_coh / M; Pd_noncoh(k) = hits_noncoh / M; end跑完这组数据,把两条 Pd-SNR 曲线画出来,就能直观看到非相参和相参的性能差距。我的实测结果是:在 Pd = 0.9 的位置上,16 脉冲相参累积比 16 脉冲非相参累积大约好 1.2 到 1.5 dB,跟理论预期吻合。
4. 仿真结果解读与工程实现中的折中策略
4.1 检测概率曲线怎么读
仿真实测画出来的典型曲线有三个特征值得注意。
第一,单脉冲曲线在低 SNR 区域非常平缓,从 Pd = 0.1 到 Pd = 0.9 要跨越大约 8 到 10 dB;相参累积曲线的过渡带明显变陡,说明性能提升不但来自整体信噪比右移,还来自检测统计量分布的“锐化”。第二,两条累积曲线在低 SNR 区域几乎重合,这个现象很多人不理解——其实是因为低信噪比时包络检波损耗很小,非相参累积的等效增益接近相参;信噪比越高,非线性损耗越明显,曲线才开始分开。第三,相参累积曲线在 Pd 接近 1 时快速饱和,而非相参累积会拖一条“长尾巴”,在高 SNR 下依然存在少量漏检。
这几条曲线就是整个仿真的核心交付物。如果你跑的曲线出现明显异常——比如非相参累积反而比相参还好——基本可以断定代码里门限或者检波方式出了问题。
4.2 处理增益的“含金量”:相参有前提,非相参更鲁棒
很多人看了上面的结果,会觉得“相参累积全面碾压,那还做什么非相参”。这种想法在实际工程里要不得,因为相参累积有一个严苛前提:相位必须对齐。在前面的仿真里,我假设目标多普勒频率精确已知,相位被完美补偿。但实际系统中,目标速度是未知的,多普勒频率也是未知的。如果你直接拿 N 个脉冲的原始数据相加,目标回波的相位在不同脉冲之间是旋转的,累加的结果可能相互抵消——尤其是当 fd 接近 PRF 的整数倍时,N 个脉冲的信号相位均匀分布在 0 到 2π 之间,累加后信号幅度趋近于零,检测性能比单脉冲还差。
工程上的解决办法是用多普勒滤波器组,也就是对 N 个脉冲做 FFT,把回波按多普勒频率分到 N 个通道里,每个通道等效于补偿了该通道对应的相位,再做相参累积。这就是 MTD(Moving Target Detection)的核心原理。代价是需要付出额外的计算量,并且目标多普勒频率落在两个滤波器之间时会有跨越损失(通常 1 到 2 dB)。
非相参累积没有这个问题,因为幅度相加不依赖相位。所以实际雷达系统里,通常的做法是先用相参处理把多普勒维分辨出来、获得相参增益,再用非相参累积把多个通道或多次扫描的结果进一步合并,弥补相参处理在不同通道之间可能引入的损失。
4.3 实际信号处理链中是怎么串起来用的
一个典型的脉冲多普勒雷达检测链路是这样的:回波经过脉冲压缩之后,做 MTD——即对一组 N 个脉冲做加窗 FFT,得到每个距离单元在不同多普勒通道上的相参累积结果;然后对每个多普勒通道做恒虚警检测(CFAR);如果系统还有扫描间累积的需求,再把多次扫描的 CFAR 输出或幅度图做非相参累积,进一步压低虚警、提升稳定检测概率。
仿真时把这个链路拆成两步很有必要:先单独验证相参处理模块的增益是否达到理论值;再单独验证非相参累积在不同快慢起伏目标模型下的表现。两个模块分别达标后,再联调。我做仿真时习惯在链路的每一级都设置一个监测点——比如在 MTD 输出端打印该距离-多普勒单元的 SNR,在 CFAR 输出端统计虚警率——这样一旦结果不对,能快速定位是哪个模块引入的问题。
5. 常见问题与排查技巧实录
5.1 门限设置错误:虚警概率的定义没搞清
这是仿真里最普遍的错误。很多朋友直接把门限设成“噪声功率的某个倍数”,比如 3 倍、4 倍,然后就说虚警概率是多少——这是不对的。Pfa 的定义是“噪声超过门限的概率”,必须从噪声概率分布去反推门限。对于复高斯白噪声的功率检测,门限和 Pfa 的关系是 Pfa = exp(-threshold / noise_power),所以 threshold = -noise_power × ln(Pfa)。公式本身很简单,但如果你忘了把门限里的噪声功率乘进去,或者把 Pfa 和漏警率搞混,仿真曲线的形态就会完全走形。
排查技巧:先跑一个纯噪声的仿真(不叠加任何信号),统计超过门限的频率。如果这个统计值偏离你设定的 Pfa 超过一个数量级,门限公式一定有问题。这个自检步骤在正式跑 Pd 曲线之前一定要做。
5.2 “伪相参累积”:相位没补偿就硬加
还有一种情况是代码里确实把 N 个复数相加了,但目标信号本身是多普勒信号,每个脉冲的相位在旋转。如果直接相加,信噪比不但不提升,还可能出现负增益。我之前遇到过一位朋友写的目标检测程序,N 设得越大性能越差,查了半天最后发现问题就出在这里——他压根没对多普勒相位做补偿,所谓的“相参累积”实际上是在做随机相位叠加。
解决方法是先对目标可能的径向速度范围做搜索,用一组不同频率的复指数对 N 个脉冲做相关,这等价于 FFT 滤波器组。在仿真里可以用一个简化的验证方法:把目标多普勒频率设成 0,再跑累积,如果性能提升符合理论值,说明累积逻辑没问题;然后把多普勒频率设成非零,用 FFT 处理,看看峰值是否出现在对应的多普勒通道。
5.3 起伏目标模型没引入,仿真结果过于乐观
前面所有仿真都假设目标回波幅度恒定,也就是“斯威林 0”模型。但真实目标通常存在起伏,最常见的斯威林 1 模型是慢起伏——在一个相干处理间隔内幅度恒定,但不同扫描之间幅度独立随机,服从瑞利分布。仿真时只需要把信号幅度 A 从常数改成一个服从瑞利分布的随机变量,你就会发现检测性能明显下降,达到相同 Pd 需要的 SNR 大约要多 3 到 5 dB。
引入起伏模型后,蒙特卡洛的收敛速度会变慢。因为大幅度的目标回波在少数样本里主导了检测统计量,导致 Pd 估计值的方差变大。我建议起伏模型下把蒙特卡洛次数提高到 10^6 量级,并且每跑完一次都画一下 Pd 的收敛曲线,确认统计量稳定了再继续。
5.4 累积脉冲数不是越多越好
仿真调参时很容易陷入一个误区:为了提高检测概率,不断增加累积脉冲数。增加了 N,相参增益确实按 10log10(N) 提升,但与此同时你又引入了两个新问题:一是距离走动——目标在累积时间内跨过了不止一个距离单元,相参累积的相位假设失效;二是目标起伏——在较长的累积时间内,目标回波幅度可能发生显著变化,快起伏目标(斯威林 2)下累积效率进一步下降。
我在仿真中确定 N 的做法是:先算出允许的最大相干处理时间,用“目标最大径向速度 × 累积时间 < 距离分辨率的四分之一”来约束,保证目标不会跨距离单元;然后在这个上限内选择满足检测指标的最小 N。这个“够用就好”的原则,比一味堆脉冲数要务实得多。
最后分享一个我做这类仿真多年养成的习惯:每一个模块都会单独写一个验证脚本,先跟理论值对齐再接入主链路。相参累积对理论值,非相参累积用 Albersheim 公式对理论值,对齐了再往下走。虽然前期多花一点时间,但后期联调时省下的时间是以“天”为单位的。遇到检测性能不对的情况,先别急着怀疑算法,从门限公式开始逐级排查,多半问题就出在那些你自以为“肯定没问题”的细节上。