0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

软件无线电安全之GNU Radio基础知识

蛇矛实验室 来源:蛇矛实验室 2024-02-25 10:20 次阅读

本期作者/0xc4se

GNU Radio介绍

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

调制与信号处理流程

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

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

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

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

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

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

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

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

GNU Radio安装

sudo apt-getinstall 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 mkdirbuild
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.0python-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-getinstall python3-pip
git clone --recursive https://github.com/gnuradio/gnuradio.git
cdgnuradio
sudo mkdirbuild
cdbuild
sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/gnuradio ../
sudo make
sudo makeinstall
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 来命名流程图:

df6737a4-d233-11ee-a297-92fbcf53809c.png

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

df932e72-d233-11ee-a297-92fbcf53809c.png

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

df9f78da-d233-11ee-a297-92fbcf53809c.pngdfba1960-d233-11ee-a297-92fbcf53809c.png

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

dfd1a6d4-d233-11ee-a297-92fbcf53809c.png

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

dff3e56e-d233-11ee-a297-92fbcf53809c.png

定义变量

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

e0073eac-d233-11ee-a297-92fbcf53809c.png

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

e0156be4-d233-11ee-a297-92fbcf53809c.png

运行时更新变量

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

e033c67a-d233-11ee-a297-92fbcf53809c.pnge04364fe-d233-11ee-a297-92fbcf53809c.png

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

e0fd6d2c-d233-11ee-a297-92fbcf53809c.png

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

e10f62ac-d233-11ee-a297-92fbcf53809c.pnge125045e-d233-11ee-a297-92fbcf53809c.pnge146ec7c-d233-11ee-a297-92fbcf53809c.png

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

e159f308-d233-11ee-a297-92fbcf53809c.png

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

e16a9eba-d233-11ee-a297-92fbcf53809c.png

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

e185fa2a-d233-11ee-a297-92fbcf53809c.png

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

e1a0744a-d233-11ee-a297-92fbcf53809c.png

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

e1b6d366-d233-11ee-a297-92fbcf53809c.png


QT GUI Chooser效果如下。

e1d808ec-d233-11ee-a297-92fbcf53809c.pnge1f2d8f2-d233-11ee-a297-92fbcf53809c.png

信号数据类型

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

e218bcd4-d233-11ee-a297-92fbcf53809c.png

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

e23c38b2-d233-11ee-a297-92fbcf53809c.png

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

e24a25da-d233-11ee-a297-92fbcf53809c.pnge27214aa-d233-11ee-a297-92fbcf53809c.png

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

e28d2844-d233-11ee-a297-92fbcf53809c.png

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

e294ce28-d233-11ee-a297-92fbcf53809c.png

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

e2a956ea-d233-11ee-a297-92fbcf53809c.png

数据类型转换

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

e2ccc88c-d233-11ee-a297-92fbcf53809c.png

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

e2d43d42-d233-11ee-a297-92fbcf53809c.png

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

e2f4dda4-d233-11ee-a297-92fbcf53809c.png

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

e306ab74-d233-11ee-a297-92fbcf53809c.png

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

e3211aa4-d233-11ee-a297-92fbcf53809c.png

其他

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

信号波形生成器(Waveform Generators)

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

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

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

调制器(Modulators)

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

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

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

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

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

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

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

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

界面(GUI)

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

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

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

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

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

数学运算(Math Operators)

绝对值(Abs)

相加(Add)

复数共轭(Complex Conjugate)

相除(Divide)

积分(Integrate)

取对数(Log10)

相乘(Multiply)

均方根(RMS

相减(Subtract)

信道模型

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

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

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

滤波器(Filters)

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

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

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

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

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

傅里叶分析

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

克斯塔斯环(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。

e34080a6-d233-11ee-a297-92fbcf53809c.png

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

e3631328-d233-11ee-a297-92fbcf53809c.png

总结

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 无线通信
    +关注

    关注

    56

    文章

    4197

    浏览量

    142326
  • 软件无线电
    +关注

    关注

    10

    文章

    194

    浏览量

    28501
  • 开源
    +关注

    关注

    3

    文章

    2985

    浏览量

    41718
  • GNU
    GNU
    +关注

    关注

    0

    文章

    141

    浏览量

    17333

原文标题:软件无线电安全之GNU Radio基础 -上

文章出处:【微信号:蛇矛实验室,微信公众号:蛇矛实验室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于组件的软件无线电(1)#软件无线电

    软件无线电
    未来加油dz
    发布于 :2023年07月03日 21:29:12

    基于组件的软件无线电(2)#软件无线电

    软件无线电
    未来加油dz
    发布于 :2023年07月03日 21:30:00

    认知无线电技术实现和挑战

    的认知无线电原型进行了比较和分析。然后重点说明基于USRP(通用软件无线电外设)和GNU radio的认知
    发表于 04-24 09:09

    Software Defined Radio Handbook,软件无线电手册

    Software Defined Radio Handbook,软件无线电手册,入门级,感觉写的很好,推荐参考!
    发表于 09-09 22:10

    软件无线电无线电的技术概述及应用

    是一种新型的体系结构,是一种解决方案,同时强调通过动态的软件编程可以对相同的硬件进行重构,使完成不同的功能等思想。SDR 的第3 种定义,已经超出了通信领域,它讨论的是现代无线电工程。相比一个
    发表于 08-21 15:23

    深入学习GNU Radio你需要知道些什么

    学习开源软件无线电(GNU Radio)需要有一定电脑基础和深入的通信与信号处理知识,本文列举了一些有用的资源,包括教程、网页链接和一些在线
    发表于 05-28 07:41

    什么是GNU Radio开源软件无线电平台?

    GNU Radio开源软件无线电平台究竟是什么?
    发表于 08-02 08:18

    什么是GNU Radio

    什么是GNU Radio? 开放的软件无线电平台有什么优势?
    发表于 08-02 08:13

    开源软件无线电(GNU Radio)基础教程

    学习开源软件无线电(GNURadio)需要有一定电脑基础和深入的通信与信号处理知识,本文列举了一些有用的资源,包括教程、网页链接和一些在线教程。本教程的目的是帮助GNURadio爱好者们为这个
    发表于 11-21 18:39 2w次阅读

    了解GNU Radio

    GNU Radio(开源软件无线电)是一个对学习,构建和部署软件定义无线电系统的免费
    发表于 11-21 20:34 4267次阅读

    如何在Linux下搭建GNU Radio平台及它的应用分析

    GNU Radio是一个开源的软件无线电开发平台,可以通过图形化界面或C++、Python等文本语言快速开发软件
    的头像 发表于 01-02 07:56 3728次阅读
    如何在Linux下搭建<b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>平台及它的应用分析

    学习GNU Radio需要应该如何准备

    学习开源软件无线电GNU Radio)需要有一定电脑基础和深入的通信与信号处理知识,本文列举了一些有用的资源,包括教程、网页链接和一些在线
    发表于 11-18 10:31 2次下载
    学习<b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>需要应该如何准备

    GNU Radio开源软件无线电平台的简介

    GNU Radio(开源软件无线电)是一个对学习,构建和部署软件定义无线电系统的免费
    发表于 10-26 10:41 1次下载
    <b class='flag-5'>GNU</b> <b class='flag-5'>Radio</b>开源<b class='flag-5'>软件</b><b class='flag-5'>无线电</b>平台的简介

    GNU Radio:开放的软件无线电平台

    GNU Radio:开放的软件无线电平台介绍。
    发表于 05-27 11:07 10次下载

    软件定义无线电(SDR)基础知识

    电子发烧友网站提供《软件定义无线电(SDR)基础知识.pdf》资料免费下载
    发表于 11-23 11:11 0次下载
    <b class='flag-5'>软件</b>定义<b class='flag-5'>无线电</b>(SDR)<b class='flag-5'>基础知识</b>