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

描述

本期作者/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-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 来命名流程图:

GNU

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

GNU

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

GNUGNU

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

GNU

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

GNU

定义变量

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

GNU

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

GNU

运行时更新变量

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

GNUGNU

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

GNU

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

GNUGNUGNU

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

GNU

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

GNU

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

GNU

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

GNU

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

GNU


QT GUI Chooser效果如下。

GNUGNU

信号数据类型

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

GNU

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

GNU

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

GNUGNU

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

GNU

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

GNU

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

GNU

数据类型转换

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

GNU

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

GNU

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

GNU

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

GNU

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

GNU

其他

以上为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。

GNU

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

GNU

总结

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

 

 审核编辑:汤梓红

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分