
认知无线电圈子里频谱感知是个老话题了但同时也是最难落地的一块。说它难不是难在“能不能检测到信号”而是难在“在噪声不确定、信道衰落、硬件非理想这些现实条件下还能不能稳定地判对”。这几年我一直在折腾协作频谱感知试过能量检测、循环平稳检测、匹配滤波检测各有各的毛病。直到我把Pietra-Ricci指数检测器PR检测器和集中式数据融合结合起来做了一套Matlab实现才算是找到一个性能、复杂度、鲁棒性都比较均衡的方案。这套东西能解决什么问题简单说就是多个感知节点各自拿到信号后不急着自己拍板而是把提炼出来的特征指标PR统计量上报给融合中心由融合中心集中决策判断某个频段上主用户到底在不在。相比单节点感知它在低信噪比下更可靠相比硬判决融合它保留了更多信息量相比纯能量检测它对噪声功率不确定度的免疫力强得多。这篇文章我把自己从建模、算法选型、Matlab编码到调参踩坑的完整过程写出来适合正在做认知无线电、频谱感知、协作通信方向的同学参考也适合想快速跑通一个数据融合检测demo的工程师。1. 内容整体设计与思路拆解1.1 频谱感知的核心矛盾噪声不确定度是怎么毁掉能量检测的在展开PR检测器之前先聊几句为什么传统方案不够用。最常见的能量检测Energy DetectionED思路是接收信号在单位带宽内的能量如果高于门限就判为主用户存在。这个方案实现极其简单但有个致命前提——你必须知道噪声功率到底是多少。实际场景里噪声功率会随温度、器件老化、邻频干扰变化你标定的噪声底可能比真实值低个1到3dB。噪声不确定度一旦上来了能量检测在低信噪比下就非常尴尬要么虚警率飙高要么漏检严重。所以我个人一直认为在做感知算法选型时第一原则不是“谁的检测概率高”而是“谁的虚警概率对噪声不确定度不敏感”。这就引出了基于样本协方差矩阵特征值的一类检测器PR检测器就是其中之一。它的核心思想是主用户信号和噪声在同一组观测数据里会改变样本协方差矩阵的特征值分布。纯噪声情况下各特征值比较接近散布程度很低有信号的情况下最大的几个特征值会明显凸出来特征值之间的“差异程度”显著变大。PR统计量就是用来定量刻画这种差异的。1.2 协作频谱感知为什么必须走集中式数据融合的路子单节点感知再怎么优化也躲不开两种现实威胁一是深度衰落节点恰好落在阴影区主用户信号被压到噪声底下二是隐藏终端问题节点听到的可能是“安静”的假象但主用户接收端其实正被干扰。协作感知的价值就在于空间分集——多个节点分布在不同的地理位置同时陷入深衰落的概率小得多把各节点的信息汇总起来决策检测可靠性自然就上去了。协作感知有分布式和集中式两大类架构。分布式更多用在自组织网络里节点之间互相交换决策或者权重信息迭代收敛得到全局结果好处是不依赖中心节点坏处是收敛速度、同步、拓扑变化处理都麻烦。集中式则简单直接所有感知节点通过控制信道把本地信息上报给融合中心Fusion CenterFC由FC完成最终判决。在基础设施网络比如基站覆盖的小区、专用频谱监测系统里集中式是更务实的架构因为FC天然存在而且它拥有全局信息可以做更精细的融合策略。这篇实现里我采用的正是典型的“本地感知中心融合”两级结构。1.3 检测器选型逻辑为什么是Pietra-Ricci指数而不是最大最小特征值比PR检测器从学术脉络上看属于特征值类盲检测器和最大最小特征值比MME、信号子空间特征值类检测器同族。但PR检测器在工程实现中有个讨喜的地方它统计的是一个相对集中的度量把特征值的“最大-最小差”做了归一化处理所以它的数值范围比较稳定门限标定相对容易。另外PR检测器不需要知道主用户信号的调制格式、导频结构、循环频率也不需要对信道做估计。接入节点只需要做一件事在感知时隙内采样、算样本协方差矩阵、提取特征值、计算PR指数。这种“盲检测”属性意味着它天然适用于非合作信号的场景正好契合频谱感知的实际需求。多个节点汇总上来的PR统计量在FC端做等增益合并、最大比合并或者选择合并都不用重新设计检测器只需对统计量做简单融合再做一次判决这给工程实现留下了很大的灵活空间。2. 核心细节解析与实操要点2.1 PR统计量的计算原理与直观解释先给一个直观理解。假设一个感知节点有M个通道可以是M根天线也可以是M个不同的接收通道在观测窗口内采样N个快照那么得到一个M行N列的复基带观测矩阵X。样本协方差矩阵记为R (X * X^H) / N如果接收信号里只有噪声那么R的期望是噪声功率乘以单位阵因为是随机样本实际特征值会围绕噪声底散布但这种散布是有限的服从随机矩阵理论里的Marchenko-Pastur分布。当主用户信号存在时如果信号是低秩结构比如一个窄带信号、一个调制信号它会在R里引入一个更显著的低秩扰动表现为最大特征值被顶起来特征值分布的整体“离散程度”变大。PR指数在检测场景里的表现形式我采用的是特征值散布度eigenvalue spread的一种归一化变体T (lambda_max - lambda_min) / sum(lambda)分母是所有特征值之和刚好等于样本协方差矩阵的迹也就是接收总功率。这个归一化操作让T只关注特征值的相对结构不依赖绝对功率这正是它对噪声不确定度鲁棒的根本原因。如果把T直接写成(lambda_max - lambda_min) / (lambda_max lambda_min)得到的也是归一化量物理含义更接近Pietra-Ricci指数对离散度的度量。两种定义在检测性能上差别不大关键是要在门限标定时和使用时保持一致。2.2 集中式融合中心的合并策略FC拿到各节点上报的PR统计量之后怎么合才是最关键的。工程上常用三种策略等增益合并EGC对所有节点的PR统计量直接求平均认为每个节点质量一样。优点是实现简单不依赖信道信息在信噪比差异不大时足够用。信噪比加权合并SNR-EGC每个节点估计自己的接收信噪比按信噪比加权信噪比高的节点话语权更大。性能更优但需要额外估计信噪比增加开销。选择合并SC只挑PR统计量最大的那个节点做判决。在某个节点信号特别好、其他节点都处在噪声底的时候SC反而简单有效。我仿真里默认用等增益合并原因只有一个——公平对比时不需要引入额外估计误差基线干净。实际部署时可以根据场景切换加权方式。有一点要注意各节点上报的PR统计量最好先做一次“质量控制”比如把明显异常数值落在物理不可能区间的剔除掉不然一个节点崩溃会把融合结果带偏。2.3 Matlab实现的整体框架代码整体分三块感知节点模块生成观测信号、计算PR统计量、融合中心模块收集统计量、融合判决、性能评估模块蒙特卡洛仿真、绘制ROC曲线。用脚本组织大概是这样collaborative_sensing_main.m % 主脚本控制仿真循环 local_pr_detector.m % 节点本地PR统计量计算函数 fusion_center_decision.m % 融合中心判决函数 calibrate_threshold.m % 门限标定函数基于噪声样本 generate_signal.m % 主用户信号生成QPSK/OFDM等这种模块化设计的好处是你可以单独替换检测器、单独替换融合策略不用把整个仿真推倒重来。我之前的项目里就是在这套框架上把能量检测、MME、PR检测器全部对比了一遍跑起来非常省事。2.4 几个关键参数的设计要点采样快照数N怎么选N太小时样本协方差矩阵估计不准特征值抖动大检测性能会明显恶化N太大时感知时隙太长频谱机会被浪费。工程经验值是N至少是M的5到10倍。M4、N100到256是比较常见的配置。协作节点数K一般3到6个就能看到明显的分集增益继续增加收益递减反而抬高回传开销。门限gamma由蒙特卡洛标定得到参考公式gamma quantile(T_null, 1 - Pfa)其中T_null是纯噪声条件下PR统计量的蒙特卡洛样本集合Pfa是目标虚警概率。3. 实操过程与核心环节实现3.1 系统模型与仿真参数配置仿真场景我设置的如下载波频点不具体设置全部在基带等效模型下处理主用户信号为QPSK调制每个符号在接收端用升余弦脉冲成形采样率按每符号8个采样点来感知节点数K 4每个节点接收通道数M 4相当于4根接收天线在空间做分集每个感知节点在一次感知时隙内采N 256个快照信道为瑞利平坦衰落每个节点到主用户的信道独立生成噪声为复高斯白噪声噪声功率为1信号功率按目标信噪比换算蒙特卡洛轮数设为10000次保证虚警概率0.1以内时结果置信度足够性能指标统计检测概率Pd与虚警概率Pfa绘制ROC曲线。这套配置对标的是市区小尺度衰落场景属于比较典型的感知仿真环境。3.2 核心代码片段与逐行解读先给出本地PR检测器函数的Matlab实现function T local_pr_detector(X) % X: M x N 复基带观测矩阵 % 返回: PR统计量特征值散布的归一化度量 [M, N] size(X); R (X * X) / N; % 样本协方差矩阵 lambda eig(R); % 特征值分解 lambda sort(lambda, descend); T (lambda(1) - lambda(end)) / sum(lambda); end这段代码非常简单但有一个细节值得注意样本协方差矩阵R是MxM的eig(R)得到M个特征值。由于我们假设噪声是白噪声R的理论形态为sigma2 * I signal_part所以特征值排序后最大特征值携带信号信息最小特征值更接近纯噪声特征。PR统计量的分母用sum(lambda)而不是直接用M * sigma2是因为后者需要估计噪声功率而我们做归一化的初衷就是避免对噪声功率的先验依赖。融合中心判决函数function decision fusion_center_decision(T_reports, gamma, strategy) % T_reports: 1 x K 向量各节点上报的PR统计量 % gamma: 门限 % strategy: EGC 等增益合并; SC 选择合并 switch strategy case EGC T_fusion mean(T_reports); case SC T_fusion max(T_reports); otherwise error(未知融合策略); end decision double(T_fusion gamma); end门限标定函数function gamma calibrate_threshold(M, N, K, Pfa, MC_iter) % 通过蒙特卡洛仿真生成纯噪声条件下的PR统计量分布 T_null zeros(1, MC_iter); for k 1:MC_iter X (randn(M, N) 1i*randn(M, N)) / sqrt(2); T_local local_pr_detector(X); % 如果是多节点则重复生成K组后做EGC T_all zeros(1, K); for kk 1:K Xk (randn(M, N) 1i*randn(M, N)) / sqrt(2); T_all(kk) local_pr_detector(Xk); end T_null(k) mean(T_all); end gamma quantile(T_null, 1 - Pfa); end这里我特别说明一下为什么门限标定的时候要模拟整个“K节点融合”的流程因为融合后的PR统计量分布和单节点PR统计量分布不一样。如果你偷懒只标定单节点门限然后在融合后直接用这个门限判决虚警概率会和对不齐这是很多人踩过的坑。3.3 蒙特卡洛仿真主循环主脚本里的检测概率仿真逻辑如下Pd zeros(1, length(SNR_dB)); for s 1:length(SNR_dB) snr SNR_dB(s); hits 0; for iter 1:MC_iter T_reports zeros(1, K); for kk 1:K X generate_signal(snr, M, N); T_reports(kk) local_pr_detector(X); end decision fusion_center_decision(T_reports, gamma, EGC); hits hits decision; end Pd(s) hits / MC_iter; endgenerate_signal函数内部按信噪比生成QPSK信号叠加瑞利信道和噪声返回观测矩阵X。主用户存在和不存在两种情况分别跑不存在时得到实际虚警概率存在时得到检测概率。3.4 仿真结果观察思路跑完仿真后建议至少画两张图第一张是检测概率随信噪比变化曲线横轴从-15dB到5dB纵轴是Pd第二张是ROC曲线固定某个信噪比比如-8dB改变门限得到不同的Pfa和Pd点画出Pd-Pfa曲线。PR检测器相比能量检测在低于0dB信噪比时优势非常明显尤其是在噪声不确定度较大时。协作节点数从1增加到4在-10dB信噪比附近Pd提升通常能达到0.2到0.4这从曲线上能直观感受到。4. 常见问题与排查技巧实录4.1 典型问题速查表问题现象可能原因解决办法检测概率在低信噪比时几乎为0快照数N太少样本协方差矩阵估计不准增大N到256或512或增加节点通道数M虚警概率远高于设定目标门限标定流程没走融合后的分布门限必须在“K节点融合”后的噪声统计量上标定不同节点功率差异造成融合失效某个节点靠近强干扰源统计量被抬高在FC端增加异常值剔除或改用SC策略ROC曲线在Pfa很小时抖动剧烈蒙特卡洛次数不足至少跑10000次Pfa0.01量级建议5万次以上仿真速度太慢嵌套循环加特征值分解次数过多优先使用高版本Matlab的并行计算工具箱parfor加速信号模型是实信号但代码用复信号实信号和复信号噪声功率定义不一致统一按复基带模型处理噪声方差为14.2 独家避坑经验门限标定不能跳过“融合”这是我最初复现PR检测器时最深刻的教训。一开始我只对单节点的PR统计量做了门限标定然后放到协作融合场景里直接用结果虚警概率比目标值高了一个数量级整个ROC曲线都乱了。静下心分析后才发现多个节点取平均值之后噪声环境下PR统计量的方差会被压低分布整体向均值收缩所以同一门限对应的右侧尾概率大大增加。想通这一点后我把门限标定改成“模拟K个节点全部只收噪声、融合后再取统计量”的流程虚警概率立刻对上了。这个坑在论文里很少被直接点名但凡是真正做过多节点融合仿真的人应该都有体会。4.3 踩坑记录样本协方差矩阵奇异与数值不稳当M大于N时样本协方差矩阵会是奇异矩阵eig直接算出来会有数值异常。实际场景里比如你只有4根天线但N只采了20个快照PR统计量里的lambda_min可能接近0导致T趋于1检测器就变成“永远判有信号”彻底失效。所以前面强调的“N至少是M的5到10倍”不是经验主义而是数值稳定性的硬约束。如果硬件条件确实只能支持很短的观测窗口建议先对X做主成分分析降维再在高维空间里计算统计量虽然会损失一点点信息但至少数值是稳定的。4.4 性能对比时别忽视噪声不确定度这个变量很多同学仿真时只对比相同信噪比下的检测概率但现实中更关键的是噪声不确定度下的鲁棒性对比。我的建议是在仿真里给噪声功率加一个随机扰动比如sigma2 10^(delta/10) * sigma2_ref其中delta在-0.5dB到0.5dB之间均匀分布然后重新对比PR检测器和能量检测器。你会发现能量检测在低信噪比下性能掉得飞快而PR检测器基本保持稳定。这组对比图如果放进报告或者论文里比单纯的中性信道对比有说服力得多。4.5 进一步优化和扩展思路PR检测器配合集中式融合已经能覆盖大部分常规场景但它不是终点。如果后续想继续提升性能有几个明确方向一是引入信号占空比估计在时域上做加权感知把主用户不活跃的时段权重压低二是配合循环平稳特征做混合检测用PR做粗检用循环平稳检测做确认双级结构可以同时拿到低复杂度和高可靠性三是把PR统计量和信噪比估计值一起上报给FC让FC做加权合并而不是均值合并。这三条路我都分别搭过测试版前两条的提升空间在0.5到1.5dB左右第三条实现成本最低强烈建议你先从它入手。这套Matlab代码实现从框架到细节基本覆盖了集中式融合感知的完整链路。说实话跑通了这套流程之后再回头看能量检测确实能明显体会到“用信息结构替代绝对功率”这个设计哲学的价值。最后分享一个小经验做这类仿真不要一上来就追求完美信道模型和高端同步算法先把“单节点检测-多节点上报-中心融合判决-蒙特卡洛评估”这条链路跑通后续所有改进都往这条主链路上加效率会高得多。