GNU radio入门学习(2)GNU radio简介

GNU Radio是什么

基本思想

定义

GNU Radio是一个完全开源的软件无线电结构平台,它可以用来设计和仿真,也可以用来链接真实的无线电系统。GNU Radio是一个高度模块化,采用流图类形式的软件架构平台,它本身提供了许多模块库,使用者可以很快速的使用这些模块来建立关于信号处理的流程。

主要思想

GNU Radio是一个通过最小程度地结合硬件(主要是USRP),用软件来定义无线电波发射和接收的方式,搭建无线电通信系统的的开源软件系统。
典型的软件无线电处理流程

软件架构(GNU Radio的"hello world")

GNU Radio 提供一个信号处理模块的库,并且有个机制可以把单个的处理模块连接在一起形成一个系统。编程者通过建立一个流向图(flow graph)就能搭建成一个无线电系统。
信号处理模块是使用 C++来实现的,理论上说,信号数据流不停的从输入端口流入从输出端口流出。信号处理块 (blocks)的属性包括输入和输出的端口数,流过它们的数据的类型。
经常使用的数据流的类型是短整型(short),浮点型(float),和复数 (complex)类型。一些处理模块仅仅有输出端口或者输入端口,它们分别成为信号源(data source)和信号接收器(sink)。有的信号源从文件或者 ADC 读入数据,信号接收器写入文件或者 DAC 或者 PC 的多媒体接口。
GNU Radio 提供了超过 100 个信号处理块,并且扩展新的处理模块也是非常容易的。软件图形化接口和信号处理模块的链接机制是通过 python 脚本语言来进行的。

Python编写"hello wolrd"案例

下面的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图形界面实现"hello wolrd"

GNU Radio的图像界面软件为gnuradio-companion

// 在Linux终端中输入gnuradio-companion
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/.

发布了5 篇原创文章 · 获赞 1 · 访问量 2699

猜你喜欢

转载自blog.csdn.net/zhao527254253/article/details/105706691
GNU