☰
频谱感知三大检测器:能量检测、匹配滤波与循环平稳特征检测
2026/10/24 8:31:50 网站建设 项目流程

简介:面向认知无线电与无线通信课程学习者的频谱感知算法仿真素材,聚焦能量检测、匹配滤波检测与循环平稳特征检测三种经典方法的性能对比。压缩包共3个文件,均为Matlab脚本(.m),体积约3KB,分别对应三类检测器,便于在统一框架下修改信噪比、阈值等参数并复现误检率与漏检率的测试流程。已有723人学习,说明其适合作为课堂实验、课程设计或算法入门的对照材料。读者可据此理解各算法的先验知识要求、计算复杂度与低信噪比下的表现差异:能量检测实现简单但易受噪声影响,匹配滤波在已知模板时性能更佳,循环平稳检测则擅长利用信号的周期统计特征。三份脚本体量轻、结构直接,适合快速跑通仿真并在此基础上扩展对比实验,也能为认知无线电频谱决策与感知策略选择提供可操作的参考。

1. 频谱感知的悖论:检测器越简单,越难用好

先说一个容易被忽略的现象:在频谱感知的 Matlab 仿真里,能量检测的实现往往只有五六行代码,却经常在复现时对不上参考曲线;而匹配滤波检测的理论公式更漂亮,一旦换到实测信号上,性能直接掉下来。这不是仿真技巧的问题,而是三种检测器分别在“利用什么信息”上做了根本不同的取舍——能量检测只关注功率,匹配滤波要求知道波形,循环平稳特征检测则依赖信号的周期结构。理解这三条路线各自的增益来源和失效条件,比单纯画出 ROC 曲线更有价值。本文就沿着“统计量怎么构造 → 门限怎么定 → 性能为什么是这样”这条线,把频谱感知的底层机制拆开。

2. 能量检测:一次平方求和凭什么能判决出“有人占频”

2.1 从 H0/H1 到判决统计量

频谱感知本质上是一个二元假设检验问题。次用户接收到的采样序列 y[n] 只有两种状态:主用户不在,只有噪声;或者主用户在工作,接收信号是信号叠加噪声。

用最朴素的实信号模型写出来:

  • H0:y[n] = w[n]
  • H1:y[n] = s[n] + w[n]

其中 w[n] 是均值为零、方差为 σ² 的高斯白噪声。能量检测做的事情简单到令人怀疑:把 N 个采样点平方求和再取平均,得到统计量

T = (1/N) · Σ y[n]²

这个统计量的物理含义就是“观测窗口内的平均功率”。判决规则只有一条:T 超过门限 λ,就认为主用户存在。

它之所以能工作,是因为在两种假设下 T 的分布不同。在 H0 下,T 的期望是 σ²,方差是 2σ⁴/N;在 H1 下,期望上升到 σ²(1+γ),方差变成 2σ⁴(1+γ)²/N,其中 γ 是线性信噪比。两个分布的均值被 γσ² 这个间距拉开,当 N 足够大时,中心极限定理让 T 逼近高斯分布,两个分布的重叠区域随着 N 增大而收窄,判决就变得可靠。

这里有一条容易被轻视的结论:能量检测的全部信息量都压在“功率差”这一个维度上。它不关心信号长什么样、在哪个频点、有没有结构,只关心“这里比以前更响”。这个设计的优点是对信号类型完全不敏感——无论是窄带、宽带、连续还是突发,只要能抬升功率就一定能检测到;代价是所有基于功率的脆弱性都会原样继承下来。

2.2 门限反解与 CFAR:为什么固定 Pf 就等于固定门限

能量检测最值得仔细探讨的设计,是门限的确定方式。给定一个可接受的虚警率 Pf,门限不再是拍脑袋定的,而是从 H0 分布反解出来的。

在 H0 下 T 近似服从 N(σ², 2σ⁴/N),所以

Pf = Q( (λ − σ²) / (σ² · √(2/N)) ) = Q( (λ/σ² − 1) · √(N/2) )

把 Q 的反函数挪过去,门限就显式地写成了

λ = σ² · ( 1 + √(2/N) · Q⁻¹(Pf) )

这个式子里藏着两个关键信息。第一,门限正比于噪声功率 σ²——噪声大一倍,门限就跟着大一倍,虚警率保持不变。这就是恒虚警率(CFAR)这个名称的来源:判决门限自适应地跟着噪声水平缩放,从而把 Pf 固定住。第二,门限只依赖 N 和 Pf,完全不依赖信噪比 γ。这意味着你在不知道主用户信号强弱的情况下,也能先把虚警率固定在目标值上。

这既是它最大的优点,也是最大的隐患。CFAR 的成立有一个未明说的前提——σ² 是已知的。一旦噪声功率估计有偏差,门限就跟着偏,虚警率会以指数级的敏感度偏离目标。这个隐患在后面的 SNR wall 里会变成一个绕不过去的限制。

注意:很多仿真代码里直接写lambda = sigma2*(1 + sqrt(2/N)*qfuncinv(Pf)),这个写法默认用的是实高斯噪声模型。如果换成复基带信号,T 的方差会从 2σ⁴/N 变成 σ⁴/N,门限系数要相应改成 √(1/N),否则虚警率会系统性偏离一倍以上。

2.3 N 和 SNR 可以互相兑换:采样点数怎么定

能量检测的另一个重要性质是:采样点数 N 和信噪比 γ 可以互相兑换。在同样的 Pf 下,只要把 N 拉长,就能把更低的 γ 检测出来。

把 H1 的分布代入,可以得到检测概率的解析近似:

Pd = Q( ( Q⁻¹(Pf) − γ·√(N/2) ) / (1 + γ) )

令 Pd 等于目标值反解 N,得到设计公式

N ≈ 2 · [ ( Q⁻¹(Pf) − (1+γ)·Q⁻¹(Pd) ) / γ ]²

这个公式的实际意义非常直接。取 Pf = 0.1、Pd = 0.9,Q⁻¹(0.1) ≈ 1.2816,Q⁻¹(0.9) ≈ −1.2816:

  • γ = −10 dB(即 0.1)时,N ≈ 1449 个采样点;
  • γ = −20 dB(即 0.01)时,N ≈ 132715 个采样点。

信噪比掉 10 dB,所需采样点数涨了将近两个数量级。这个数字上的结论比任何定性描述都更有说服力:能量检测在低信噪比下的代价是线性增长的观测时间,而观测时间在动态频谱接入场景里是有上限的——你不可能为了判一次占用状态,在一个信道上停留几十毫秒。

下面的仿真代码把前面的推导完整跑了一遍,用的是实信号模型,并且把理论 Pd 一起返回,方便直接和蒙特卡洛结果对照。

function [Pd_sim, Pf_sim, Pd_th] = energyDetect(Pf, N, snr_dB, M) % 实信号模型:H0 y=w, H1 y=sqrt(gamma)*s+w, w ~ N(0, sigma2) sigma2 = 1; gamma = 10^(snr_dB/10); n = (0:N-1).'; s = sqrt(2)*cos(2*pi*0.05*n); % 单位功率的确定性信号 % Q 函数及其反函数的免工具箱写法 qfun = @(x) 0.5*erfc(x/sqrt(2)); qinv = @(p) sqrt(2)*erfcinv(2*p); % CFAR 门限:Pf = Q((lambda/sigma2 - 1)*sqrt(N/2)) lambda = sigma2 * (1 + sqrt(2/N)*qinv(Pf)); cnt_h0 = 0; cnt_h1 = 0; for m = 1:M w = sqrt(sigma2)*randn(N,1); T0 = mean(w.^2); % 只有噪声 cnt_h0 = cnt_h0 + (T0 > lambda); y = sqrt(gamma*sigma2)*s + w; % 复用同一份噪声,减小蒙特卡洛方差 T1 = mean(y.^2); cnt_h1 = cnt_h1 + (T1 > lambda); end Pf_sim = cnt_h0/M; Pd_sim = cnt_h1/M; % 高斯近似下的理论检测概率 Pd_th = qfun((qinv(Pf) - gamma*sqrt(N/2)) / (1 + gamma)); end

代码里有两个变量是核心参数。lambda完全由Pf、N、sigma2决定,与snr_dB无关,这就是 CFAR 的直接体现;gamma只影响 H1 下的数据生成和理论曲线,不参与门限计算。跑这段代码时,把snr_dB设为 −10、N设为 1500,Pd_sim应该落在 0.9 附近;如果把sigma2改成 1.05 但门限还按 1 算,Pf_sim会立刻偏离到 0.3 以上——这个实验比看十遍公式更能理解噪声不确定度的杀伤力。

2.4 SNR wall:噪声不确定度为什么是一堵硬墙

前面说 CFAR 的前提是 σ² 已知,现实里这个前提基本不成立。接收机前端增益漂移、温度变化、量化噪声、邻近信道的干扰泄漏,都会让真实的噪声功率和你估计的值存在偏差。工程上常用一个不确定度因子 ρ 来描述:真实噪声功率落在 [σ²/ρ, ρσ²] 区间内。

为了在最坏情况下仍守住 Pf,门限必须按可能的最大噪声功率来定,也就是 λ 要乘上 ρ。但门限抬高之后,H1 下统计量的均值 σ²(1+γ) 就必须越过这道更高的门限。当代入推导后会发现:当 γ 小到某个临界值以下时,无论 N 增加到多少,Pd 都无法达标——分母里的 γ 和分子里的 ρ−1 项互相拉扯,N → ∞ 时 Pd 收敛到一个小于目标值的极限。

这个临界值就是 SNR wall,粗略地说它出现在 γ ≈ ρ − 1 附近。ρ = 1.26(约 1 dB 的噪声不确定度)对应的墙在 −5.8 dB 左右。也就是说,只要噪声估计有 1 dB 的误差,能量检测在 −6 dB 以下就彻底失效,再怎么加采样点都没用。

这是能量检测最容易被低估的结论。它说明性能的瓶颈不是算力、不是采样率,而是对噪声功率的先验认知精度。要突破这堵墙,只有两条路:要么想办法把噪声功率估计得更准,要么换成不依赖噪声功率绝对值的检测器——这正是后两种检测器存在的理由。

3. 匹配滤波检测:相干增益 3 dB 从哪来,代价又是什么

3.1 相关器与匹配滤波器:从柯西–施瓦茨不等式看增益上限

匹配滤波检测换了一个思路:既然已知主用户信号的波形 s[n],那就别只看能量,而是把接收信号和已知波形做相关。

统计量写成

T = | Σ y[n] · s[n] |² / (σ² · Es)

其中 Es = Σ s[n]² 是已知波形的能量。这个式子的结构是“先相乘再求和”,乘的过程把每个采样点上与 s[n] 同相位的信号分量挑出来,求和的过程把这些分量相干叠加。

为什么这个结构是最优的?用柯西–施瓦茨不等式可以直接看出来:对于任意线性滤波器,输出在某一时刻的信噪比,其上界由滤波器系数与信号波形“同向”时取得——也就是说,最优滤波器的冲激响应必须是信号波形的时间反转共轭。匹配滤波这个名字就是从这个“匹配”来的,它不是一种工程近似,而是线性滤波框架下的理论上界。

增益的来源也就清楚了。噪声在 N 个采样点上是独立的,求和后幅度只按 √N 增长;而信号是相干的,求和后幅度按 N 增长。所以输出信噪比相对输入提升了 N 倍,折算成 dB 就是 10·log₁₀(N)。N = 100 时约 20 dB,这是相干积累的全部收益。

3.2 增益的真实数值,以及它在什么条件下会消失

前面那段推导听起来很美好,但要落到实际的频谱感知场景,必须问一个问题:这个 N 倍的增益,和能量检测相比到底差多少?

拿具体数字算。在 Pf = 0.1 下,匹配滤波的统计量在 H0 下服从自由度为 1 的卡方分布(实信号、单次相关),门限由 Pf = 2Q(√λ) 决定,得到 λ = 2·[erfcinv(Pf)]² ≈ 2.706。在 H1 下,归一化后的相关值服从均值为 √(γN)、方差为 1 的高斯分布。要 Pd = 0.9,需要 √(γN) − 1.645 = 1.2816,即 γN ≈ 8.57。N = 100 时 γ ≈ 0.0857,也就是 −10.7 dB。

对比上一节:同样 N = 100、Pf = 0.1、Pd = 0.9,能量检测需要 γ ≈ −3.5 dB。两者的差距约 7 dB。这个数字不是巧合——它来自“相干”与“非相干”的本质区别:匹配滤波把相位信息用上了,能量检测把相位信息扔掉了,扔掉的那部分就是性能差。

但匹配滤波的这 7 dB 有一条很严格的附加条件:s[n] 必须是已知的。这里说的“已知”包括四件事:波形形状、载波相位、符号定时、信道响应(至少是相位)。这四项里有任何一项失配,相干求和的收益就会按失配程度的余弦平方衰减。相位偏差 60°,幅度就掉一半,等效于损失 3 dB 以上;如果相位完全未知,匹配滤波退化成一个非相干检测器,增益大部分消失。

工程上的现实是:在主用户发射机不愿意配合、次用户又不掌握导频序列的情况下,这四项没有一项是白送的。所以匹配滤波在理论上界上很美,在认知无线电的实际部署里往往只在特定场景下可用,比如主用户有公开的已知前导码、且次用户可以完成定时同步。

3.3 仿真实现:两个必须对齐的量

写匹配滤波的仿真时,最容易犯的错误不是公式写错,而是仿真里“偷偷”对齐了现实中难以对齐的量。下面这段代码里,s在接收端和发送端是同一个向量,定时和相位天然对齐,这相当于给了检测器一个现实中拿不到的先验。

function [Pd, Pf] = matchedFilterSim(Pf, N, snr_dB, M) sigma2 = 1; gamma = 10^(snr_dB/10); n = (0:N-1).'; s = sin(2*pi*0.07*n); % 已知波形(导频 / 前导码) Es = sum(s.^2); % H0 下 T ~ chi2(1),右尾概率为 Pf 的分位点 lambda = 2 * (erfcinv(Pf))^2; Pf_cnt = 0; Pd_cnt = 0; for m = 1:M w = sqrt(sigma2)*randn(N,1); T0 = (sum(w.*s))^2 / (sigma2*Es); % 只有噪声时的相关输出 Pf_cnt = Pf_cnt + (T0 > lambda); y = sqrt(gamma*sigma2)*s + w; T1 = (sum(y.*s))^2 / (sigma2*Es); % 信号加噪声 Pd_cnt = Pd_cnt + (T1 > lambda); end Pf = Pf_cnt/M; Pd = Pd_cnt/M; end

lambda的表达式来自 H0 下 T 的分布:Z = Σ w·s / √(σ²Es) 服从标准正态,T = Z² 服从卡方(1),右尾概率 Pf = 2Q(√λ),反解得到 √λ = Q⁻¹(Pf/2) = √2·erfcinv(Pf),平方就是代码里那一行。

要做失配实验,最直接的做法是在y的生成里插入一个相位旋转y = sqrt(gamma*sigma2)*s*exp(1j*phi) + w(对应的实部模型或复数模型要统一),然后让 phi 从 0 扫到 π,观察 Pd 随 cos²(phi) 的退化。这个实验做一遍,比任何文字描述都更能理解“相干”两个字的重量。

4. 循环平稳特征检测:从功率谱走到循环谱,为什么能绕开噪声

4.1 平稳噪声在 α ≠ 0 处为什么会“消失”

循环平稳特征检测的出发点,是对前两种方法共同弱点的一次正面回应。能量检测受制于噪声功率的不确定度,匹配滤波受制于波形先验的获取难度,而循环平稳检测选择利用一个通信信号几乎必然具备、噪声却几乎必然不具备的性质:统计特性的周期性。

通信信号在生成过程中被反复“调制”过:脉冲成形、符号速率、载波调制、过采样,每一个环节都在信号里留下了周期性的痕迹。用数学语言说,这类信号的时变自相关函数 R_x(t, τ) = E[x(t+τ/2)·x*(t−τ/2)] 是时间 t 的周期函数,周期由符号率或载频决定。既然是周期函数,就可以展开成傅里叶级数:

R_x(t, τ) = Σ_α R_x^α(τ) · e^{j2παt}

其中的傅里叶系数 R_x^α(τ) 就是循环自相关函数,α 称为循环频率。

关键的一步在于噪声。平稳噪声的自相关函数与 t 无关,它在傅里叶级数展开里只对应 α = 0 那一项。换句话说,对于任何 α ≠ 0,平稳噪声的循环自相关在理论上严格为零。

这个性质的意义非同小可。能量检测的门限必须跟着噪声功率走,所以噪声功率估不准就全盘皆输;而循环平稳检测是把判决建立在 α ≠ 0 的坐标上,在那个坐标里噪声的期望贡献是零,噪声功率的大小根本不进入判决式。SNR wall 这堵墙,在这里被绕过去了。

4.2 循环自相关的估计:时域平滑与频域平滑两条路线

理论上的 R_x^α(τ) 是一个期望值,实际只能从有限长度的采样里估计。最直接的估计方式是时域平滑:

R̂_x^α(τ) = (1/N) · Σ_n x[n+τ] · x*[n] · e^{−j2παn}

把 x[n+τ]·x*[n] 这个乘积序列先算出来,再乘以一个复指数把它“搬移”到零频,最后求平均。这个复指数项的作用,本质上是把候选循环频率 α 上的周期分量从时域里挑出来。

另一条路线是频域平滑,也就是先算循环周期图,再在频率轴上做滑动平均。频域平滑的好处是可以一次性得到整个 (α, f) 平面上的循环谱,用 FFT 把复杂度从 O(N²) 压到 O(N log N) 量级;代价是需要处理频率分辨率和平滑窗宽度的折中——窗太窄,估计方差大;窗太宽,循环频率的分辨率被抹平。

下面的代码实现的是时域平滑版本,只扫描一组候选循环频率、固定一个时延,足以说明机制。

function [R, alpha_axis] = scanCyclic(y, alphas, tau) % 时域平滑估计循环自相关 R_y^alpha(tau) = E[y(n+tau)*y*(n)*exp(-j2*pi*alpha*n)] N = numel(y); n = (0:N-1-tau).'; alpha_axis = alphas(:); R = zeros(numel(alphas), 1); for k = 1:numel(alphas) a = alpha_axis(k); % 乘积序列乘复指数后求均值,等价于在 alpha 处做一次单点 DFT R(k) = mean( y(n+tau+1) .* conj(y(n)) .* exp(-1j*2*pi*a*n) ); end end

调用时要注意循环频率的归一化口径。如果过采样因子是sps,那么归一化到采样率的符号率循环频率就是1/sps,扫描范围应该覆盖它的整数倍:

sps = 8; % 每符号 8 个采样点 alpha0 = 1/sps; % 归一化符号率 alphas = alpha0 * (-3:0.02:3); % 覆盖 ±3 阶循环频率 R = scanCyclic(y, alphas, 0); [~, idx] = max(abs(R)); % 峰值应落在 alpha0 的整数倍附近

tau的选取也有讲究。τ = 0 时循环自相关退化为循环功率,对某些调制方式(比如 BPSK)在符号率循环频率上仍然有明显的峰;但 τ 取非零值时能提供额外的分辨能力,尤其是在多径或强干扰环境下。实际做检测时通常会在几个 τ 上做联合判决,而不是只看一个点。

4.3 复杂度与分辨率:它贵得有理,但不能滥用

循环平稳检测的性能优势是实打实的,代价同样实打实。

从计算量看,时域平滑的单点估计是 O(N),但检测需要在 K 个候选循环频率、L 个时延上联合扫描,总复杂度是 O(K·L·N)。如果直接做二维循环谱,再用 FFT 加速,复杂度能降到 O(N log N),但内存占用会随 (α, f) 平面的分辨率一起涨。在宽带频谱感知场景里,这段开销往往比前两种检测器高一到两个数量级,所以它通常不作为第一道粗筛,而是作为二次确认手段。

从参数选择看,有三个量直接决定性能:采样长度 N 决定循环特征的估计方差(大致按 1/√N 收敛),平滑窗宽度决定循环频率分辨率,候选循环频率集合的覆盖范围决定你能不能命中真正的循环频率。这三者互相牵制,没有一组通用最优值,必须结合具体的调制方式和符号率来

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询