Using GNU Radio with Hardware
目标
- GNU Radio如何将仿真和真实世界连接起来
- 你能做什么,你允许做什么?
介绍
到目前为止,本系列的所有教程都围绕着通过模拟使用GNU Radio作为原型开发平台。然而,GNU Radio的一个巨大优势是,从模拟到现实操作是非常容易的。在本教程中,我们将基于您迄今为止学到的内容,创建真实的发射器和接收器。本教程中,我们将采取您以前的QPSK设计,并将其变成实际的发射机。我们还将从头开始构建一个完整的FM无线电接收器,您可以使用它来收听您的本地FM广播电台。
仿真和实现
从仿真到实现也带来了一系列新的挑战需要解决。无线电和RF工程是非常复杂的学科,在构建实际的无线电系统时有很多需要考虑的。除了设计通信系统理论的挑战之外,现在还需要处理来自无线电硬件的损耗,由物理介质(即无线或有线信道)引入的问题,同步设计等。
要了解更多关于现实世界无线电损伤的信息,一个不错的入门是马特·艾特斯的约45分钟的教程。你可以找到它的视频:YouTube:实用软件收音机
如果您想直接在GNU Radio中了解有关无线电损耗的更多信息,请查看/ gr-channels / grc中的硬件损耗模型。
What Will I Need?
如果你没有实际的收音机工作,本教程仍然有用。第一部分(传输)将向您介绍与硬件接口的基础知识。对于第二部分,您可以简单地使用来自实际收音机的录音,而不对数据做任何处理。我们提供了一个录音,您可以在gr-tutorials存储库中找到它。您可以在流程图中使用它来模拟传递样本的硬件。
但是,如果你有一块可以与GNU Radio一起使用的无线电硬件,本教程将是最有用的。有越来越多的供应商为硬件提供GNU Radio驱动程序,它们从非常便宜的20美元接收器到非常高性能的数万美元系统。但是,如果你有一块可以与GNU Radio一起使用的无线电硬件,本教程将是最有用的。有越来越多的供应商为
参考:http://gnuradio.org/doc/doxygen/page_msg_passing.html,参考的这是API文档,翻译已经完成,戳这里可以看。
Programming Topics
Tags, Messages and PMTs
目标:
- 学习PMTs
- 理解tags是什么/有什么用/如何用
- 理解stream和message passing的区别
- 更多高级block方面的知识
前提:
- 熟悉C++和Python
- 前面四个教程
目前我们已经讨论过一个block到另外一个block的数据流。这些数据往往是采样点,一个数据流的结构会更有意义。例如,一个声卡会源源不断的产生声信号。
在某些情况下,我们不想管道采样流,而是将单个消息传递到另一个块,例如“这是突发的第一个采样”,或者“将发送频率改变为144MHz” 。或者考虑在PHY顶部的MAC层:在较高的通信级别,数据通常在PDU(协议数据单元)而不是流中传递。
在GNU Radio中,我们有两种机制来传递这些消息:
- 与数据流同步,则用stream tags
- 与数据流移步,则用message passing interface
要传递的消息可能是字符串、数组向量、字典表或其他类型的信息,为使消息能够在不同的模块间传递,需要将不同类型的信息抽象为某⼀一特定的数据类型。Python是弱类型语言,在创建变量时无需声明类型。而C++是强类型语言,在创建变量前必须已知它的类型。GNURadio的软件架构决定我们需要在Python和C++中使⽤用同⼀一数据对象,为了解决消息信息类型不同的矛 盾,我们引⼊入了polymorphic types(PMTs),使承载不同信息类型的消息变量转化为统⼀的 PMT类型。!
多形态类型(PMT)
5.1.1 介绍
多态类型用作从一个块/线程到另一个块的数据的载体,例如流标签(stream tags)和消息传递接口(message passi
Working with GNU Radio in C++
目标
- 增加用C++编程GNU Radio的知识
- GNU Radio中C++的API,尤其是:
- types
- 通用函数
- GNU Radio blocks
- 学习管理和用C++编写自己的OOT模块
- 基于一个实例讨论OOT模块
- 在tutorial的module中,我们将用c++建立My QPSK Demodulator作为我们的QPSK解调。
- 理解开发OOT模块的差别
- 本节包含一些GNU Radio框架的高级主题,
- 这些主题用于OOT模块中的一些特殊实现
前提:
- C++基础
- 之前的章节学习
4.1 C++还是Python?
这是我们每个人都需要思考的问题,在tutorial3中我们已经展示了gr_modtool在创建blocks时可以选择语言,像下面这样:
$ gr_modtool add -t sync -l python
亦或
$ gr_modtool add -t sync -l cpp # This is the default
这两种语言除了编译器和解释器之外,还有其他区别。比如,当性能不是主要因素时,可以考虑python,因为它很简洁,并且测试十分方便。考虑到性能时,用c++往往更有意义。所以,具体选择哪一模块,需要主观上的考虑。
4.2 使我们的OOT模块变的灵活
我们将介绍gr_modtool制作OOT模块和用c++编写blocks
gr_modtool命令的具体介绍,参考tutorial3里关于gr_modtool的介绍,或者快速查看如下表格:
Name | Alias | Description |
---|---|---|
help | h | Enlist the operations available |
disable | dis | Disable block (comments out CMake entries for files) |
info | getinfo, inf | Return information about a given module |
remove | rm, de | R |
Working with GNU Radio in Python
目标
- Python Blocks
- OOT模块实现功能
- 如何添加OOT
- 如何用gr_modtool添加python block以及如何编写
- QPSK mapping
- 如何添加GRC绑定
前提
- 安装GNU Radio3.7.4 和 之后版本
- 建议了解 GRC Tutorial
* 熟悉python
3.1 简介
本节分为三个部分。首先是如何建立、改变和简单理解GRC产生的python文件。其次,是如何从头开始建立自己的OOT模块。最后,我们举一个实际项目作为例子。和上一节一项,所有的源文件都在gr-tutorial repository中。
3.1.1 GRC生成的python文件
先看一个GRC的例子
点击Generate按钮,终端里会显示它生成了一个.py文件。打开该文件,代码如下:
#!/usr/bin/env Python
##################################################
# Gnuradio Python Flow Graph
# Title: Tutorial Three
# Generated: Wed Mar 12 15:35:18 2014
##################################################
from gnuradio import analog
from gnuradio import audio
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
class tutorial_three(gr.top_block):
def __init__(self):
gr.top_block.__init__(self, "Tutoria
使用GRC开发交互式项目 - Part 1
当我开始使用GRC来开发Nutaq demonstration projects到时候,我发现GRC是一个快速、易用的开发环境。在GRC中,你可以用用户输入的组件去快速实现一个信号检测的GUI。可是,我想,这几乎是一个线性的工作流程:源模块->处理模块->仿真模块,而没有反馈机制。虽然用户可以在GUI中查看时域频域和动态改变项目的参数,但是这种反馈机制的确实限制了其应用范围。
如果我直接用python去写一个应用,我可以用任何我需要用的算法,但是我喜欢基于模型的GRC环境。GRC让你很容易理解一个设计,而非通过阅读上百行的代码。
另一种开发自己定制blocks的方法是使用更多复杂的算法或者整合状态机到我的数据流中。这种方式更加吸引人。但是免不了需要写数行代码,这个导致GRC不能不言自明。
最近,我发现Measurement Tools中probe block的存在。用这些模块,数据流可以被转化为变量。一旦你能拿到这些变量,你可以用算法和数学方式去应用反馈到项目参数中去。这正是我在寻找的。
Probe blocks
Probe Signal
Probe Signal block将数据流转化成一个变量中。为了获取当前数据流的值,必须调用其level函数。这个函数是异步于数据流的,它仅仅可以检测当前数据流的值,而非每一个采样点。其他blocks如Probe Signal Vector可以轮询一个向量流的值,Probe Rate可以轮询一个数据流的平均吞吐量。
在一个Python项目中,the Probe Signal的level函数需需要被执行去获取当前值。
val = self.probe.level()
因为在GRC中这个函数不能直接被调用,所以Function Probe block需要使用
Function Probe
这个Function Probe block用来以某一速率调用另一个