LimeSDR学习笔记(2) 基础AM/FM收发与GNURadio上手

在这篇文章里,我将讲解最基本的,使用GNURadio-Companion配合LimeSDR进行AM与FM信号的收发的过程。利用SDR进行广播收发是最简单的测试SDR的功能是否正常的方法,也是很好的熟悉GNURadio开发的入手点。

声明

在一些国家和地区,未经审批在某些频率进行无线电收发是不合法的。在进行本文中所描述的实验时,请确保你已经熟悉本地的相关法律法规。如果可能,在发射时请尽量使用一定的屏蔽措施来降低对其他设备的干扰。我不对任何因学习和使用本文描述的技术造成的后果负任何责任。

AM与FM信号

在这篇文章里我将讲解的是AM与FM的收发,更具体的来说,是常用的广播波段的AM与FM广播信号的收发。虽然我觉得应该没什么必要,但是还是稍微讲一下这两种信号比较好。

AM广播信号

AM广播信号,即调幅(Amplitude Modulation)广播信号,是常见的广播信号的一种。虽说AM在日常中见到的最多的是广播,但是在其他方面也有很广的应用。实际上,AM和FM是最基本的两红信号调制方法之一。AM是将载波调制为幅度不一的信号波形,一般情况下载波的频率是不变的,所以最后得到的波频率也是固定的。它的特点是因为是对于幅度的调制,所以在信号波衰减比较快的时候信息损失也很严重(直观上来看,波衰减严重的时候就很平,不加以更强的放大的话很难读取信息),这就是为什么AM广播一般在室外,比较空旷的地方信号好一些,在室内远离窗户的地方基本收不到。而且接收的时候对天线的朝向,谐振效果都有要求。

FM广播信号

FM广播信号,即调幅(Frequency Modulation)广播信号,也是常见的广播信号。它的特点是对于载波进行了频率上的调制,通过频率变化来传递信息。所以实际上FM调制信号的频率是在载波频率附近摆动的。如果用瀑布图显示的话很明显,AM信号是一条亮度不一的直线,FM信号是一条连续但是快速摆动的曲线。因为它是对幅度的调制,而幅度在波衰减的时候一般不变,所以相对地接收起来容易一些。

GNURadio-Companion介绍

GNURadio-Companion(简称GRC)是用来绘制GNURadio流图的一种工具。熟悉一些利用流图开发的工具(比如FPGA块图,Raptor流程图)的人会比较好理解,就是利用一些现有的模块,以一定结构组合在一起,调整参数,实现高级的功能。GRC本质上还是生成了Python脚本,但是利用流图开发简化了很多的开发步骤。

FM接收实现

在进行实际的设计之前,首先确定安装了完整的GRC和gr-limesdr模块。在之前的文章中我也提到,LimeSDR在GRC中是有专门的包的,最好只使用这个包开发,而不要用其他的兼容驱动。

首先熟悉一下模块:

使用到的模块

首先是LimeSDR Source,这个模块可以理解为例化了一个LimeSDR的接收通道,输出格式是Complex格式的信号。它是gr-limesdr的一部分。

QT GUI Frequency Sink,这个模块是QT GUI的一部分,因为归根到底GRC还是使用Python,所以可以很方便地使用QT来实现GUI。这个模块是用来显示频率的,将生成一个窗口,包括一个频率-增益频谱图。

Low Pass Filter,低通滤波器。注意SDR开发的一个基本原则是,SDR只负责将信号传递回来,也就是说,凡是在LimeSuite里面能设置的,都是SDR自身的功能,剩下的都不是。SDR在一些情况下能简单地处理信号(毕竟LimeSDR搭载了一块FPGA),这需要通过直接对SDR编程来实现。其他的信号处理,例如这里我们用的低通滤波器,实际上是用电脑上运行的程序即时处理信号,不需要有实际的射频电路支持(比如我在这里用了低通滤波器,我的SDR上并没有因此多出来一个)。低通滤波器就是只允许频率低于截止频率的波通过的滤波器,高于截止频率的波会被直接消除。因为是数字滤波,所以对传回来的波形没有破坏,消除率也很高。

Rational Resampler,这是一个降采样模块。因为我们在信号接收的时候采样率非常高(几M到几十M),但是实际上音频信号采样率要低很多(几十k),所以一方面没有必要保留这么高的采样率,会占用大量运算资源,另一方面采样率不匹配最后输出的音频会很奇怪。所以在数字解调中,一般会在合适的时候对输入的波形进行降采样,和后面匹配上。但是在哪里降采样是比较需要注意的,如果在刚接收到波形就降采样,还不如本身就用低采样率去接收……一般是在对波形的处理之后(例如刚才的滤波器,或者倍乘器,放大器等等之后),真实解调之前(有的解调模块不能接受很高的采样率)。

WBFM Receive,这是针对WBFM(Wide-Band FM)的解调模块,也是FM收音机的核心模块。

Multiply Const,是一个乘法器,作用是把输入波形乘以一个数再输出。

Audio Sink,可以理解为例化了一个实际的音频输出设备。送至这个模块的信号,在模块内设置好之后,最终会被送到某个音频输出设备。

构建接收机

在刚才的解释之后,明白怎么构建一个接收机就很容易了。以下是最简单的搭建办法:

具体配置可以放大图片之后看。需要注意的是,LimeSDR的接收增益很容易被忽略,需要设置成一个比较高的数值,否则基本没有接收到的东西。

配置完成之后,点击运行即可运行。需要注意的是,LimeSDR Source需要一个设备标识参数,这个参数可以在配置完LimeSDR的环境之后(具体可以参考上一篇博客),连接LimeSDR,运行

LimeUtil --find

观察输出可以得到这个序列号。

FM发射实现

在尝试过使用LimeSDR接收FM信号之后,用它发射信号就容易很多了。基本思路是一样的,先将信号源配置和调试,滤波等等成合适的状态,再进行调制,最终发射。

使用到的模块

Wave File Source和Audio Source,这是两个不同的音频源,一个是从文件中读取,另一个是从设备中获取。但是需要注意的是,因为Linux下所有的东西都是以文件的形式进行处理的,所以音频设备不会直接给出选项。此时留空就是默认设备,如果要选择其他的音频输入设备,需要明确自己的音频驱动是什么,单独写一个配置文件,为总线上的设备指定一个名称和调用方法。

Fractional Interpolator,分数插值器,是用来进行插值法升采样的模块。在这里的作用是让信号的采样率匹配。

QT GUI Sink,是QT的一个综合性GUI模块,包含4个图形,频率,时域,瀑布图和李萨如图,可以节约空间和流图复杂度。

WBFM Transmit,是WBFM的调制模块,将声音信号调制到载波上。

LimeSDR Sink,是例化的LimeSDR发射机,配置方法与LimeSDR Source大同小异。

构建发射机

FM发射机的实现也很简单。

AM收发实现

AM调制与解调

AM信号的调制与解调非常简单。因为AM本质上是把要传输的信号和载波直接做乘法,所以不需要额外做调制,只需要调高采样率用需要频率的载波发射出去就可以。同样地,也不需要解调,直接调低采样率输出就可以。因为SDR是基于数字化采样的方式,所以实现AM收发很容易。

LimeSDR在民用AM频率段上的收发

LimeSDR-USB(也就是我用的这种板子)支持的频率范围是100kHz到3.8GHz,但是上面的射频前端的物理频率最低只到30MHz低于30MHz的部分需要将射频频率调到30MHz,由NCO将信号调制到所需的频率。这样的做法,效果可想而知。因为LimeSDR主要还是设计来在比较高的频率上进行收发(基站,卫星等等),所以本身电路设计上对比较低的频率优化就不怎么样。

所以需要注意的是,在此之前我们在GNURadio COmpanion的配置中都把NCO频率设置为0,也就是不启用。但是现在需要你通过计算来设置NCO频率,才能在500k~1600kHz的范围进行通信。因为比较简单直接给出设计: