1、前言

\(\quad\) 频谱感知的方法有很多,比如匹配滤波探测,能量检测,静态循环特征探测等方法,然后最近因为在用硬件做能量检测,所以本文主要是说了如何用matlab实现能量检测,它的大概流程就是:信号采样->模平方->累加->判决,其他的方法不再了解。

2、一些前置知识:

(1)数字信号能量、功率计算公式

\(\quad\) 因为数字信号是离散的,所以就直说离散信号能量的计算。

\(\quad\) 设采样后信号为x,长度为N,能量计算为\(energy = \sum\limits_{k = 1}^{N}(x[k])^2\),放在matlab里计算方法有很多,可以是norm(x)即可。

\(\quad\) 功率计算公式就是,\(power = \cfrac{\sum\limits_{k = 1}^{N}(x[k])^2}{N}\),放在matlab代码就是norm(x) / N

\(\quad\) 补充:时域与频域的能量有一个对应关系,\(\sum\nolimits_{n = 1}^{N}|x[n]|^2 = \cfrac{1}{N}\sum\nolimits_{k = 1}^{N}|X[k]|^2\),其中\(X[k]\)是\(x[n]\)的DFT。

(2)恒虚警率阈值

公式如下:

  • 恒虚警率公式
\[P_f = P(D > th|H_0) = Q(\cfrac{\lambda_{P_f} - N\sigma^2_w}{\sqrt{2N\sigma^4_w}})
\]
  • 阈值公式
\[\lambda_{P_f} = \sigma^2_w(N + \sqrt{2N}Q^{-1}(P_f))
\]

\(\quad\) 其中\(P_f\)是恒虚警率,\(\lambda_{P_f}\)是阈值,N是信号点数,\(\sigma_w^2\)是噪声的功率,Q是标准正态分布的右尾函数,又叫互补累积分布函数,\(Q(x) = \int_x^{\infty}\cfrac{1}{\sqrt{2\pi}}e^{-\cfrac{t^2}{2}}dt\),有关这个函数这篇博客正态分布(高斯分布)、Q函数、误差函数、互补误差函数(定义,意义及互相之间的关系)高斯分布的分布概率反解(求门限)会有详细些介绍以及推导,在matlab中计算\(Q^{-1}(x)\)的值可以直接调用erfcinv(x)函数即可。

\(\quad\) 上面是时域的阈值,根据(1)中时域频域的能量对应关系,所以两者的阈值的对应关系就是\(\quad\)\(频域的能量阈值 = 时域的能量阈值 * N\)。

(3) 信号添加噪声

\(\quad\) 在matlab中,加高斯白噪声可以直接使用\(awgn\)函数,比如设原信号为\(x\),加噪声后的信号为\(y\),\(SNR = -10\)的信道中,加入噪声可以直接y = awgn(x, SNR, 'measured')measured参数会自动测量信号的功率,然后通过加噪声将信道信噪比自适应调整到\(SNR\),具体的用法参考官方,然后加入噪声后可以\(noise = y - x\)提取噪声,从而计算噪声的功率\(P_{noise}\)。

\(\quad\) 上面那种方法简单粗暴,也可以自己加噪声,首先根据信噪比公式\(SNR = 10\lg\cfrac{P_s}{P_{noise}}\)计算出要添加的噪声功率,然后就可以通过公式\(noise = \sqrt{P_{noise}} * randn()\)产生指定功率的噪声信号,matlab里randn()可以产生均值均值为0,方差(功率)\(\sigma^2\)为1,高斯白噪声序列,然后加噪声后的信号就是\(y = x + noise\),其实两种方法计算出的噪声功率都是差不多大的。

3、频谱感知的matlab实现

\(\quad\) 可以进入正题了,我是计算的频谱的能量,对于每个虚警率\(P_f\),在\(SNR\)分别等于\(-25,-20,-15,10dB\)的四种信道环境下做100次实验,横轴是虚警率,纵轴是100次实验中检测到的次数,直接给出代码:

clc;
clear all; N = 1024;%采样点数
n = 1:N;
fs = 1000; %1000hz
t = n / fs; %时间轴 %% original signal
f0 = 100;
f1 = 200;
f2 = 300;
y1 = exp(1i * 2 * pi * f0 * t);
y2 = exp(1i * 2 * pi * f1 * t);
y3 = exp(1i * 2 * pi * f2 * t);
signal = y1 + y2 + y3; subplot(5, 2, [1, 2]);
plot(t, signal);
title("signal");
xlabel('t');
ylabel('y'); %% SNR = 10dB
SNR = 10; %信噪比20dB
signal_add_noise = awgn(signal, SNR, 'measured'); %加高斯白噪声
subplot(5, 2, 3);
plot(t, signal_add_noise, 'k');
title("signal + noise (SNR = 10dB)");
xlabel('t');
ylabel('signal + noise'); f = (0 : N-1) * (fs / N);
fft_y = fft(signal_add_noise, N);
abs_fft_y = abs(fft(signal_add_noise, N)); subplot(5, 2, 5);
plot(f, fft_y); %ignore img
title("FFT (SNR = 10dB)");
xlabel("f");
ylabel("y");
grid on; subplot(5, 2, 7);
plot(f, abs_fft_y); %ignore img
title("abs(FFT) (SNR = 10dB)");
xlabel("f");
ylabel("y");
grid on; %% SNR = -10dB
SNR = -10; %信噪比20dB
signal_add_noise = awgn(signal, SNR, 'measured'); %加高斯白噪声
subplot(5, 2, 4);
plot(t, signal_add_noise, 'k');
title("signal + noise (SNR = -10db)");
xlabel('t');
ylabel('signal + noise'); f = (0 : N-1) * (fs / N);
fft_y = fft(signal_add_noise, N);
abs_fft_y = abs(fft(signal_add_noise, N)); subplot(5, 2, 6);
plot(f, fft_y);
title("FFT (SNR = -10dB)");
xlabel("f");
ylabel("y");
grid on; subplot(5, 2, 8);
plot(f, abs_fft_y);
title("abs(FFT) (SNR = -10dB)");
xlabel("f");
ylabel("y");
grid on; %% detect
Pf =(0.01:0.02:1).^2; %虚警概率
%M = 3;
SNR(1) = -25;
SNR(2) = -20;
SNR(3) = -15;
SNR(4) = 10; for i = 1:length(Pf) %虚警率
for m = 1 : 4 %信道
detect_y(i) = 0;
for kk = 1:100 %次数
signal_add_noise = awgn(signal, SNR(m), 'measured');
%signal_energy(i) = sum(abs(signal_add_noise).^2);
abs_fft_y = abs(fft(signal_add_noise, N));
signal_add_noise_energy = sum(abs_fft_y.^2); noise = signal_add_noise - signal; %噪声
noise_energy = sum(abs(noise).^2); %噪声时域能量
noise_p(m, kk) = noise_energy / N; %噪声功率 threshold(i) = noise_p(m, kk) * (N + sqrt(2 * N) * sqrt(2) * erfcinv(2 * Pf(i))) * N; if signal_add_noise_energy > threshold(i)
detect_y(i) = detect_y(i) + 1;
end
end
detect_diff_channel(m, i) = detect_y(i);
end
end subplot(5, 1, 5);
plot(Pf, detect_diff_channel(1, :), '*-b', Pf, detect_diff_channel(2, :), '*-r', ...
Pf, detect_diff_channel(3, :), '*-g', Pf, detect_diff_channel(4, :), '*-c');
legend('SNR = -25dB','SNR = -20dB', 'SNR = -15dB', 'SNR = 10dB');
title("100次实验检测次数");
xlabel("虚警率");
ylabel("检测次数");
grid on;

\(\quad\) 结果:



\(\quad\)可以看到相同虚警率下,SNR越大越容易被检测到,当\(SNR > 0\)的时候,检测率基本是\(100\%\),当\(SNR < 0\)时,原信号失真的厉害,接收方如何解码又是很大的问题。

\(\quad\) 整个过程就差不多这样了,有错误欢迎指正。

参考:

https://blog.csdn.net/Hsaver/article/details/109598769

https://blog.csdn.net/weixin_42647783/article/details/89449048

https://blog.csdn.net/yhcwjh/article/details/113725703

https://blog.csdn.net/Hsaver/article/details/109598769

matlab实现频谱感知-认知无线电的更多相关文章

  1. 【LaTeX排版】LaTeX论文排版&lt;三&gt;

    A picture is worth a thousand words(一图胜千言).图在论文中的重要性不言而喻,本文主要解说图的制作与插入. 1.图像的插入     图像能够分为两大类:位图和向量图 ...

  2. 【LaTeX排版】LaTeX论文排版<三>

    A picture is worth a thousand words(一图胜千言).图在论文中的重要性不言而喻,本文主要讲解图的制作与插入. 1.图像的插入     图像可以分为两大类:位图和向量图 ...

  3. Tuning Radio Resource in an Overlay Cognitive Radio Network for TCP: Greed Isn’t Good

    好吧,这是09年七月发布在IEEE Communications Magazine的一篇文章. 核心二个词:overlay cognitive radio network,tcp 讲的是,在认知无线网 ...

  4. 【LaTeX排版】LaTeX论文模版

    本文是对前面LaTeX论文排版文章的总结.前面的几篇文章是分别从论文的几个方面来讲述LaTeX的排版问题,这里综合了前面的内容,给出了论文排版的模版. 模版的使用: 1.首先建立一个main.tex文 ...

  5. 解读:20大5G关键技术

    解读:20大5G关键技术 5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(M ...

  6. Sparrow-WiFi:一款Linux平台下的图形化WiFi及蓝牙分析工具

    工具概述 Sparrow-wifi本质上一款针对下一代2.4GHz和5GHz的WiFi频谱感知工具,它不仅提供了GUI图形化用户界面,而且功能更加全面,可以代替类似inSSIDer和linssid之类 ...

  7. 5G网络的深度强化学习:联合波束成形,功率控制和干扰协调

    摘要:第五代无线通信(5G)支持大幅增加流量和数据速率,并提高语音呼叫的可靠性.在5G无线网络中共同优化波束成形,功率控制和干扰协调以增强最终用户的通信性能是一项重大挑战.在本文中,我们制定波束形成, ...

  8. 小小知识点(二十七)20大5G关键技术

    5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(MEC). 1 网络功能虚拟 ...

  9. D2 前端技术论坛总结(上)

    得幸获得D2前端技术论坛门票一张,今天就去了,公司还给批假了(有可能不会算做请假,哈哈). 早上8点50出门,骑个小毛驴,大概9点30分左右,到了阿里巴巴西溪园区,很多人,进去的门口有专人接待,看D2 ...

  10. 【LaTeX排版】LaTeX论文排版<一>

    本文及接下来的几篇文章主要讲关于毕设论文的排版. 1.论文的整体构架     学校规定论文字数不得少于15000:说明论文属于中篇论文.一般来说,中长篇论文采用book文类,短篇论文采用article ...

随机推荐

  1. Robot Framework 自动化测试随笔(一)

    一.安装Robot Framework步骤(安装目录避免中文和特殊字符,建议以管理员身份进行全部安装过程): 1.查看ride最新支持的python版本,据此下载对应python版本: https:/ ...

  2. Axios向后段请求数据GET POST两种方法的不同之处

    GET请求 向后端请求时,通过URL向后端传递参数 axios({ url:'http://127.0.0.1:9000/get-user-list/', type:'json', //GET方法携带 ...

  3. [MAUI]在.NET MAUI中实现可拖拽排序列表

    .NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖动手势来移动控件.在这篇文章中,我们将学习如何使用拖放手势识别器来实现可拖拽排序列表.在本例中,列表中显示不同大小的磁贴 ...

  4. 形象谈JVM-第三章-即时编译器优化技术

    即时编译器优化技术一览: 相信许多同学看完这个表格,脑子里面嗡嗡的,这些名字也是晦涩难懂,要实现这些优化的技术确实有比较大的难度,但是咱们只是学习,去理解这些技术,其实并不难,下面咱们直接开讲. 首先 ...

  5. Kettle实例(获取Token并带入请求接口拉取数据到本地)

    背景 近期工作中遇到许多需要协同的表单文档被放到云文档,那么我们本地做数据分析就需要先抽取云文档实时数据到本地数据库,根据接口文档我们需要先获取Token,再将返回值带到接口中发起请求拉取数据,因为在 ...

  6. MindSponge分子动力学模拟——软件架构(2023.08)

    技术背景 在前面一篇文章中,我们介绍了MindSponge的两种不同的安装与使用方法,让大家能够上手使用.这篇文章主要讲解MindSponge的软件架构,并且协同mindscience仓库讲解一下二者 ...

  7. QA||TypeError: ‘module‘ object is not callable报错怎么debugIHRM接口自动化测试

    unittest.py生成测试报告时执行报错:TypeError: 'module' object is not callable 代码如下 原因:结合pycharm自动标注和报错信息,分析出应该是H ...

  8. YShow性能测试平台搭建

    ShowSlow安装 ShowSlow是一个YSlow性能数据收集平台,用于将收集的性能数据 ShowSlow是用php实现的,所以我们需要搭建一台服务器来接收YSlow数据 我搭建的环境是:ubun ...

  9. 深入分布式一致性:Raft 和 etcdRaft

    分布式一致性是构建可靠的分布式系统的关键要素之一.为了确保数据的一致性和可用性,一致性算法的设计变得至关重要.在这篇博文中,我们将深入探讨两个与分布式一致性密切相关的主题:Raft 算法和 etcdR ...

  10. 图解 LeetCode 算法汇总——回溯

    本文首发公众号:小码A梦 回溯算法是一种常见的算法,常见用于解决排列组合.排列问题.搜索问题等算法,在一个搜索空间中寻找所有的可能的解.通过向分支不断尝试获取所有的解,然后找到合适的解,找完一个分支后 ...