☰
协作频谱感知中的Pietra-Ricci指数检测器与集中式数据融合实现
2026/10/21 14:43:10 网站建设 项目流程

协作频谱感知这两年一直被低估,实际上它是认知无线电里最接地气的一个模块——你要让次用户知道当前频段有没有主用户在工作,绕不开“感知”这一步。而单节点感知的可靠性太差,阴影、多径、隐藏终端随便一个都能让检测概率掉下去,所以协作方案成了工程必选项。最近我一直在做一套基于Pietra-Ricci指数检测器的集中式数据融合方案,从原理到Matlab代码整套跑下来,回过头看最有价值的反而不是某个算法有多新,而是怎样把一个基于分布距离的检测统计量,融进协作感知的框架里还能保持性能稳定。

这个项目标题包含三块内容:协作频谱感知解决“听没听到主用户”的问题;集中式数据融合解决“多个节点怎么把结果汇总”的问题;Pietra-Ricci指数检测器则是每个节点用来生成检测统计量的核心工具。三块拼在一起,就是一个可以独立运行的仿真系统。这篇博文我会从原理、系统建模、Matlab实现、仿真结果、踩坑记录五个方向展开,适合正在做认知无线电课程设计、硕士论文仿真,或者想把手头能量检测器换成更鲁棒检测器的工程师参考。代码结构会尽量给全,门限标定、融合规则、蒙特卡洛循环这些关键步骤一个都不会跳过。

1. 项目定位:协作频谱感知里的数据融合要从哪入手

1.1 频谱感知到底解决什么问题

频谱感知的本质是二元假设检验:主用户(PU)在工作,还是没在工作。次用户(SU)必须在发射前确认频段空闲,否则会对主用户形成干扰。单节点感知的困境在于,一个节点听到的信号受自身位置、信道衰落和阴影遮挡影响极大。你在这个位置听得见,换个位置可能完全听不见;同一个频段,上午是深衰落,下午可能就恢复了。这种不确定性让单节点感知无论怎么调门限,都很难同时保住漏检概率和虚警概率。

协作频谱感知的思路是让多个空间分散的节点同时感知同一个频段,再把结果汇聚起来。这样做的好处是空间分集——不同节点经历的信道衰落相互独立,一个节点掉进深衰落,另一个节点大概率还站在“听力”比较好的位置。多个节点的观测相互弥补,检测可靠性自然就上去了。这也是所有实际系统最终都会走向协作的根本原因。

1.2 集中式融合架构的选型理由

协作感知的节点之间怎么交换信息,决定了整个系统的复杂度。集中式融合是最直观的一种:K个节点各自采样,然后把自己的本地统计量或者本地判决发到一个融合中心(FC,Fusion Center),由FC统一判决。节点之间不需要互相通信,FC只干一件事——把收到的信息按既定规则合并,输出“有信号”或“没有信号”。

相比分布式协作,集中式架构天然适合做“先本地判决、再中心融合”的两级处理。工程上好处也明显:协议简单、调试方便、故障点集中。缺点是对FC可靠性和带宽有一定要求,但K个节点每次只传一个标量或一个比特,这种开销在绝大多数应用场景里可以接受。所以做课程设计或者预研项目时,集中式数据融合通常是第一个落地的方案。

1.3 Pietra-Ricci检测器在这个框架里扮演什么角色

有了融合框架,还得选本地检测器。经典能量检测器实现简单,但它只统计接收信号的功率,对噪声方差非常敏感。噪声功率稍微估计不准,检测性能就往下掉。在非高斯噪声或者脉冲干扰场景下,能量检测器的表现更糟。Pietra-Ricci指数检测器走的是另一条路:它不直接看功率,而是比较“接收信号的经验概率分布”和“已知噪声的理论概率分布”之间的差异。差异足够大,说明信号大概率存在。

这个思路的本质,是把“检测问题”转成“分布距离问题”。在集中式数据融合里,每个节点算出的Pietra-Ricci统计量是一个连续标量,比硬判决保留了更多信息,非常有利于后续做成软融合。因此这套方案特别适合需要在低信噪比下保持稳健检测的场景。

2. Pietra-Ricci指数检测器原理与统计特性

2.1 Pietra-Ricci距离从哪来

Pietra-Ricci距离,有时候也叫Pietra-Ricci指数,是两个概率分布之间差异的一种度量。对连续概率密度函数 (p(x)) 和 (q(x)),它的定义是:

[ D_{PR}(p,q) = \frac{1}{2} \int_{-\infty}^{+\infty} |p(x) - q(x)| dx ]

两个分布完全相同的极端情况下,积分为0;完全不重叠的情况下,积分等于2,乘上1/2之后结果为1。所以这个量的取值永远落在0到1之间,天然适合当相似度的测度。对离散概率质量函数,它写成一串求和:

[ D_{PR}(p,q) = \frac{1}{2} \sum_{i} |p_i - q_i| ]

怎么理解?可以把两条概率密度曲线想象成两片形状不同的地图。Pietra-Ricci距离衡量的是两片地图“重叠阴影面积”的一半。如果两片地图基本重合,说明两个分布几乎一样;如果重叠部分很少,说明分布差异很大。在频谱感知里,这个差异就是信号存在与否的关键特征。

直方图分箱操作在这里起到了桥梁作用。接收样本的经验PDF通过直方图估计出来,而噪声PDF在已知方差时用理论表达式直接计算。两个PDF的差异面积就是Pietra-Ricci统计量。这个统计量的好处在于它不绑定信号的具体波形,只要是“信号+噪声”混合分布与“纯噪声”分布存在明显区别,它就能捕捉到。

2.2 检测统计量与两种假设

这个检测器把感知建模成标准的二元假设检验:

[ \begin{aligned} &\mathcal{H}_0: y[n] = w[n] \ &\mathcal{H}_1: y[n] = h \cdot s[n] + w[n] \end{aligned} ]

(y[n]) 是节点接收到的第n个样本,(s[n]) 是主用户信号,(h) 是信道增益,(w[n]) 是噪声。检测统计量定义为:

[ T_{PR} = \frac{1}{2} \int_{-\infty}^{+\infty} \left| \hat{f}_Y(x) - f_W(x) \right| dx ]

(\hat{f}_Y(x)) 是接收信号幅度的经验概率密度,(f_W(x)) 是噪声幅度的理论概率密度。在 (\mathcal{H}0) 下,接收样本就是噪声,经验PDF会和噪声理论PDF非常接近,所以 (T{PR}) 趋于一个小值;在 (\mathcal{H}1) 下,信号叠加上来改变了幅度分布的形状,经验PDF和噪声PDF拉出明显距离,(T{PR}) 变大。

门限判决规则写成:

[ T_{PR} \gtrless_{\mathcal{H}_0}^{\mathcal{H}_1} \lambda ]

这个 (\lambda) 不能拍脑袋定,通常用目标虚警概率 (P_{fa}) 反推。不过 (T_{PR}) 在 (\mathcal{H}0) 下的解析分布不容易直接写出来,所以工程实现里更常见的方法是蒙特卡洛标定门限——先跑大量纯噪声样本,把统计量的经验分布累积出来,再取 (1-P{fa}) 分位点作为门限。后面Matlab部分我会给出具体实现。

2.3 和能量检测器、KS检测器的比较

为了说清楚Pietra-Ricci检测器的价值,把它和两个最常见的检测器放在一起对比。

检测器统计量含义优点典型不足
能量检测器接收信号平均功率实现简单、计算量低对噪声方差误差敏感
KS检测器经验CDF与理论CDF的最大偏差非参数、稳健只关注最大偏差,忽略整体分布形状
Pietra-Ricci检测器经验PDF与理论PDF的总差异利用整体分布差异、抗噪声方差失配能力较强直方图参数影响统计量

能量检测器的统计量是 (\frac{1}{N}\sum |y[n]|^2),它等于是把问题压成了一个标量功率,丢失了波形分布信息。KS检测器修正了这一点,它比较的是经验累积分布函数和理论CDF之间的最大距离。但KS只看最大偏差,对分布中间区域的差异不敏感。Pietra-Ricci检测器用整个PDF曲线的差异面积来度量,三个检测器里对“分布形状变化”的利用最充分。

实际使用中要注意:如果在理想AWGN、噪声方差精确已知的前提下,能量检测器已经相当能打,Pietra-Ricci检测器未必有明显优势。但一旦噪声环境复杂,或者噪声方差估计存在偏差,Pietra-Ricci检测器的鲁棒性优势就会体现出来。这也是换检测器时最需要想清楚的问题——你究竟是为了在理想环境下刷一个更漂亮的性能数字,还是为了让系统在真实环境里更抗造。

3. 系统模型与集中式融合判决设计

3.1 单节点感知模型

建模从单节点开始。每个节点独立地采样N个点,K个节点组成协作集合。信号采用QPSK调制,样本平均功率归一化为1。噪声是零均值复高斯噪声,其实部虚部方差各占一半。信噪比和噪声方差的关系是:

[ \sigma_w^2 = \frac{P_s}{10^{SNR/10}} ]

当 (P_s=1) 时,给定信噪比后噪声方差直接得出。比如 (-10\text{dB}) 信噪比,对应的噪声方差是 0.1。注意这里的SNR是单节点接收信噪比,不是融合之后的等效信噪比。融合带来的增益不会改变每个节点的接收信噪比,它能改善的是最终判决的可靠性。

每个节点先计算本地统计量 (T_k),这里的 (k) 表示第k个节点:

[ T_k = T_{PR}(\mathbf{y}_k) ]

如果需要本地硬判决,就再套一个本地门限得到 (u_k)。硬判决适合对FC到节点之间的信道带宽要求极低的场景;软统计量则保留了更多判别信息。两种方式都需要在融合中心设计对应的合并规则。

3.2 多节点协作与集中式融合规则

K个节点把各自的 (T_k) 或 (u_k) 通过报告信道发给FC。集中式数据融合在这个位置落地。先说软融合,FC直接对统计量做合并,比较常见的有两种:

  • 等增益合并:[ T_{global} = \frac{1}{K} \sum_{k=1}^{K} T_k ]
  • 加权合并:[ T_{global} = \sum_{k=1}^{K} w_k T_k ] 权重 (w_k) 可以根据各节点信噪比、信道增益或噪声方差来设定,信噪比高的节点权重大。

再说硬融合,节点本地已把统计量二值化成 (u_k),FC按逻辑规则合并:

  • OR规则:只要有一个节点判有信号,就判有信号。漏检概率低,但虚警概率会偏高。
  • AND规则:所有节点都判有信号,才判有信号。虚警低,漏检高。
  • 半数以上规则:K个节点中超过半数判有信号,才判有信号。

我的经验是,低信噪比场景优先选软融合。原因特别朴素——硬判决在门限边缘会把“0.49还是0.51”这种细微差别抹掉,而软统计量把这些信息保留下来交给FC做更精细的合并。Pietra-Ricci统计量本身就是连续值,不做软融合实在有点浪费。

3.3 门限设计、虚警概率与检测概率

性能评估绕不开两个指标:虚警概率 (P_{fa}) 和检测概率 (P_d)。虚警概率定义成:

[ P_{fa} = \Pr(T_{global} > \lambda \mid \mathcal{H}_0) ]

检测概率定义成:

[ P_d = \Pr(T_{global} > \lambda \mid \mathcal{H}_1) ]

设计门限的标准做法是先固定一个目标 (P_{fa}),比如0.05,再去找对应的 (\lambda)。但由于 (T_{PR}) 的解析分布不好求,我的做法永远是“仿真标定门限”——把 (\mathcal{H}_0) 下的融合统计量跑几千次蒙特卡洛,累积经验分布之后用quantile函数直接取分位点。这个方法虽然费一点算力,但比用解析近似稳得多。

4. Matlab实现:从仿真框架到核心代码

4.1 仿真参数配置

我习惯把所有可能调的参数集中放在脚本头部,方便批量跑实验:

clear; clc; rng(2024); N = 1024; % 每个节点的采样点数 K = 8; % 协作节点数 numBins = 64; % 直方图分箱数 SNR_dB = -18:2:0; % 信噪比扫描范围 M = 2000; % 蒙特卡洛次数 Pfa_target = 0.05; % 目标虚警概率 Ps = 1; % 信号平均功率(归一化)

这几个参数里最需要考虑的是numBins和N的比例。分箱数太少,经验PDF太粗糙,统计量区分度变差;分箱数太多,每个bin里的样本数太少,统计量抖动变大。我一般让平均每个bin里落到的样本数在10到20之间,也就是N / numBins ≈ 10~20。N取1024,numBins取64或者128都行。

4.2 QPSK信号与复高斯噪声生成

主用户信号用QPSK,星座点比较规整:

function sig = qpsk_signal(N) const = exp(1j * (pi/4 + (0:3)' * pi/2)); idx = randi(4, N, 1); sig = const(idx); % 平均功率为1 end

复高斯噪声生成要特别注意功率分配:

function w = complex_noise(N, sigma2) % 复高斯噪声总功率为 sigma2,实部虚部各占 sigma2/2 w = sqrt(sigma2/2) * (randn(N, 1) + 1j * randn(N, 1)); end

如果把这个sqrt(sigma2/2)错写成sqrt(sigma2),噪声功率直接翻倍,整个仿真的信噪比关系就全乱了。这个错误很隐蔽,跑完结果曲线整体偏移时很难第一时间想到是功率分配写错。

4.3 Pietra-Ricci统计量的核心实现

本地统计量的实现是整个项目的关键。我建议对复信号直接取模值,再做直方图。这样经验PDF描述的是接收幅度的分布,噪声幅度理论PDF用瑞利分布:

function T = pri_statistic(y, sigma2, numBins) % y: 接收信号采样向量,可为复数 % sigma2: 噪声总功率 % numBins: 直方图分箱数 y_abs = abs(y); % 对复信号取幅度 [counts, edges] = histcounts(y_abs, numBins, 'Normalization', 'pdf'); binWidth = edges(2) - edges(1); centers = edges(1:end-1) + binWidth / 2; % 复高斯噪声的幅度服从瑞利分布,sigma = sqrt(sigma2/2) f_w = raylpdf(centers, sqrt(sigma2 / 2)); % Pietra-Ricci距离:两分布差异面积的一半 T = 0.5 * sum(abs(counts - f_w)) * binWidth; end

这里必须强调一个细节:histcounts用了'Normalization','pdf'之后,返回的counts已经是概率密度值,不是概率。所以在后面求和时一定要乘回binWidth,得到的才是真正的概率面积。漏掉这个乘回操作,统计量会偏大或偏小,门限标定也会跟着失真。

4.4 集中式融合与蒙特卡洛主循环

本地统计量算出来后,融合中心的实现很简洁:

function T_global = soft_fusion(T_local) % 等增益软融合 T_global = mean(T_local); end function U_global = hard_fusion(u_local, rule) switch rule case 'OR' U_global = any(u_local); case 'AND' U_global = all(u_local); case 'MAJ' U_global = sum(u_local) >= ceil(numel(u_local) / 2); end end

主循环分两步走。第一步标定门限,第二步计算检测概率。先跑纯噪声样本:

sigma2_ref = 0.1; % 门限标定时用的噪声功率 T0 = zeros(M, 1); for m = 1:M y0 = complex_noise(N * K, sigma2_ref); y0 = reshape(y0, N, K); T_local = zeros(K, 1); for k = 1:K T_local(k) = pri_statistic(y0(:, k), sigma2_ref, numBins); end T0(m) = soft_fusion(T_local); end lambda_soft = quantile(T0, 1 - Pfa_target);

这段代码有一个设计取舍:门限标定时噪声功率固定为sigma2_ref=0.1,对应 -10dB 信噪比的噪声功率。因为门限只应该依赖虚警概率和噪声分布,不应该随信号信噪比变化。固定噪声功率跑门限,能保证同一门限对所有信噪比公平。

第二步是MC主循环:

Pd_soft = zeros(length(SNR_dB), 1); for idx = 1:length(SNR_dB) snr = SNR_dB(idx); sigma2 = Ps / (10^(snr / 10)); det_count = 0; for m = 1:M y = complex_noise(N * K, sigma2); y = reshape(y, N, K); for k = 1:K s = qpsk_signal(N); y(:, k) = s + y(:, k); end T_local = zeros(K, 1); for k = 1:K T_local(k) = pri_statistic(y(:, k), sigma2, numBins); end if soft_fusion(T_local) > lambda_soft det_count = det_count + 1; end end Pd_soft(idx) = det_count / M; end

跑完这条主循环,就能得到一条不同信噪比下的检测概率曲线。如果还想看不同节点数的影响,把K分别设为1、4、8、16,重复上面的循环,然后画在同一张图上。

5. 仿真结果与性能对比分析

5.1 检测概率与信噪比的关系

默认参数 (N=1024, K=8, \text{numBins}=64, P_{fa}=0.05) 下,软融合观测到的基本趋势是:信噪比在 -18dB 附近时,检测概率基本贴着虚警概率走;随着信噪比上升,(P_d) 开始明显抬头;到了 -6dB 附近,(P_d) 接近1。这个趋势符合检测理论的一般规律,关键是“抬头”的位置——它反应了检测器的灵敏度。

灵敏度高低的差异在 -12dB 到 -8dB 这个区间被拉得很开。软融合在这个区间里比单节点感知有明显的提前量。单节点在 -12dB 时基本还在随机猜,融合后已经能给出一个有区分度的概率值。这正是协作感知的价值所在,它不是把每个节点都变强,而是把一堆弱观测拧成一股绳。

5.2 节点数对融合性能的影响

把K从1增加到16,能看到两个明显变化。第一个变化是曲线整体左移,也就是说达到同等检测概率所需的信噪比更低了。第二个变化是曲线的斜率变陡,虚警概率约束下的有效工作范围更宽。

K从1增加到4的收益最大,从4增加到8收益次之,从8增加到16收益边际递减。这个现象很好解释——节点数增加带来的空间分集增益不会无限累积,节点间信道相关性一旦上来,增益就饱和了。所以工程上没有必要无限堆节点,一般K取8到16已经足够,堆太多成本和复杂度都会失控。

5.3 与经典检测器的对比情况

在同样的仿真框架下,把本地统计量换成能量检测器,融合规则不变,跑一组对比。高信噪比区域两者差距不大;中低信噪比区域,Pietra-Ricci检测器有微小优势,但幅度并不夸张。主要原因是我这套仿真用的AWGN信道比较“温和”,能量检测器的主场恰恰是理想高斯环境。

场景能量检测器Pietra-Ricci检测器
理想AWGN,噪声方差精确已知优秀良好
噪声方差有10%偏差性能下滑影响较小
含脉冲干扰明显退化相对稳健
实现复杂度极低需要直方图统计

换个说法:如果你只在干净的高斯环境里做仿真,换Pietra-Ricci检测器未必能刷出漂亮数字,甚至因为直方图离散化可能略逊一筹。但如果你把噪声方差偏差、脉冲干扰这类“现实毒打”加进去,Pietra-Ricci检测器的抗性就体现出来了。选检测器前要想清楚自己的应用场景更接近哪一种。

6. 踩坑记录与实操心得

6.1 直方图分箱数对统计量的影响

这是我在调试过程中遇到最多的坑。直方图分箱数设得太小,经验PDF曲线被压得太平,和真实分布之间的差异被“磨平”,统计量对信号存在不敏感。分箱数设得太大,每个bin里的样本太少,统计量像噪声一样乱跳,门限完全没法稳定标定。

调整经验是保持N / numBins大约等于10到20。N是采样点数,numBins是分箱数。N=1024配64或128分箱都比较合理。如果你把N改成4096,分箱数也可以相应翻倍。跑参数扫描时,建议先固定numBins不变,只扫信噪比,得到一个稳定基线之后再去微调分箱数。

6.2 噪声方差估计不准怎么办

Pietra-Ricci统计量计算时要用到理论噪声PDF,而理论噪声PDF依赖噪声方差。如果实际噪声方差和计算时用的方差对不上,经验PDF和理论PDF之间的“距离”本身就被污染了。更麻烦的是,这个偏差对 (\mathcal{H}_0) 和 (\mathcal{H}_1) 的影响不均匀,门限标定会跟着出问题。

我踩过的实际场景是:仿真里噪声方差按固定SNR生成,但门限标定时误用了另一个SNR对应的噪声方差,结果整条检测概率曲线明显偏离预期。后来把门限标定统一改成固定噪声功率,才把问题解决。实际系统里如果噪声方差未知,需要先加一段噪声估计模块,或者在检测统计量里用某种归一化方式消掉方差依赖,否则鲁棒性很难保证。

6.3 融合规则选硬还是选软

在K=8、低信噪比条件下,软融合基本稳定优于硬融合,尤其是OR规则在低信噪比下虚警概率会飙升。AND规则虚警压得住,但检测概率也压得太低。半数以上规则处在中间,但它本质上还是丢了统计量幅度信息。

如果项目对FC和节点之间的通信带宽有限制,硬融合是妥协方案;如果带宽不是瓶颈,直接上软融合。Pietra-Ricci统计量本身是连续值,软融合能完整利用它。如果还想进一步提升,可以研究加权融合,权重按节点信噪比或信道增益设置。这个优化在低信噪比下还有不少空间。

6.4 仿真提速技巧

蒙特卡洛循环动辄几千次,每次还要逐节点计算直方图,跑完一整组参数可能要等不少时间。我常用的三个提速手段:

第一,循环内不生成调制器对象,QPSK信号直接用星座点索引生成,避免不必要的对象创建开销。第二,预分配所有数组,特别是T_local和Pd_soft,避免循环内动态增长。第三,把parfor用在蒙特卡洛外层循环上,多核并行能直接省掉一大半时间。

还有一个容易被忽视的点:如果只是看趋势,蒙特卡洛次数可以先设500,快速迭代;确定最终结果再跑5000次。不要一开始就按5000次跑,参数还没调好,纯属浪费算力。

结尾:一点实际体会

这次把Pietra-Ricci检测器接进集中式协作频谱感知,我最大的体会是:检测器本身的理论推导并不难,难的是把理论落到仿真代码里时那些“看不见的细节”——复噪声功率分配、直方图归一化、门限标定和信噪比解耦、融合规则与统计量匹配。这套代码之后还能继续扩展,比如把本地判决改成多比特量化、给FC加权融合模块换成按信噪比自适应调整、引入非高斯噪声模型做对比实验。我个人觉得,做这类仿真项目最重要的不是把代码跑通一遍,而是跑通之后还能清楚说出每个参数为什么这么设、每个步骤在原理上对应什么。能做到这一点,换任何检测器、换任何融合规则,你都能快速上手。

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

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

立即咨询