五、配合硬件使用Gnu Radio

到目前为止,本系列教程讲的都是通过围绕Gnu Radio为中心,将它作为原型仿真开发平台进行开发。而Gnu Radio平台的一大优势,就是从仿真到现实世界操作特别容易。在本章, 我们就回顾下前面学到的知识,并用它创造出现实世界中的无线电发射机和接收机。

在本章教程中,我们将带你将之前设计的QPSK发射器转变为真正的无线电发射机。除此之外,我们还将很轻松的创造一个FM收音机,用来接收当地的FM广播电台。在学习的过程中,我们同时会讨论一些与现实世界无线电硬件工作相关的一些问题和建议。

0x510 模拟仿真 vs 现实世界

从模拟仿真到现实世界的迁移通常都会带来很多新的问题新的挑战,无线电与射频领域是非常复杂的学科,在建立现实中的无线电系统时候,需要考虑很多很多问题。在通信系统设计时候,除了理论方面的问题,还有硬件方面的损耗问题,主要是物理介质(比如无线或者信道)\同步设计等等。

要了解更多有关现实世界的无线电障碍,有一个很不错的45分钟视频教程,来自于Matt Ettus在某场会议上的讲述,网址YouTube: Practical Software Radio

如果你想要了解更多有关Gnu Radio的无线电损耗,检查硬件损耗情况,可以看这些配置/gr-channels/grc.

0x520 我们需要什么?

如果你在一个现实世界没有无线电硬件设备可以用,这套教程依然很有用。在第一部分(发射)会教你硬件接口方面的基础知识。对于第二部分,你可以用来自于现实无线电设备的数据记录,用这些没有处理过的原始数据进行测试,我们提供了一份数据记录,可以在gr-tutorials repository找到,你可以用这份数据在你的流图中模拟硬件进行采样。

当然,如果你有一套软件无线电的硬件来运行Gnu Radio,这套教程的作用就更大了。现在有很多而且越来越多的供应商在提供Gnu Radio驱动兼容硬件,从最便宜的几十块钱的接收器到几百几千万的集成系统,因有尽有。

本教程的全部内容基本上都可以用一个简单的、低带宽的、半双工无线电硬件设备完成。大部分的教程,你只要有一个能接收而且频率范围可以调到FM频段的无线电硬件就可以完成,比如RTL2832U方案的电视棒。大多数国家的FM频率范围从87MHz到108MHz,使用的也是大同小异的的地波或者天波。

0x530 安全问题和法律事项

在本教程中,我们需要发射的信号,所以不能将发射天线接口直接连接到频谱分析仪或者其他测试设备上,如果不直接连接到接收设备,就会直接发射到空中。需要注意的是,如果发射天线接口没有任何形式的负载,大功率信号发射时候,空载有可能会损坏发射端无线电设备,或者因为信号太强,损坏接收端无线电设备。所以,一般情况下,在任何硬件任何线缆连接到射频信号发射端天线接口之前,在信号通路上加一个衰减器。

另外,你需要遵守你所在国家或者地区的无线电相关法律规定。不发射肯定不违法,将信号直接发射给分析仪也是个很好的选择,如果你没有分析仪的话,我建议发射部分看看就行,别实际执行流图。

0x540 使用 UHD 模块

在这里我们是用的硬件是Ettus的USRP B200,驱动用的UHD驱动。所以,本教程中所用的硬件sources信号源和sinks接收器都是来自gr-uhd模块。

如果你用的是不同的无线电硬件,就应该用硬件供应商所建议的模块。不同的硬件用不同的模块,比如电视棒使用的gr-osmosdr

为了使用UHD模块,你必须安装UHD驱动,有很多种方法来安装,官方提供了安装教程。如果你的UHD驱动是从源码编译安装的,在CMake编译输出中可以看到gr-uhd在组建清单中,编译安装完成后,在GNU Radio Companion中就能看到UHD模块组。

0x550 创建一个 QPSK 发射器

在阅读本节之前,请仔细阅读前面的法律事项,你需要为你的空中发射行为全权负责!

0x551 再次回顾 QPSK

在这里,我们会用到上一章节讲Python编程时候创建的QPSK流图,在那个教程中,你解调一个QPSK信号并将结果保存到一个文件里,在这里,不再是解调信号,我们将产生并发射一个QPSK信号。

我们需要删除解调模块和文件接收模块,留下QT Constellation Sink模块,最后流程图应该是这样的:

当然,你可以可以直接下载这个流图

如果执行这个流图,可以看到你的QPSK信号的星座图(有一些模拟噪声):

0x551 从模拟到真实发射

现在,我们将从模拟转到真实发射!首先,连接你的发射天线到你的频谱分析仪(如果你打算真正的发射信号)。

由于我们不再有模拟的信号,因此需要移除噪声源和加法器,而且因为我们有一个真实的硬件设备会限制速率,所以也不需要throttle模块,事实上,如果保在流图中留throttle模块的话,很可能会和UHD设备的速率限制冲突,影响性能(更多相关信息,可以看看FAQ)

将模拟仿真转变成真实的无线系统是很容易的,我们在UHD Sink里找到UHD USRP Sink模块,然后添加到刚才的流图的最后的输出当中,当做流图的信号发射模块。

0x552 配置 UHD Sink 参数

Gnu Radio支持变量模块,用户可以创建变量模块,然后通过修改变量模块的参数值来改变整个流图的参数值,这样做非常方便。复制和粘贴samp_rate变量模块两次,修改参数用来控制中心频率freq和增益gain,设置的频率和增益取决于你的硬件支持。我们选择2.421GHz为中心频率,增益设置为30dB,这是这个设备所支持的最大发射增益的1/3

现在,可以利用新的变量模块来调整UHD设备的参数了。打开UDH Sink模块的参数设置窗口(双击或者右键-属性),可以看到一个参数列表,这里有很多参数需要我们调整,向下拉滚动条到列表底部,相应在GeneralRF Options中设置一下属性:

  • Samp Rate (Sps): samp_rate

  • Ch0: Center Freq (Hz): freq

  • Ch0: Gain (dB): gain

  • Ch0: Antenna: TX/RX

  • Ch0: Bandwidth (Hz): samp_rate

要特别注意的一点是,在UHD Sink中任何大于1.0的值都会导致数模转换器饱和,从而引起削波失真,也就是说大于1的振幅都会在1那里截断,所以,通常幅度值都会小于1.0,比如说,我们添可以加一个0.5的乘法器,就可以保证输出是在正确的幅度。

最后,流程图如下:

如果照着说明创建有问题,也可以直接下载

0x553 一台运行的软件无线电发射机

如果执行流程图,你应该可以看到正常的初始化和GUI启动,区别在于这是真实的而不是模拟的,你真真切切的在发射QPSK信号。因为我们的TX信号同时有QT Constellation SinkUHD Sink,所以,我们在Gnu Radio中看星座图的同时,也可以在分析仪中看到它(如果分析仪支持QPSK解码的话)。

如果我们用频谱分析仪看下频谱,可以清楚的看到这个信号的频率正是我们选择的频率。如果看不到,请仔细检查下你的参数设置,或者尽量调高接收增益。

好了,到这里你已经创建了一个完整的QPSK软件无线电发射机了!

0x560 创建一个FM广播接收机

在本节中,我们将构建一个可以用来收听当地FM广播电台的FM接收机。这部分教程是基于Balint Seeber编写的系列教程

0x561 创建软件无线电频谱分析仪

这是一个最基本的(也是非常有用的)用法,你可以在使用Gnu Radio接收信号时候,能够在一个小窗口看到实时的FFT图像,这就是一个软件无线电频谱分析仪。这是很重要的一步,可以验证你的无线电硬件是否能正常运行,然后我们可以用它来确定你做在地区的广播台频率,之后将频率调过去。

创建一个新的流图,添加UHD: USRP SourceQT GUI Sink到工作区,在上一节,我们的频率和增益使用静态变量,在这里我们让它们实时可调。找到QT GUI Range,添加两个到流图中,打开每一个窗口,命名并填入适合你所用硬件的相应参数范围,下面是我所填写的适合USRP B200的参数设置:

QT GUI Range 1:
  • ID: freq

  • Label: freq

  • Default Value: 1e9

  • Start: 70e6

  • Stop: 6e9

  • Step: 10e6

QT GUI Range 2:
  • ID: gain

  • Label: gain

  • Default Value: 0

  • Start: 0

  • Stop: 74

  • Step: 1

修改你的变量模块参数samp_rate为你感兴趣的值,这里我设置为32 MSps。现在,打开UHD: USRP Source的属性,和上一节设置的参数一样,先设置range blocks的对应ID和参数,之后设置UHD Source参数如下:

  • Samp Rate (Sps): samp_rate

  • Ch0: Center Freq (Hz): freq

  • Ch0: Gain (dB): gain

  • Ch0: Antenna: TX/RX

  • Ch0: Bandwidth (Hz): samp_rate

最后流图如下:

同样的,也可以直接下载

0x562 使用你的软件无线电频谱分析仪

运行流图,可以实时看到收到的信号频谱,通过滑块或者直接在文本框修改参数,可以看到图形会实时更新显示效果,而且Gnu Radio默认的QT FFT Sink有很多很有用的功能,比如平保均值和峰值保留,可以花一点时间来熟悉它们。

0x563 创建FM广播接收机

现在,你已经掌握了能让接收到的数据实时显示的基本接收器应用,让我们开始构建一个有用的应用程序吧!关闭现在的流程图,因为我们将在流图中集成更多的功能而不是替换现有功能。

首先,正如你所猜测的,我们需要添加一些模块到流图,找到并添加一下功能模块:

  • 1x Rational Resampler
  • 1x WBFM Receiver
  • 1x Audio Sink
  • 2x Variable

我们的数据传输路线为:USRP Source --> Rational Resampler --> WBFM Receiver --> Audio Sink,按照这个顺序连接这些模块,Gnu Radio会用红色高亮指示出有错误的地方。我们现在通过配置修改参数来解决这些错误。

其次,我们先添加两个新的变量模块,给它们创建两个变量:

Variable:
  • ID: audio_interp
  • Value: 4
    Variable:
  • ID: audio_rate
  • Value: 48e3

我们还要调整之前设置的采样率变量,修改这个变量值为250e3(250 kHz):

Variable: samp_rate
  • ID: samp_rate
  • Value: 250e3

下面再设置三个新的模块:

Audio Sink

这个模块功能很简单的模块,就是输入信号流之后通过喇叭播放出来。这个模块在gr-audio库,这是Gnu Radio发布的核心功能之一。有一些常用的声卡采样率配置,最常见的就是48 khz,这就是我们将要使用的(按照这个配置你的audio_rate变量)。

打开Audio Sink的参数设置,设置为:

  • Sample Rate: audio_rate
  • OK to Block: "No"

现在,我们只需要打开硬件设备采样到数据,就能通过扬声器播放出来!当然,还需要两个模块来处理数据。

Rational Resampler

我们设置USRP Source的速率为samp_rate,也就是我们刚刚设置的250e3。设置Audio Sink的采样率为audio_rate,值为48e3。但是,我们还有个问题,我们的信源采样率不是音频速率的整数倍:250000 / 48000 = 5.208,为了解决这个问题,我们必须进行重采样,这就需要用到Rational Resampler模块,在这里重新采样进行匹配,从而将输入数据流的速率转换成输出流的速率。

重采样模块可以调整数据流速率,它通过插值或者抽取来达到目标采样率。打开这个模块的属性,调整模块参数:

Type改为Complex->Complex,从而告知模块使用复数。现在我们还需要调整实际速率,在这里需要理解一点,如果我们设置的是不同的非常规采样率,代码会将数据进行GCD计算让它能够”勉强”使用。我们知道进来的数据采样率是250 kSps,那我们将抽取值Decimation设定成一样的。但因为采样率是浮点数,所以设置抽取值时候需要注意将其转换为整型,我们可以用Python的函数int()进行转换。

我们还需要设定插值Interpolation速率,这里有个”难点”,因为后面的WBFM模块会进行一个四次抽取,所以我们需要告诉模块之后会输出四次,知道了这些,我们可以利用audio_rateaudio_interp设置。

在这里,最后设置如下:

  • Type: Complex->Complex (Complex Taps)
  • Interpolation: audio_rate * audio_interp
  • Decimation: int(samp_rate)

通过将抽头Taps参数留空,我们告知模块通过电脑自动计算抽头。当没有滤波器抽头生成时候,Fractional BW参数会影响低通滤波器的效果,将这个参数设置为0,我们会只使用一个合理的缺省值。

注意

根据你的硬件参考时钟的准确性,你可能需要调整插值区间和上限。这可能是你需要处理的诸多硬件问题之一。当我第一次运行这个流图的时候,听到了很大的噪音,后来我调整了插值速率,噪音就没有了,我最终设置的参数是:

  • Interpolation: int(1.05 * (audio_rate * audio_interp))
  • Decimation: int(samp_rate)

后面我们设置最后一个模块。

WBFM Receiver

这个模块的配置非常简单,打开模块参数设置,只有两个参数需要设置:输入速率和抽取速率,这两个参数都是已知的,我们只配置了输出的重采样速率,而且我们知道这个速率除以四等于audio_rate,所以我们设置的参数:

  • Quadrature Rate: audio_rate * audo_interp
  • Audio Decimation: audio_interp

0x564 一个正常运行的软件无线电FM广播接收机

现在,在整个流图中应该不会看到任何红色的错误提示,说明这个流图是正确的,最后看到的流图应该如下:

同样的,你也可以直接下载

运行这个流图后,应该会弹出一个类似下面的窗口,然后将频率调整为当地的FM广播电台频率,应该就可以通过计算机的扬声器播放解调后的FM广播。

0x570 结论

学到这里,你已经成功建立了使用Gnu Radio的真实无线电发射机和接收机,虽然都只是很简单的应用,但也说明当涉及到硬件接口时,Gnu Radio的模块化所展现的灵活性和能力。这也证明了使用Gnu Radio从仿真模拟到现实世界运行程序,是很容易的事情。

测验

1、设置一个信号源数据流速率为1 Msps,音频设备工作在32 kHz,该怎么设置用于重采样输入数据流的插值和抽取参数值?

2、如果音频设备工作在44.1 kHz呢?是否有合理的插值和抽取整数值能够产生满足这种重采样?你该如何使用任意PFB重采样替代呢?

文章参考

http://gnuradio.org/redmine/projects/gnuradio/wiki/Guided_Tutorials