认知无线电中基于能量检测的双门限频谱感知的 MATLAB 仿真

该方案解决了传统单门限对噪声不确定性敏感的问题。


一、算法原理

1、信号模型

  • H0H_0H0(频谱空闲) :y(n)=w(n)y(n) = w(n)y(n)=w(n)
  • H1H_1H1(频谱占用) :y(n)=h⋅s(n)+w(n)y(n) = h \cdot s(n) + w(n)y(n)=h⋅s(n)+w(n)

2、能量统计量

T(y)=∑n=1N∣y(n)∣2 T(y) = \sum_{n=1}^{N} |y(n)|^2 T(y)=n=1∑N∣y(n)∣2

3、双门限判决规则

能量 T(y)T(y)T(y) 判决结果
T<λ1T < \lambda_1T<λ1 空闲 (H0H_0H0)
λ1≤T≤λ2\lambda_1 \le T \le \lambda_2λ1≤T≤λ2 不确定区
T>λ2T > \lambda_2T>λ2 占用 (H1H_1H1)

二、MATLAB 核心仿真代码

double_threshold_ed.m

matlab 复制代码
clc; clear; close all;

%% 1. 仿真参数
N = 1024;              % 采样点数(感知周期)
SNR_dB = -20:2:10;   % 信噪比范围 (dB)
Mc = 5000;              % 蒙特卡洛次数

% 双门限设置(基于噪声功率归一化)
lambda_low  = 0.8;    % 低门限
lambda_high = 1.5;    % 高门限

Pd = zeros(size(SNR_dB)); % 检测概率
Pf = zeros(size(SNR_dB)); % 虚警概率

%% 2. 主循环
for i = 1:length(SNR_dB)
    count_pd = 0;
    count_pf = 0;

    for m = 1:Mc
        % --- H0: 仅噪声 ---
        noise_h0 = randn(N,1) + 1j*randn(N,1);
        energy_h0 = sum(abs(noise_h0).^2) / N;

        % --- H1: 信号+噪声 ---
        signal = sqrt(1/2) * randn(N,1); % BPSK信号
        rx = awgn(signal, SNR_dB(i), 'measured');
        energy_h1 = sum(abs(rx).^2) / N;

        % --- 虚警概率 (H0下判为1) ---
        if energy_h0 > lambda_high
            count_pf = count_pf + 1;
        end

        % --- 检测概率 (H1下判为1) ---
        if energy_h1 > lambda_high
            count_pd = count_pd + 1;
        end
    end

    Pd(i) = count_pd / Mc;
    Pf(i) = count_pf / Mc;
end

%% 3. 绘图
figure('Color','white','Position',[100 100 600 400]);
plot(SNR_dB, Pd, 'b-o', 'LineWidth', 2); hold on;
plot(SNR_dB, Pf, 'r--s', 'LineWidth', 2);
grid on;

xlabel('SNR (dB)');
ylabel('Probability');
legend('P_d (Detection)', 'P_f (False Alarm)');
title('双门限能量检测性能');
set(gca, 'FontSize', 12);

三、噪声不确定性的自适应门限

在实际硬件(如 STM32 + ADC)中,噪声功率会波动,建议使用自适应门限

matlab 复制代码
% 假设噪声功率估计为 sigma_w2
sigma_w2 = 1.0;   
delta = 0.1;      % 噪声不确定性因子 (±10%)

lambda_low  = sigma_w2 * (1 - delta);
lambda_high = sigma_w2 * (1 + delta);

四、三种判决输出

matlab 复制代码
function decision = spectrum_decision(T, lambda_low, lambda_high)
    if T < lambda_low
        decision = 0;   % 空闲
    elseif T > lambda_high
        decision = 1;   % 占用
    else
        decision = -1;  % 不确定(请求协作感知)
    end
end

参考代码 认知无线电中基于能量检测的双门限频谱检测研究 www.youwenfan.com/contentcsu/63582.html

五、性能对比(单门限 vs 双门限)

指标 单门限 双门限
抗噪声波动
虚警率
实现复杂度
适用场景 实验室 实际 CR 网络

六、扩展功能

协作频谱感知 (多用户融合)
ROC 曲线 (PdP_dPd vs PfP_fPf)
AWGN / Rayleigh / Rician 信道
FPGA/STM32 定点化实现

相关推荐
Mr数据杨1 小时前
【Codex】用教案主体模块沉淀标准化教学设计内容
java·开发语言·django·codex·项目开发
wangbing11251 小时前
踩坑:el8应用装在el9上
开发语言·后端·ruby
Andya_net2 小时前
Java | Java内存模型JMM
java·开发语言
froginwe112 小时前
SQL LIKE 操作符详解
开发语言
182******20832 小时前
2026年java后端还有机会吗?还能找到工作吗?
java·开发语言
kyriewen113 小时前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
CSCN新手听安3 小时前
【Qt】Qt窗口(八)QFontDialog字体对话框,QInputDialog输入对话框的使用,小结
开发语言·c++·qt
tumu_C3 小时前
用std::function减缓C++模板代码膨胀和编译压力的一个场景
开发语言·c++
BT-BOX3 小时前
Matlab 2025B下载安装教程
开发语言·matlab