GNU Radio是一个完全开源的软件无线电结构平台,它可以用来设计和仿真,也可以用来链接真实的无线电系统。GNU Radio是一个高度模块化,采用流图类形式的软件架构平台,它本身提供了许多模块库,使用者可以很快速的使用这些模块来建立关于信号处理的流程。
GNU Radio是一个通过最小程度地结合硬件(主要是USRP),用软件来定义无线电波发射和接收的方式,搭建无线电通信系统的的开源软件系统。
GNU Radio 提供一个信号处理模块的库,并且有个机制可以把单个的处理模块连接在一起形成一个系统。编程者通过建立一个流向图(flow graph)就能搭建成一个无线电系统。
信号处理模块是使用 C++来实现的,理论上说,信号数据流不停的从输入端口流入从输出端口流出。信号处理块 (blocks)的属性包括输入和输出的端口数,流过它们的数据的类型。
经常使用的数据流的类型是短整型(short),浮点型(float),和复数 (complex)类型。一些处理模块仅仅有输出端口或者输入端口,它们分别成为信号源(data source)和信号接收器(sink)。有的信号源从文件或者 ADC 读入数据,信号接收器写入文件或者 DAC 或者 PC 的多媒体接口。
GNU Radio 提供了超过 100 个信号处理块,并且扩展新的处理模块也是非常容易的。软件图形化接口和信号处理模块的链接机制是通过 python 脚本语言来进行的。
下面的python文件是一个 GNU Radio 的“Hello World”的例子。它产生两个 sine 波形并且把他们输出到声卡,一个输出到声卡的左声道,一个输出到右声道。
// Linux终端命令
sudo vi Dial_tone.py
//注意保存不成功,修改文件权限
sudo chmod 777 Dial_tone.py
// 在编辑器中添加以下案例代码
#!/usr/bin/env python
#
# Copyright 2004,2005,2007 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
# GNU Radio is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GNU Radio is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
from gnuradio import gr
from gnuradio import audio
from gnuradio.eng_option import eng_option
from optparse import OptionParser
class my_top_block(gr.top_block):
def __init__(self):
gr.top_block.__init__(self)
parser = OptionParser(option_class=eng_option)
parser.add_option("-O", "--audio-output", type="string",
default="",
help="pcm output device name. E.g., hw:0,0
or /dev/dsp")
parser.add_option("-r", "--sample-rate", type="eng_float",
default=48000,
help="set sample rate to RATE (48000)")
(options, args) = parser.parse_args ()
if len(args) != 0:
parser.print_help()
raise SystemExit, 1
sample_rate = int(options.sample_rate)
ampl = 0.1
src0 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 350,
ampl)
src1 = gr.sig_source_f (sample_rate, gr.GR_SIN_WAVE, 440,
ampl)
dst = audio.sink (sample_rate, options.audio_output)
self.connect (src0, (dst, 0))
self.connect (src1, (dst, 1))
if __name__ == '__main__':
try:
my_top_block().run()
except KeyboardInterrupt:
pass
在这个例子中,我们首先调用 gr_sig_source_f 产生两个 sine 波形模块,src0 和src1。后缀 f 表面这个信号源的数据类型是浮点型的,一个波形是 350HZ,另外一个是 440HZ,合在一起他们听起来像一个美国电话拨号音。audio_sink 是一个接收器,它把接收到的信号输入到声卡 中。
我们把 3 个信号处理模块用流向图的 connect 方法连接到一起。connect 方法有两个参数,源端点和目的端点,用来建立一个从源到目的处理模块的链路。每个端点(endpoint)有两个成员:一个信号处理模块和一个端口号。端口号表示哪个输入或者输出端口应该被连接的。
通常端点使用 python 语言的 tuple 来表示,像:(block,port_number)。当端口号是 0 时,port_number 可以被省略。例如下面的两个表示方法是一样的:
fg.connect ((src1, 0), (dst, 1))
fg.connect (src1, (dst, 1))
一旦流向图被建立了,我们调用 start 生成一个或者多个线程去运行它,按下任意键这个程序就会退出。
GNU Radio的图像界面软件为gnuradio-companion
// 在Linux终端中输入gnuradio-companion
gnuradio-companion
//成功则会打开软件,如下图所示:
在最右侧分别选中Signal Source、Throttle、QT GUI Sink三个模块,并且用鼠标左键点击两对端口链接两个模块。最后点击界面上方的绿色三角(类似于电影播放按钮)运行并保存文件,如果成功则会出现下图所示的示波器,否则会报错,根据错误修改模型即可。
GNU Radio 是硬件独立的。也就是说除了我们熟悉的 USRP 以外,还有其他一些硬件可以用 GNU Radio:比如说一种 cable modem tuner(型号 mc4020,用来接收 FM 广播);另外还有一些业余无线电设备也用 GNU Radio。
如今带有单独浮点运算单元的上 GHZ 的 CPU 已经很常见了,这给台式机实现数字信号处理功能带来了可能。一个 3G 的 Pentium 或者 Athlon 处理器能够每秒处理 30 亿次浮点 FIR 运算。我们现在能够在 PC 上建立软件通讯系统,这是几年前所不敢想象的。
你的硬件要求依赖于你想做什么。总的来说,一个 1G 或者 2G 带有 256M 内存的机器应该是足够了。你也需要一些其他的模拟外设连接在你的 PC 上,包括内置 的声卡或者 96 kHz, 24-bit 高保真声卡。使用这些模拟设备,你只能处理有限的窄带信号。另外的方案是使用高速的 PCI 模拟到数字的外设,这些设备可以达到 20M 的抽样率,但是他们是比较昂贵的,差不多是买一台 PC 的价钱。使用这些高速板,调制解调器可以作为 RF 前端来使用。
为了有一个性价比更好的外设,Ettus 等人设计了一个通用软件无线电外设
(USRP)。这也是目前绝大部分 GNU Radio 用户所用的硬件。
简要介绍了GNU radio以及其"hello world"案例,接下来的文章将会详细介绍GRC(GNU Radio Companion)的模块及其功能。
[1] GNU radio官网入门手册 ;
[2] 黄琳、海曼无线教材《GNU Radio入门》;
[3] 博客链接: https://www.cnblogs.com/moon1992/p/5739027.html/.