本期作者/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 来命名流程图:
点击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的了解。
原文始发于微信公众号(蛇矛实验室):软件无线电安全之GNU Radio基础 -上