OFDM频谱感知中的循环平稳检测与协作融合实战
简介面向认知无线电与频谱感知研究的仿真源码包围绕正交频分复用信号的频谱感测与协作频谱感知展开重点解决阴影和深度衰落环境中单节点感知不可靠、需要多节点融合以提升检测可靠性的问题。资源聚焦循环平稳特征检测与协作融合算法适合通信专业学生、科研人员及算法学习者用于仿真验证与算法改进也可作为课程设计或论文实验的起点代码。压缩包共六个文件以四个m脚本为核心完成信号生成、瑞利信道模拟及频谱感知算法实现另有二个文本文件用于提供说明或参数配置整体仅6KB属于轻量级代码便于快速掌握关键流程。已有234人学习或下载。通过该资源可获取完整的仿真框架既能查看循环平稳特征检测的编程实现也能理解“或”准则与“与”准则等硬判决融合策略的差异还可在此基础上扩展软判决或证据理论等协作方案为深入研究提供可行起点。1. 深衰落检验下的OFDM频谱感知为什么单节点检测会失效深衰落只要出现一次单节点能量检测的判决就可能从“有信号”翻到“无信号”整条仿真曲线立刻失真。我拆过一份以OFDMtmep.m为主流程的 OFDM 频谱感知源码它把循环平稳检测、Rayleigh 信道样本、历史频谱数据和多节点协作判决串在了一条链路上。这个工程场景解决的是在阴影衰落和深度衰落条件下如何让 OFDM 频谱感知结果依然可信。循环平稳检测负责利用 OFDM 的周期结构提取特征协作融合负责用多个节点的统计量抵消单个节点被深度衰落压制的风险。适合正在用 MATLAB 做认知无线电或频谱感知仿真的人尤其适合已经在跑能量检测但性能不理想想换成循环平稳检测并把多节点融合加进来的同学。2. OFDM循环平稳检测循环谱构造与FFT参数选择2.1 OFDM信号的循环平稳特征从哪里来OFDM 信号适合循环平稳检测这要从信号结构本身看。每个 OFDM 符号由 IFFT 生成符号前插入循环前缀后形成长度为 Tsym Tsub Tcp 的完整符号。如果导频符号按固定周期重复信号的自相关函数就不再只是时移的函数而是随时间呈现周期性反映在频域上就是信号在某个循环频率 alpha 处出现谱相关峰。常见做法是把 alpha 对准 1/Tsym 或导频重复周期的倒数。能量检测只观察 alpha0 处的能量循环平稳检测则把循环频率轴和频率轴组成的二维平面当作信号指纹因此在低信噪比下依然能和零均值白噪声区分开因为白噪声在非零循环频率上的谱相关平均后趋近于零。需要提醒的是CP 越长符号间周期性越强循环谱峰越明显但频谱效率会下降子载波数越大频率分辨率越细循环频率轴上的谱线也越容易观察。2.2 循环谱密度的估计流程与参数表估计循环谱密度没有统一捷径工程上最常用的做法是分帧做短时傅里叶变换再沿时间轴做谱相关累加。流程可以拆成四步。第一步将接收的复基带信号按 Nfft 长度分帧帧间滑动 Nshift 个采样点第二步对每一帧分别乘以旋转因子 exp(-j·pi·alpha·n) 和 exp(j·pi·alpha·n)再分别做 FFT第三步把两组频域输出在对应频点上共轭相乘得到该帧的谱相关估计第四步对所有帧累加并除以帧数和 Nfft得到最终的循环谱密度估计。整个过程本质上是一个频移、相关、平均结构。参数常见取值作用与影响Nfft1024决定频率分辨率过小会使循环谱峰展宽过大会增加处理时延Nshift256帧间滑动步长越小重叠越多平滑效果越好计算量越高alpha1/Tsym循环频率轴上的检测点可继续扫描 1/Tpilot平均帧数64累加平均次数决定噪声抑制能力时间开销随其线性增长Fs系统采样率统一所有频率单位需要先把循环频率归一化到采样率2.3 基于FFT累加平均的检测器MATLAB实现下面给出一个可以直接跑通核心思路的检测函数。它不是完整 FAM 算法而是频移相关累加用来验证 OFDM 信号在目标循环频率上的谱峰已经够用。% 简化循环谱密度估计验证OFDM在目标循环频率上的谱峰 function S est_scd(x, Nfft, Nshift, alpha) % x: 复基带OFDM信号 % Nfft: FFT点数仿真中一般取1024 % Nshift: 帧间滑动步长取Nfft/4能得到75%重叠 % alpha: 目标循环频率 frame_num floor((length(x) - Nfft) / Nshift); S zeros(Nfft, 1); n (0:Nfft-1).; for k 1:frame_num seg x((k-1)*Nshift 1 : (k-1)*Nshift Nfft); U fft(seg .* exp(-1j * pi * alpha * n)); V fft(seg .* exp(1j * pi * alpha * n)); S S U .* conj(V); end S S / (frame_num * Nfft); end代码里的两个复指数项分别将基带信号频移正负 alpha/2FFT 后得到 U 和 V二者乘积就是该频点上的谱相关估计。循环平稳信号在 alpha 对应符号周期处有显著相关峰噪声在非零 alpha 处累加后趋于零。这种实现只能测单个 alpha正式仿真一般还要加窗函数抑制频谱泄漏比如hanning(Nfft)。Nfft 选择时要注意频率分辨率与子载波间隔的关系若 OFDM 子载波间隔是 15 kHz在 20 MHz 采样率下 Nfft1024 的频率分辨率大约是 19.5 kHz基本够用。Nshift 取 Nfft/4 时重叠率很高检测方差小但仿真时间会明显变长。做完 S 估计后可以用max(abs(S)) / mean(abs(S))作为判决统计量比值超过门限就认为该频带存在 OFDM 信号。这个近似不需要跑完整的时频平面适合先做方案验证。3. 协作频谱感知的融合准则硬判决与LRT软判决实现3.1 单节点感知在阴影衰落下的不可靠性阴影和深度衰落情况下单个节点的感知结果并不可靠。用循环平稳检测提升单节点性能是第一步但不是全部。当节点落在深衰落区域信号被障碍物遮挡噪声功率可能远远超过信号功率本地统计量会倾向于噪声分布无论用能量检测还是循环平稳检测都会产生较高漏检概率。协作感知的基本动机是空间分集不同位置的节点被同一个障碍物同时遮挡的概率较低把各节点判决或统计量集中到融合中心可以恢复出比单节点更稳定的判决。不过融合方式决定了可靠性上限。直接上报 0/1 的硬判决会损失可靠性信息软判决保留连续统计量理论上可以获得更好的检测性能。3.2 或准则与与准则的MATLAB计算硬判决融合最简单的是或准则和与准则。或准则只要有一个节点判为占用融合结果就判占用与准则要求全部节点判占用才判占用。前者提高检测概率但会抬高虚警概率后者压低虚警但容易漏判。下面代码用 any/all 实现两种准则。d_local [1 0 1 0 1 1 0 1]; % 8个节点的本地判决 H_or any(d_local); % 或准则任一为1则占用 H_and all(d_local); % 与准则全部为1才占用在仿真中d_local每个元素来自单节点检测器的门限比较。或准则等价于并联系统只要信道好的节点没有漏检就能捕捉信号与准则等价于串联系统对每个节点都要求高检测概率。实际使用时要结合需求选择认知无线电中为避免干扰主用户通常更重视检测概率会用或准则但如果融合节点数多且本地虚警控制不好或准则会导致虚警累积。因此要对单节点门限做联合调整不能直接把单节点最优门限搬到协作场景。3.3 基于似然比检测的软判决融合LRT 软判决的思路是让每个节点上报连续统计量例如本地能量 e_i 和估计信噪比 snr_i融合中心计算每个节点的对数似然比再求和。若本地统计量近似服从高斯分布H0 和 H1 条件下均值分别为 1 和 1snr_i对应标准差由样本数决定。代码实现如下function [decide, LLR] lrt_fusion(e, snr, Nsamples, theta) % e: 各节点归一化能量统计量 % snr: 各节点信噪比 % Nsamples: 能量估计样本数 % theta: 融合中心判决门限 sigma0 sqrt(2 / Nsamples); sigma1 sqrt(2 * (1 snr).^2 / Nsamples); LLR log(sigma0 ./ sigma1) ... (e - 1).^2 ./ (2 * sigma0.^2) - ... (e - 1 - snr).^2 ./ (2 * sigma1.^2); decide sum(LLR) theta; endsigma0和sigma1是两种假设下能量统计量的近似标准差LLR是本地对数似然比融合中心把各节点 LLR 求和后与 theta 比较。深衰落节点的 snr 很小其 LLR 绝对值也小不会像硬判决那样强行投出错误一票。theta 不是随便设的要在给定虚警概率下通过蒙特卡洛扫描得到。这里用高斯近似简化了卡方分布适合第一轮算法验证真正做性能曲线时建议用chi2rnd产生本地统计量。3.4 三种融合方式的实际对比融合方式上报内容对单节点可靠性依赖融合端复杂度或准则本地0/1依赖本地虚警低最低一次any与准则本地0/1依赖本地漏检低最低一次allLRT软判决能量统计量、SNR低深衰落节点自动降权中等需要乘加运算工程上我一般先用或/与准则跑底线看性能离目标差多少再用 LRT 做上界。如果 LRT 与或准则差距很大说明本地门限设置或节点选择有问题如果差距很小则没必要为软判决增加信号开销。实践中还要注意节点之间若共用环境噪声各统计量不再独立同分布LRT 的增益会下降需要在融合前对相关噪声做去相关或至少估计相关系数。4. 历史频谱数据与Rayleigh信道建模预处理与深衰落加权4.1 HistoricalSpectrum数据怎么组织在协作感知中历史频谱信息的作用是给当前判决提供背景。HistoricalSpectrum是一组按时间顺序排列的历史频谱切片通常组织成二维矩阵行代表时间帧列代表 OFDM 子载波或频点。融合中心可以从中提取每个节点的长期信道状态区分“这个节点一直处于深衰落”和“这个节点只是瞬时干扰”。源码包中ChannelAeroT1.m从文件名看像是处理信道快照与历史频谱对齐的辅助脚本实际使用时要先确认数据是.mat存储还是文本存储。如果是文本格式可以用readmatrix或load读取。读取后第一步是去掉无效帧比如幅度异常跳变或全零行第二步是估计每列的平均功率和方差作为后续融合的可靠性权重。不要直接把历史频谱和实时频谱直接相加两者时间尺度不同需要对历史部分加遗忘因子。4.2 用rayleigh_chan.m生成多径衰落样本Rayleigh 信道是教科书标准但源码里真正落地的关键是接口。常见实现是输入多径数 L、最大多普勒频移 fd、采样间隔 Ts、当前时间 t输出一个复数冲激响应向量 h。下面给出一个典型实现骨架function h rayleigh_chan(L, fd, Ts, t) % L: 多径数 % fd: 最大多普勒频移 % Ts: 采样间隔 % t: 当前时刻静态信道时置0 path_power exp(-(0:L-1) / L); path_power path_power / sum(path_power); h sqrt(path_power) .* ... (randn(1, L) 1j * randn(1, L)) / sqrt(2); endpath_power按指数衰减/ sqrt(2)让实部和虚部功率各占一半合成的幅度服从 Rayleigh 分布。这个实现没有多普勒频移适合静态节点或慢变场景。如果 fd 不为 0需要在每径上乘一个多普勒功率谱成形滤波器工程上常用 Jakes 模型。调用后把 h 做 FFT 得到频域响应 H与 OFDM 频域符号相乘。相关参数L6 时可模拟 7 径信道L2 适合典型两径fd100 Hz 对应约 1.5 km/h 在 2.4 GHz 下的移动速度。rayleigh_chan.m在包内的具体实现可能略有不同建议先运行which rayleigh_chan确认路径再验证返回变量维度。4.3 深衰落频点识别与历史频谱加权有了历史频谱和信道系数下一步是把它们变成可使用的权重。常见做法是计算每个频点上的时间平均功率功率越低可信度越低融合时给该频点更小权重。代码片段如下% 历史频谱加权示例 hist_data load(HistoricalSpectrum.mat); S_hist hist_data.spectrum; % time_bin x freq_bin power_avg mean(abs(S_hist).^2, 1); weight power_avg / (power_avg 1e-12); % 避免除零 S_fused sum(S_hist .* weight, 1) / sum(weight);这段代码按时间轴平均得到每个频点的平均功率再归一化成权重。1e-12是防止全零频点除零。若某个频点长期处于深衰落power_avg 接近 0weight 趋近 0融合结果几乎不受该频点影响。在 OFDM 频谱感知里频率选择性会造成部分子载波深衰落这些频点直接参与判别会抬高漏检。因此把历史频谱作为先验信息非常有效。不过权重不能更新太快否则在突发干扰下会把正常频点误判为深衰落。一般给权重加一阶低通滤波weight 0.7 * weight_new 0.3 * weight_old这在仿真中能明显改善检测稳定性。历史频谱阶段操作常见工具读取解析txt或mat恢复二维矩阵load、readmatrix清洗剔除全零行、异常幅度帧find、isnan加权按时间平均功率归一化mean、sum融合与当前频谱做指数加权一阶低通滤波5. D-S证据理论与似然比检测的协作融合从BPA构造到复杂度控制5.1 D-S证据理论的基本表示D-S 证据理论把一个节点对频谱占用状态的判断表示成三个值对 H0 的支持度 m(H0)、对 H1 的支持度 m(H1)、以及不确定度 m(Θ)。Θ 表示 H0 或 H1 都有可能节点自己无法区分。这个三值表示比硬判决 0/1 多了一维信息也比纯概率多了一个不确定度。在协作感知场景下不确定度可以直接表达节点对本地信道状态的信任程度。深衰落节点往往输出的 m(H1) 和 m(H0) 都不高不确定度很高融合中心会自然降低它的影响这是 D-S 相对或/与准则的优势。5.2 从本地能量构造基本概率分配BPA 怎么构造是关键。最简单的办法是用 sigmoid 平滑映射代码如下function [mH0, mH1, mUnc] bpa_from_energy(e, snr, tau) % e: 本地归一化能量 % snr: 本地信噪比 % tau: BPA曲线陡峭参数 mH1 1 ./ (1 exp(-tau .* (e - (1 snr)))); mH0 1 ./ (1 exp(tau .* (e - 1))); mUnc 1 - mH0 - mH1; mUnc max(mUnc, 0); m_sum mH0 mH1 mUnc; mH0 mH0 ./ m_sum; mH1 mH1 ./ m_sum; mUnc mUnc ./ m_sum; endtau 调大时映射趋近于 0/1 硬判决调小时曲线更平缓不确定度更大。e 是能量统计量1snr 是 H1 条件下的均值。归一化保证三项和为 1。实际项目中也可以直接取两个高斯分布的归一化后验作为 BPA但工程上用 sigmoid 更容易控制曲线斜率。注意 mUnc 计算公式是近似这里只是工程简化。5.3 D-S合成规则的MATLAB实现两个节点的 BPA 可以用 Dempster 合成规则合并代码如下function [mH0, mH1] ds_combine(mA, mB) % mA, mB: [mH0, mH1, mUnc] 三元组 K 1 - (mA(1)*mB(2) mA(2)*mB(1)); if K 1e-6 error(证据冲突过大合成结果不可用); end mH0 (mA(1)*mB(1) mA(1)*mB(3) mA(3)*mB(1)) / K; mH1 (mA(2)*mB(2) mA(2)*mB(3) mA(3)*mB(2)) / K; endK 是冲突因子代表两个节点一个判 H0 另一个判 H1 的证据量。当 K 接近 0 时合成后的数值病态说明两个节点的证据强烈矛盾。在频谱感知中这种矛盾通常由个别节点落在强干扰中引起此时保留证据比强行合成更合理。多节点合成时按顺序调用ds_combine但每次合成都要重新归一化计算量随节点数增加。这也是摘要中 D-S 算法计算复杂度高于或/与准则的原因。5.4 计算复杂度和存储需求对比融合算法每节点上报融合端计算存储需求冲突处理或/与准则1 bitO(N)无无法处理LRT软判决1个统计量SNRO(N)无自动降权D-S证据理论3个概率值O(N^2) 两两合成历史BPA通过K检测冲突从表可以看出D-S 的性能优势来自不确定度表示但代价是存储历史证据和较高的合成开销。我在仿真里先用 LRT 得到性能上界再用 D-S 验证冲突场景如果两者差距不超过 0.5 dB宁可用 LRT因为它实现简单且不需要历史数据。这和原文观察一致LRT 软判决优于硬判决且复杂度低于 D-S。6. 工程落地符号同步误差与固定alpha检测的FPGA实现6.1 符号定时偏差如何毁掉循环谱峰实际部署时第一个坑是定时偏差。循环平稳检测假设 FFT 窗和 OFDM 符号边界对齐如果窗起点偏移超过循环前缀长度同一个窗会混入两个不同符号导频周期性被破坏循环谱峰会展宽甚至消失。所以频谱感知前必须先做粗同步。最常用的方法是利用 CP 延迟相关% 基于CP延迟相关的符号定时粗同步 corr_cp zeros(1, length(rx) - Nfft - CP_len 1); for n 1:length(rx) - Nfft - CP_len 1 seg_a rx(n : n CP_len - 1); seg_b rx(n Nfft : n Nfft CP_len - 1); corr_cp(n) abs(sum(conj(seg_a) .* seg_b)); end [~, syn_idx] max(corr_cp);循环内逐点相关在数据长时很慢但用来确认同步位置已经足够。syn_idx 是估计的符号起始点把rx(syn_idx : syn_idxNfft-1)传给前面的est_scd函数循环谱峰会稳定很多。如果输入是过采样信号还要先把采样率降到与 OFDM 符号率对齐否则相关峰会出现偏移。6.2 固定alpha分支FPGA上的低成本检测在 FPGA 上做完整循环谱密度估计成本太高常用做法是只在已知导频周期对应的循环频率上做两个 FFT 分支计算固定 alpha 处的谱相关。先跑一遍 MATLAB 的est_scd扫描循环频率轴找到峰值 alpha然后把这个值设为 FPGA 里的旋转因子参数。这样可以省掉二维搜索乘法器资源大幅下降。实现方式FFT通道乘法器消耗时间开销完整FAM每帧2个FFT还需重排高需要长时间累加整个循环谱面固定alpha检测2个FFT固定分支低一个符号窗口即可累计实际硬件实现时把 alpha 对应的复指数用 CORDIC 产生两个 FFT 结果在频域共轭相乘后做 CIC 累加输出给融合判决。这样可以和 OFDM 解调器共用 FFT 模块只需要多一组旋转因子乘法。在我的验证里固定 alpha 检测比完整 FAM 最多损失 0.3 dB 左右对协作频谱感知场景影响很小。最后把 FPGA 上报的累加值替换掉OFDMtmep.m里的仿真统计量整条协作链路就能跑通。本文还有配套的精品资源点击获取