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

打印 上一主题 下一主题

主题 994|帖子 994|积分 2982


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安装

  1. sudo apt-get install libboost-all-dev libusb-1.0-0-dev python-mako doxygen python-docutils cmake build-essential
  2. git clone git://github.com/EttusResearch/uhd.git
  3. cd ~/code/udh/host
  4. sudo mkdir build
  5. sudo cmake ../
  6. sudo make
  7. sudo ldconfig
  8. export LD_LIBRARY_PATH=/usr/local/lib
  9. sudo apt install cmake git g++ libboost-all-dev python-dev python-mako \
  10. python-numpy python-wxgtk3.0 python-sphinx python-cheetah swig libzmq3-dev \
  11. libfftw3-dev libgsl-dev libcppunit-dev doxygen libcomedi-dev libqt4-opengl-dev \
  12. python-qt4 libqwt-dev libsdl1.2-dev libusb-1.0-0-dev python-gtk2 python-lxml \
  13. pkg-config python-sip-dev
  14. sudo apt-get install python3-pip
  15. git clone --recursive https://github.com/gnuradio/gnuradio.git
  16. cd gnuradio
  17. sudo mkdir build
  18. cd build
  19. sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/gnuradio ../
  20. sudo make
  21. sudo make install
  22. sudo vim ~/.barshrc
  23. export PATH=$PATH:/opt/gnuradio/bin
  24. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gnuradio/lib
  25. export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/gnuradio/lib/pkgconfig
  26. 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)


  • 常数信源(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。


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



总结

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





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表