软件无线电安全之GNU Radio基础 -上

news/2024/5/17 12:42:31

GNU Radio介绍

GNU Radio是一款开源的软件工具集,专注于软件定义无线电(SDR)系统的设计和实现。该工具集支持多种SDR硬件平台,包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图,使用不同的模块实现信号处理、滤波、解调等功能。GNU Radio提供了丰富的信号处理库,支持实时和离线操作,广泛应用于无线通信、雷达、无线电天文学等领域。其强大的社区支持和详细的文档使开发者能够更好地使用这一工具,灵活、可定制地构建和测试各种无线通信系统。

调制与信号处理流程

人类的可听范围为20 - 20000kHz。相对而言,这些频率远低于FM无线电广播频率。因此,音频波只能传播很短的距离。广播电台想要远程传输声音和音乐的音频信号。那么电台就需要将音频信号中的信息传输到更高频率的载波上。这些波可以比人们可听见的波传播得更远、更快。这个过程称之为调制。调制有几种不同的类型,我们经常收听的FM 广播电台,使用的是频率调制。

在软件无线电(SDR)行业中,数字信号是以离散形式表示的信号,即信号的幅度、频率和相位在时间上是离散的。这与模拟信号不同,模拟信号是连续的。数字信号的处理涉及将模拟信号转换为数字形式,通过一系列离散的处理步骤对其进行操作,最后将结果重新转换回模拟信号。

以下是数字信号在软件无线电行业中的处理步骤:

  1. 模数转换(Analog-to-Digital Conversion,ADC)过程:模拟信号首先通过模数转换器(ADC)转换为数字信号。目的:将连续的模拟信号在时间和幅度上进行离散化,以便计算机能够处理。

  2. 数字信号处理(Digital Signal Processing,DSP)过程:数字信号经过一系列数字信号处理算法,如滤波、混频、解调等。目的:在数字域中对信号进行操作和处理,以提取、增强或变换信号的特定特征。

  3. 数模转换(Digital-to-Analog Conversion,DAC)过程:处理后的数字信号通过数模转换器(DAC)转换为模拟信号。目的:将数字信号还原为连续的模拟信号,以便在后续的模拟电路或设备中使用。

  4. 输出阶段过程:模拟信号经过可能的放大器、滤波器等设备后,最终输出到用户的设备,如扬声器或显示器。目的:将数字信号处理的结果转换为可感知或可用的模拟信号。

在软件无线电中,这些步骤通常在计算机上通过专用软件(例如本小节中的GNU Radio)执行。这种数字信号的处理方法使得系统更加灵活,能够适应不同的通信标准和应用需求。

GNU Radio安装

sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils cmake build-essential
git clone git://github.com/EttusResearch/uhd.git
cd ~/code/udh/host
sudo mkdir build
sudo cmake ../
sudo make
sudo ldconfig
export LD_LIBRARY_PATH=/usr/local/lib
sudo apt install cmake git g++ libboost-all-dev python-dev python-mako \
python-numpy python-wxgtk3.0 python-sphinx python-cheetah swig libzmq3-dev \
libfftw3-dev libgsl-dev libcppunit-dev doxygen libcomedi-dev libqt4-opengl-dev \
python-qt4 libqwt-dev libsdl1.2-dev libusb-1.0-0-dev python-gtk2 python-lxml \
pkg-config python-sip-dev
sudo apt-get install python3-pip
git clone --recursive https://github.com/gnuradio/gnuradio.git
cd gnuradio
sudo mkdir build
cd build
sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/gnuradio ../
sudo make
sudo make install
sudo vim ~/.barshrc
export PATH=$PATH:/opt/gnuradio/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gnuradio/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/gnuradio/lib/pkgconfig
export PYTHONPATH=$PYTHONPATH:/opt/gnuradio/lib/python2.7/dist-packages

GNU Radio使用

第一个流程图

打开终端运行gnuradio_companion命令,会显示如下界面,界面中有Options和Variable俩个块。我们双击 Options 块,我们可以通过编辑 Id 和 Title 来命名流程图:

图片

点击file->save,输入grc文件的名称后保存GRC流程图。

图片

我们可以进入保存grc的目录下进行查看,发现保存了一个grc文件和生成了一个python文件。其中grc文件包含了在 GRC 中显示流程图的信息,python文件则包含实际的 Python 流程图代码。

图片

图片

返回gnuradio打开的grc文件中,键盘使用ctrl+f或者点击菜单栏中的放大镜按钮可以进行模块搜索。这里我们分别搜索 Signal Source 、Throttle、QT GUI Frequency Sink 和 QT GUI Time Sink模板,并按照下图顺序将每个块拖放到工作区中。随后依次点击上一个块out口和下一个块的in口,连接效果如下。

图片

点击Execute按钮(菜单栏中绿色的三角按钮)启动程序,我们可以看到如下的波形:

图片

定义变量

我们搜索var,然后将Variable变量模块拖入工作区中。并将其id命令为frequency。

图片

双击Signal Source,修改Sample Rate的值为samp_rate变量,即可将定义的samp_rate=32k值赋值给Signal Source的。修改Frequency的值为frequency变量。

图片

运行时更新变量

GNU Radio 模块库自带 QT GUI 模块,这些模块允许在运行时对流程图进行交互和修改。QT GUI Range 模块会创建一个滑块,可用于运行时更新变量。我们搜索range并将QT GUI Range块拖入工作区中:

图片

图片

QT GUI Range是一个可变滑块,使用该模块需要设置 QT GUI Range默认值。我们将ID修改为frequency,然后将Default Value设置为 0。这里的start和stop是滑块的开始值和停止值。我们设置起始值为 -samp_rate/2 ,停止值设置为 samp_rate/2 。step是滑块的步长。我们这里将步长设置为 100 Hz ,并点击apply。

图片

点击运行流程图后,效果如下。我们可以滑动按钮来修改frequency的值。

图片

图片

图片

QT GUI Chooser为变量创建选项下拉菜单。我们可以搜索Chooser,并将 QT GUI Chooser拖放到工作区中。

图片

修改QT GUI Chooser的ID值后,点击apply,发现报错。

图片

这里是因为我们前面的QT GUI Range块已经引用了frequecy变量,导致冲突。

图片

我们右击QT GUI Range块,点击disable将其禁用,禁用该块后显示为灰色。

图片

此时已经显示正常,我们此时点击运行流程图。

图片

QT GUI Chooser效果如下。

图片

图片

信号数据类型

块上的每个输入和输出端口都将具有与之关联的数据类型。数据类型由输入和输出端口的颜色标识,我们单击 Help->Types可以进行查看:

图片

窗口显示数据类型及其关联的颜色,这些颜色对应于 GRC 中模块的输入和输出端口。

图片

下面示例流程图中使用 Complex Float 32 数据类型,该数据类型使用一对 32 位浮点数来表示复杂样本的实部和虚部。

图片

图片

运行流程图显示绘制在时域中的复数信号,其中信号 1 是实数分量,信号 2 是复数信号的虚数分量:

图片

将所有数据类型转换为 Float 后,我们重新运行该流程图:

图片

Signal Source 模块创建一个实际输出,该输出显示为时域中的唯一信号:

图片

数据类型转换

搜索 Random Source 块并将其拖动到工作区中:

图片

该块默认为 Integer 32 数据类型。双击该块以打开属性并将数据类型修改为 byte:

图片

Random Source 和 Throttle 模块之间的红色箭头表示需要修复的数据类型错误。双击 Throttle 模块,我们将数据类型更改为 byte:

图片

QT GUI Time Sink 没有 char 数据类型,我们选择float类型。GNU Radio 模块库附带了类型转换器下列出的各种数据类型转换器。搜索 Char To Float 模块,将其拖动到工作区中,然后将其连接到流程图中。

图片

现在所有红色错误都消失了,按播放按钮启动流程图。QT GUI Time Sink 现在将显示来自随机源块的数据,该块随机化为 0 和 1:

图片



其他

以上为gnuradio几个基础模块的使用方法,除了上面用到模块的使用,常见的其他模块使用效果如下:

信号波形生成器(Waveform Generators)

  1. 常数信源(Constant Source) - 生成固定幅度的常数信号。

  2. 噪声信源(Noise Source) - 生成各种类型的噪声信号,如高斯噪声。

  3. 信号源(Signal Source) - 生成各种信号类型,如正弦波、方波等。

调制器(Modulators)

  1. AM解调(AM Demod) - 解调幅度调制(AM)信号。

  2. 连续相位调制(Continuous Phase Modulation) - 进行连续相位调制。

  3. 相位偏移调制与解调(PSK Mod/Demod) - 进行相位偏移调制和解调。

  4. 高斯频移键控调制与解调(GFSK Mod/Demod) - 高斯频移键控调制和解调。

  5. 高斯最小频移键控调制与解调(GMSK Mod/Demod) - 高斯最小频移键控调制和解调。

  6. 正交振幅调制调制与解调(QAM Mod/Demod) - 进行正交振幅调制和解调。

  7. 宽带调频接收(WBFM Receive) - 宽带调频调制的接收端。

  8. 窄带调频接收(NBFM Receive) - 窄带调频调制的接收端。

界面(GUI)

  1. 星座图(Constellation Sink) - 可视化星座图。

  2. 频域图(Frequency Sink) - 显示信号频谱的频域图。

  3. 时域图(Time Sink) - 显示信号的时域波形图。

  4. 直方图(Histogram Sink) - 显示信号的直方图。

  5. 瀑布图(Waterfall Sink) - 显示频谱随时间变化的瀑布图。

数学运算(Math Operators)

  1. 绝对值(Abs)

  2. 相加(Add)

  3. 复数共轭(Complex Conjugate)

  4. 相除(Divide)

  5. 积分(Integrate)

  6. 取对数(Log10)

  7. 相乘(Multiply)

  8. 均方根(RMS)

  9. 相减(Subtract)

信道模型

  1. 衰落信道模型(Fading Model) - 模拟信号在信道中的衰落效应。

  2. 动态信道模型(Dynamic Channel Model) - 模拟动态变化的信道特性。

  3. 频率选择性衰落模型(Frequency Selective Fading Model) - 模拟频率选择性衰落的信道。

滤波器(Filters)

  1. 带通/带阻滤波器(Band Pass / Reject Filter)

  2. 低通/高通滤波器(Low / High Pass Filter)

  3. 无限冲激响应滤波器(IIR Filter)

  4. 均方根余弦滤波器(Root Raised Cosine Filter)

  5. 抽取有限冲激响应滤波器(Decimating FIR Filter)

傅里叶分析

  1. 快速傅里叶变换(FFT) - 执行快速傅里叶变换以分析信号的频谱。

  2. 克斯塔斯环(Costas Loop) - 一种相位同步技术,通常用于解调PSK调制的信号。

实验:制作一个FM receiver流程图

该实验我们使用osmocom_source 模块来接收FM信号,设置中心频率center_freq=97.9MHz,设置了一个滑块channel_freq,默认频率为97.9MHz。这里需要注意,channel_freq是收听广播的频率,center_freq是接收信号的中心频率。其中采样率设置为变量samp_rate=10MHz(采样率决定了接收信号的范围,以中心频率为中心左右各5MHz。),Ch0:Frequency (Hz)设置为变量center_freq=97.9MHz。用一个Signal Source产生一个频率为center_freq-channel_freq的余弦波来与osmocom Source模块的输出相乘,进行频谱搬移。流程图中低通滤波器(低通滤波器就是只允许频率低于截止频率的波通过的滤波器,高于截止频率的波会被直接消除)的截止频率设置为75kHz,过渡带宽为25kHz,Decimation抽取值为int(samp_rate/channel_width)=50,经过此模块后的采样率由10MHz变为了200kHz。使用Rational Resampler模块来继续调整采样率,以此来满足后续Audio Sink模块需要的48kHz做准备。经过Rational Resampler模块作用,采样率变化过程为200k*12/5=480kHz。使用WBFM接收模块来进行WBFM解调,其中Audio Decimation为10,表示将采样率480kHz要变为480k/10=48kHz,以此来适应Audio Sink所要求的48kHz。Quadrature Rate表示的是WBFM Receive模块所期望的输入采样率为480kHz。

图片

点击运行后,即可收听97.9MHz频率的波段。这里虽然可以收听到FM电台,但是声音一样有断续,左下角控制终端一直输出aUaU...。经过查阅相关资料后发现是虚拟机音频欠载的原因,目前该问题未解决,切换至windows实体机则不会出现该问题。该流程图后续优化将frequency设置为滑块并设置初始和结束值,便可以很方便的修改收听频率。

图片

总结

这一小节,我们简单使用了GNU Radio软件,我们通过GNU Radio Companion(GRC)创建了简单的流程图,展示了信号生成、处理和输出的流程。最后通过制作一个FM receiver来加深对GNU Radio的了解。

图片


http://www.mrgr.cn/p/47032143

相关文章

常见分类算法

一、ChatGPT 在人工智能和机器学习领域,分类算法是一种监督学习技术,用来识别输入数据所属的类别。以下是一些常见的分类算法: 1. 决策树(Decision Trees): 决策树通过创建一系列的问题或决策,来将数据…

【无标题】PHP-parse_str变量覆盖

[题目信息]: 题目名称题目难度PHP-parse_str变量覆盖1 [题目考点]: 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有:$$&…

HarmonyOS-基础之状态数据共享

1、LocalStorage页面级UI状态存储,通常用于UIAbility内、页面间的状态共享(1) 先抛出一个疑问疑问:如何实现一个页面中所有组件的数据共享?解决:使用LocalStorage技术(2) 页面级状态内存存储只能在一个页面中的所有组件中共享 退出应用不存在(3) 相关APILocalStorage({name…

vue中使用aplayer插件做一个网页音乐播放器

我们在浏览网页的时候,时常会看到一些网页音乐播放器,本文以vue为例,使用aplayer插件,做一个简单的网页播放器。我们先看一下效果图效果图正常模式吸底模式当然还有迷你模式,就是能隐藏的都隐藏,这里不赘述,做相应配置就会出现对应效果。注意,吸底模式会出现上一曲下一…

视频拍摄知识+AIGC数据预处理

视角 参考链接:https://www.polarpro.com/blogs/polarpro/filmmaking-101-types-of-camera-shots-and-angles Low Angle Shot 低角度拍摄、horizontal Shot 平视、Dutch Angle Shot 荷兰角斜拍、High Angle Shot 高角度拍摄、Bird’s-eye / Aerial Shot 鸟瞰 / 航…

神通数据库测试环境调优过程

神通数据库测试环境调优过程背景 同事中午时反馈一个环境速度很慢. 我通过grafana简单看了下应用的 jvm信息还有hikari都很正常. 没有大量FullGC,也没有很多失败的提示. 感觉很奇怪. 当时已经过了中午,想着下午再看. 1点时想起来, 应用没问题, 可能是数据库的异常. 才发现自己…

golang 使用栈模拟计算器

思路: // Author sunwenbo // 2024/4/12 16:51 package mainimport ("errors""fmt""strconv" )// 使用数组来模拟一个栈的应用 type Stack struct {MaxTop int //表示栈最大可以存放数的个数Top int //表示栈底&#xff…

CTF中常见的四种python逆向

pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,pyc 文件是 Python 编译过的字节码文件。它是 Python 程序在运行过程中由源代码(通常是 .py 文件)自动或手动编译产生的二进制文件。说在前面:什么是py…

【笔试训练】day5

今天的题,最后一题忘公式了,卡了一会推出来了 1、游游的you 思路: 看清题目意思就行,这里的相邻两个o可以重复算,也就是说,“ooo”算2分。 先算you的得分,再算oo 对了,不开long lo…

手动给docusaurus添加一个搜索

如果algolia不能自动配置的话,我教你手动给docusaurus添加一个搜索新版博客用docusaurus重构已经有些日子了,根据docusaurus的文档上也申请了Algolia,想一劳永逸的解决博客的搜索问题。但是流水有意,落花无情。 algolia总是不给我回复,我只能对着algolia的申请页面仰天长叹。…

python聊天室

python聊天室 文章目录 python聊天室chat_serverchat_client使用方式1.局域网聊天2.公网聊天 下面是一个简单的示例,包含了chat_client.py和chat_server.py的代码。 chat_server chat_server.py监听指定的端口,并接收来自客户端的消息,并将消…

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)

目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre(美客多)于2021年10月18号上线了新预约入仓系统,在MercadoLibre美客多平台上,新入仓预约系统是一项非常重要的功能&#x…

CTFHUB-技能树-Web前置技能-文件上传(前端验证—文件头检查)

CTFHUB-技能树-Web前置技能-文件上传(前端验证—文件头检查) 文章目录 CTFHUB-技能树-Web前置技能-文件上传(前端验证—文件头检查)前端验证—文件头检查题目解析 各种文件头标志 前端验证—文件头检查 题目考的是:pn…

利用Python进行数据分析 原书第2版 (Wes McKinney)pdf下载

链接:https://pan.baidu.com/s/18MOC0666S-EX_0ks4ivR2g 提取码:rmkk 本书由Python pandas项目创始人Wes McKinney亲笔撰写,详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。第2版针对Python 3.6进行全面修订和更新,涵盖新版的pandas、NumPy…

<计算机网络自顶向下> 多路复用与解复用

多路复用/解复用 端口号区分进程到进程多路解复用工作原理 解复用作用:TCP或者UDP实体采用哪些信息,将报文段的数据部分交给正确的socket,从而交给正确的进程主机收到IP数据报 每个数据报有源IP地址和目标地址每个数据报承载一个传输层报文段…

算法:期望场景;鲁棒优化

部分代码 for i1:T stst[D_DGk(i)*min_P_DG<P_DGk(i)<D_DGk(i)*max_P_DG]; end for i2:T indicatorD_DGk(i)-D_DGk(i-1); rangei:min(T,iT_up-1); st st[D_DGk(range)>indicator]; end for i2:T indicatorD_DGk(i-1)-D_DGk(i); rangei:min(T…

神经网络训练速度相关学习--1

2024-04-18 程序执行的调用顺序: cpu接收到指令,执行——从存储器中加载数据到cpu,对数据进行预处理——预处理后的数据传输gpu——gpu执行运算——将运算结果存储到存储器——开始新一轮batch运算(每一次计算都需要从内存中读取数据) 另外参考:先将硬盘中的数据读取到内…

LeetCode——572—— 另一棵树的子树

1.题目 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/subtree-of-another-tree/ 给你两棵二叉树 root 和 subRoot …