海曼无限 WWW.OPEN-MESH.COM.CN / GNURADIO 中国 WWW.GNURADIO.CC
GNU Radio 入门
GNU Radio / USRP / OpenBTS
Version 0.99
译作者译作者::黄琳 等
7/21/2010
前 言
GNU Radio 是一个软件无线电软件,与便宜的(相对于大多数软件无线电板卡
来说) USRP 结合在一起,就构成了一个非常灵活的开发平台,让我们可以像
开发小软件一样,轻松的开发无线设备。因为它的开放性和低成本,
Radio 和 USRP 现在已经在中国和全世界拥有越来越多的用户。
GNU
我从 2005 年开始接触 GNU Radio,作为中国最早的一批 GNU Radio 用户,我
GNU Radio 上开发了各种
们(我和我的同事们,朋友们,网友们,学生们)在
各样的系统,积累了很多经验。
每年,当我们的项目有新人加入的时候,他们往往需要花很长时间阅读网络上
的 wiki ,各种零碎的英文文档,从而熟悉这套软件。每到这个时候,我就希望
能有一套系统的中文文档,能够让第一次接触
角色。这就是我编写这本书的初衷。另一方面,也希望这本书能够让更多不了
解 GNU Radio 的人了解它,从而开始考虑,是否也可以用软件无线电技术来实
现你想做的东西,你的创意。
GNU Radio 的人能够快速的进入
今年 4 月,我组织了海曼无限和
这本书。历时两个多月,本书终于初具雏形。很可惜,
完成,相信会在不久的将来补充进来。
GNURADIO 中国论坛的一些朋友,开始编写
OpenBTS 的部分还没有
我希望,每一位读者朋友,都用很短的时间读一下这本书,也许半天,也许两
三天,相信你一定会有所收获。对于新人来说,你可以很快的对
一个整体的印象,然后定位在你所关注的要点上;对于已经有
经验的人来说,你可以快速浏览一遍,也许你会发现,哦这个功能我以前没有
用过,或者激发出你新的想法。
GNU Radio 有
GNU Radio 使用
由于大家都是业余时间编写本书,时间仓促,水平有限,书中难免会有错误的
地方,欢迎大家在 www.gnuradio.cc 论坛以及海曼无限的 QQ 群 96384043 对本
书提出宝贵意见,也可以邮件联系我
大 :P)。
huanglin_bupt@163.com (有可能时延很
感 谢 参 与 本 书 编 写 的 海 曼 无 限 的 Wu Yanjun 提 供 很 多 中 文 资 料 , 感 谢
gnuradio.cc 的 meteor, qq 群的食杂铺子, leo 和 zhuhu 参与编写。谢谢大家的支
持!
黄琳
2010 年 7 月
2
目 录
第 1 章 GNU Radio 是什么 ..................................................................................... 6
1.1 软件无线电的基本思想 ................................................................................. 7
1.2 软件架构 ......................................................................................................... 8
1.2.1 “ Hello World”- Dial tone .................................................................... 8
1.2.2
Flow graph (流图)和 Block (模块) ............................................... 10
1.3 硬件架构 ....................................................................................................... 10
1.3.1
USRP ,从启动过程说起 ...................................................................... 11
1.3.2 数字中频—— FPGA 的职责 ................................................................ 11
第 2 章 USRP, GNU Radio 的硬件平台 ............................................................. 13
2.1
USRP 母板 .................................................................................................... 13
2.1.1 模数转换器部分 .................................................................................... 14
2.1.2 数模转换器部分 .................................................................................... 14
2.1.3 辅助模拟 I/O 端口 ................................................................................ 15
2.1.4 辅助数字 I/O 端口 ................................................................................ 15
2.1.5
FPGA ..................................................................................................... 15
2.2
USRP2 母板 .................................................................................................. 18
2.3 子板 ............................................................................................................... 19
2.3.1
Basic TX/RX 子板 ................................................................................. 20
2.3.2 低频发射 /接收子板 .............................................................................. 21
2.3.3
2.3.4
2.3.5
TVRX 子板 ............................................................................................ 21
DBSRX 子板 ......................................................................................... 22
RFX 系列子板 ....................................................................................... 22
2.4 电源 ............................................................................................................... 24
2.5 时钟同步问题 ............................................................................................... 24
2.5.1 同步所有子板本地晶振 ........................................................................ 24
2.5.2 同步多个 USRP..................................................................................... 25
第 3 章 GNU Radio 安装 ....................................................................................... 26
3.1 安装需求 ....................................................................................................... 26
3.2
3.3
Ubuntu 下安装 .............................................................................................. 26
Fedora 下安装 ............................................................................................... 27
3
3.4 装好之后可以做的第一件事 ....................................................................... 29
3.4.1 如果你有 USRP..................................................................................... 29
3.4.2 如果你没有 USRP................................................................................. 30
第 4 章 GNU Radio 编程基础 ............................................................................... 32
4.1 在使用 GNU Radio 之前的预备知识 .......................................................... 32
4.1.1 对 GNU Radio 做一个更清晰的认识 .................................................. 32
4.1.2 数字信号处理( DSP)知识 ................................................................ 33
4.1.3 通信系统知识 ........................................................................................ 34
4.2 如何编写 Python 应用程序——逐行学习 .................................................. 34
4.2.1 概述 ........................................................................................................ 34
4.2.2
FM 接收机源代码 ................................................................................. 35
4.2.3 第一行 .................................................................................................... 37
4.2.4 导入需要的模块( module ) ................................................................ 38
4.2.5 顶层模块 wfm_rx_graph ....................................................................... 40
4.3 流图,模块和连接的原理 ........................................................................... 44
4.3.1 顶层模块 my_top_block ....................................................................... 45
4.3.2 运行程序 ................................................................................................ 48
4.4 图形界面的使用 ........................................................................................... 48
4.4.1 频谱分析仪 ............................................................................................ 49
4.4.2
wxPython 是如何工作的 ...................................................................... 49
4.4.3 示波器 .................................................................................................... 53
4.5 处理命令行参数 ........................................................................................... 53
4.6
GNU Radio 中常用的 block ......................................................................... 54
4.6.1 信号源 .................................................................................................... 55
4.6.2 信宿( Signal Sinks ) ........................................................................... 58
4.6.3 简单运算( Simple Operators ) ........................................................... 59
4.6.4 类型转换( Type Conversions ) .......................................................... 62
4.6.5 滤波器( Filters ) ................................................................................. 63
4.6.6
FFT ......................................................................................................... 68
4.6.7 其他一些有用 block .............................................................................. 69
4.7 如何编写 C++ blocks ................................................................................... 70
4.7.1 最简单的方法——利用模板 ................................................................ 70
4
4.7.2
block 的结构和原理 .............................................................................. 74
4.7.3 命名规则 ................................................................................................ 80
4.7.4 如何把 C++与 Python 连接在一起 ...................................................... 81
4.8 如何使用外部库文件 ................................................................................... 84
第 5 章 应用范例解读 ........................................................................................... 86
5.1
OFDM Tunnel ............................................................................................... 86
5.1.1 系统框图和 MAC 帧的构成 ................................................................. 87
5.1.2 物理层 .................................................................................................... 88
5.1.3 开发和调试方法 .................................................................................... 90
5.2
MIMO............................................................................................................ 91
5.2.1
MUX 参数的含义 ................................................................................. 91
5.2.2 代码示例: 2 天线接收 ......................................................................... 94
5.2.3 代码范例: 2 天线发射 ......................................................................... 96
第 6 章 GNU Radio 的其他应用 ......................................................................... 101
6.1 商业应用 ..................................................................................................... 101
6.2 国防和国土安全 ......................................................................................... 101
6.3 无线研究 ..................................................................................................... 102
6.4 教学 ............................................................................................................. 102
6.5 其他应用 ..................................................................................................... 103
第 7 章 其他的 SDR 平台简介 ............................................................................ 104
7.1 几种 SDR 平台简介 ................................................................................... 104
7.2 微软的 SORA ............................................................................................. 106
7.2.1
SORA 上已经实现了什么系统? ...................................................... 106
7.2.2 硬件接口板: RCB ( Radio Control Board ) .................................... 107
7.2.3 软件架构 .............................................................................................. 108
7.2.4 如何提高 CPU 做通信信号处理的速度 ............................................ 108
7.2.5
SORA 对 TDMA 的支持 .................................................................... 110
5
第 1章
GNU Radio 是 什么
GNU Radio 是一个通过最小程度地结合硬件(主要是
无线电波发射和接收的方式,搭建无线电通信系统的开源软件系统
说, 现在那些高性能的无线电设备中所遇到的数字调制问题将变成软件问题。
USRP),用软件来定义
。也就是
我们都知道 GNU 这个非常成功的自由软件项目,它包括
软件,也包括大批应用软件。但
是存在着很大的盲区。
件(自由的软件,价格合理便宜的硬件)给大众,以图填充这个空白。
GNU 在涉及硬件开源尤其是无线射频方面还
Gnu Radio 通过提供一套信号处理软件模块和相关联硬
Linux 这样的操作系统
GNU Radio 应用程序用 Python 语言来编写,真实的信息处理过程是由
扩展库来实现的。因此开发者可以获得实时高效的可复用的应用开发环境。虽
然 GNU Radio 并不是主要用于仿真,但也可以不用真实硬件,而使用预先记录
或生成的数据来开发信号处理算法。
C++浮点
让我们来给几个简单的例子,看看
GNU Radio 可以用来做什么:
? 学生和研究人员用它来开发物理层信号处理算法,
协议。因为所有的通信协议,从上至下都是
以像使用普通软件一样快速自如的修改、编译和运行,可以灵活地在多
个协议层之间互操作。当你撰写学术论文的时候,这些真实的实验结果
常常能够为你的论文增色不少。
MAC 层甚至更上层的
PC 机上的软件代码。你可
? 创业型小公司或者学校里做横向开发项目的人,他们通常用它来开发原
型设备( prototype )。比如做一个支持多种制式的家庭网关,因为所有
的东西都是“软”的,所以开发起来非常快,出现问题的时候也容易修
改。
? 用来做高校里的教学用实验平台。比如做通信原理实验,现在大部分实
验都是用 Matlab 仿真来做的,当有了 GNU Radio ,你就可以看到真正的
信号星座图,频率漂移等现象。而且它可以是一个远程的平台,供很多
学生同时使用。
? 业余无线电爱好者,他们用
GNU Radio 来搭建自己的电台。我猜想,它
可以让你同时在多个频道上呼叫。不过我不知道这是否违反无线电使用
规定。
? 黑客!这是用户中很大的一个群体。特别是
OpenBTS ,也就是 GNU
Radio 上的 GSM 基站开发出来之后,加上 GSM 加密的破解算法,这吸
引了很多对 GSM 网络感兴趣的人。当然,相反的,反黑客的人,我们
的无线电监控部门,军方的实验室,也对此很有兴趣。
GNU Radio 还可以做什么呢?发挥你的想象力吧。
本章将简单从软件无线电的基本概念开始,介绍
GNU Radio 的各个部分。
1
1
本章的余下部分主要翻译节选自
Eric Blossom 的“ Exploring GNU Radio ”
6
1.1 软件无线电的基本思想
图 1-1 典型的软件无线电处理流程
上图表示一个典型的软件无线电处理流程图。为了理解无线电的软件模块,首
先需要理解和其关联的硬件。在这个图中的接收路径上,能够看到一个天线,
一个神奇的 RF 前端,一个模拟数字转换器
连续模拟的自然世界和离散的数字世界的桥梁。
ADC 和一堆代码。 ADC 是一个连接
ADC 有两个主要特性,抽样率和动态范围。抽样率是
ADC 数字
度,动态范围是 ADC 区别最低信号值和最大信号值的精度,这决定
8 位的 AD 转换器最多能代表 256 个信号层
信号输出的比特数(位数)。例如,
次,而一个 16 位的转换器能够代表 65536 个层次信号。总的来说, ADC 的物
理特性和价格决定了抽样率和动态范围。
ADC 测量模拟信号的速
在我们深入研究软件之前,先来了解一些理论知识,在
物理和电子学家 Harry Nyquist 提出了如果 AD 转换想没有混叠现象发生,那么
抽样率至少是目标信号带宽的
1927 年,出生于瑞典的
2 倍。
混叠现象就像是车子重复的碾在过去的车轮印迹上一样,让你分不清楚是本次
的还是以前碾过的车轮印迹。假设我们要处理一个低通信号,我们感兴趣的信
号带宽是 0 到 fmax ,按照 Nyquist 理论,抽样率必须至少是 2*fmax 。如果我们
的 ADC 工作在 20MHZ ,但是我们想收听 92.1MHZ 的 FM 电台,我 们该怎么办
呢?答案是使用 RF 前端,接收机的 RF 前端能够把它接收到的高频段信号下变
频到一个低频段信号后输出。例如,我们能让
信号下变频到 0-10MHZ 的低频范围内,那么我们的
上用场了。
RF 前端把 90- 100MHZ 频段内的
20MHZ 的 ADC 就能够派
RF 前端当作一个信号控制的黑盒子,负责处理输入信
大多数情况下,我们把
号的中心频率。举一个具体例子,一个调制解调器的调制模块能够把
800M 之间的 6M 带宽的信号下变频到一个中心频率是
这个输出的中心频率通常称作中频
(IF) 。
50M 到
5.75MHZ 的信号输出。
7
GNU Radio 用
按照越简单越易用的原则, RF 前端最好也能够被去掉。有一个
户已经成功的使用一个 100 英尺(译注:一英尺等于 12 英寸,合 0.305 米)的
天线直接连接到一个 20M 抽样率的 ADC 上收听到了 AM 和短波广播。
1.2 软件软件架构架构
1.2.1 “Hello World ” - Dial tone
Dial tone
GNU Radio 提供一个信号处理模块的库,并且有个机制可以把单个的处理模块
连接在一起形成一个系统。编程者通过建立一个流向图(
成一个无线电系统。
flow graph)就能搭建
信号处理模块是使用 C++ 来实现的,理论上说,信号数据流不停的从输入端口
流入从输出端口流出。信号处理块
过它们的数据的类型。
(blocks) 的属性包括输入和输出的端口数,流
经常使用的数据流的类型是短整型
型。一些处理模块仅仅有输出端口或者输入端口,它们分别成为信号源
source)和信号接收器 (sink) 。有的信号源从文件或者
器写入文件或者 DAC 或者 PC 的多媒体接口。
(short), 浮点型 (float), 和复数 ( complex )类
(data
ADC 读入数据,信号接收
GNU Radio 提供了超过 100 个信号处理块,并且扩展新的处理模块也是非常容
易的。软件图形化接口和信号处理模块的链接机制是通过
行的,
python 脚本语言来进
例 1 是一个 GNU Radio 的 “Hello World”的例子。它产生两个 sine 波形并且把他
们输出到声卡,一个输出到声卡的左声道,一个输出到右声道。
例子 1.输出拨号音
#!/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.
#
8