LimeSDR官方系列教程(六):使用Pothos和GNU Radio接收ASK/OOK信号
作者:互联网
本文内容、开发板及配件仅限用于学校或科研院所开展科研实验!
温馨提示:“开源SDR实验室”是北京的。
在本节,我们将研究接收和发送单极性不归零码序列的ASK信号,即把一个幅度取为0,另一个幅度为非0,这通常称为开关键控(OOK),该调制方式是经常用于门铃和车库门遥控器中。如果您要进行这个实验,则需要一些额外的硬件,并且需要433MHz(UHF)ASK/OOK设备,比如:车库门遥控器钥匙扣(以下简称钥匙扣)。
目录
一、ASK
ASK是一种最简单的调制技术。实现ASK调制最简单的一个方式是发射一个固定的音调表示1,不发射表示0,即开和关,这就是OOK。其中的音调通常成为载波频率,在本次实验中,使用的载波频率即为433.9MHz。二进制启闭键控(OOK:On-Off Keying)又名二进制振幅键控(2ASK),它是以单极性不归零码序列来控制正弦载波的开启与关闭。该调制方式的出现比模拟调制方式还早,Morse码的无线电传输就是使用该调制方式。由于OOK的抗噪声性能不如其他调制方式,所以该调制方式在卫星通信、数字微波通信中没有被采用,但是由于该调制方式的实现简单,在光纤通信系统中,振幅键控方式却获得广泛应用。该调制方式的分析方法是基本的,因而可从OOK调制方式入门来研究数字调制的基本理论。(百度百科:https://baike.baidu.com/item/ook/9996982?fr=aladdin)
正如上文所述,这可以看做是一个非常简单的通信协议——如此简单,可以在足够快的示波器上直接观察到并通过我们的眼睛进行解码。
根据无线电接收的实际情况,我们的通信电路需要时间来锁定和调整频率/增益。SDR和传统电路均是如此。以钥匙扣为例:这些钥匙扣的发射频率通常有点“松动”,即中心频率可能会漂移。
1、频率偏移
频偏在模拟电路中可以通过某种形式的控制环路锁定到载波,并调整接收电路使其匹配来解决,其中PLL或简单的自谐振电路是常见的解决方案,其解决的总体方案的工作原理是相同的。在SDR中可以以相同的方式来解决此问题,或者以牺牲数字滤波或同频抑制为代价,而频漂可以在某种程度上忽略它。我们假设接收设备具有足够的捕获带宽,而实际上,使用合适的接收器,ASK可以很好地抵抗频率漂移和相位变化,因此通常不必担心频漂这个问题。
2、增益
无论是在传统电路和SDR电路中,幅度都是一个值得关注的问题。通常情况将需要通过某种形式的增益控制来对其进行处理,其中AGC(自动增益控制)是最好的方式,不够也可以对其进行手动设置。在硬件中,这可以通过调节LNA来解决,而在软件中,则可以对信号乘以相应的放大倍数,这两种方式都有其优点。
3、前导码
为了锁定信号及其增益,我们的设备不能在接收到载波后的皮秒级时间内开始接收数据,因为增益控制和频率控制都需要时间来锁定。解决方案是产生一个前导码-简单来说,就是给予一段信号周期,该信号周期将允许接收机在传递实际数据之前将其锁定。该技术不仅限于RF通信,您正在阅读此技术的计算机可能都要每秒执行百万/十亿次的前导信号周期,因为DDR RAM需要PLL来锁定时间(就像RF接收器一样)。
二、确定中心频率
我们将使用从eBay购买的无线钥匙扣作为ASK信号的来源并进行解码。在欧洲,这些钥匙扣通常使用免许可的433MHz频段【这是翻译的原文,我们可以用自己的无线车钥匙或者家里用的无线门铃】。但是,如果想要做到有效解码,我们还需要找到该频段下的确切频率。
使用LimeSuiteGUI,这个问题就迎刃而解了,我们可以使用“FFT viewer”来检测信号传输的频率。在“SXR”选项卡中的频率更改为433MHz,我们可以获得FFT,当按下钥匙扣的按键时,应该可以观察到该频段内出现了一个新的峰值。 通过重新调谐直到这个新的波峰位于中心,我们可以找到确切的频率。图中可以看出我们的频率为433.9MHz。
三、接收信号程序设计
如上图所示,非常容易理解到接收信号的主要过程:信号在接收部分或数字域(或两者)中需要获得一些增益,然后经过解调部分,我们就可以将数据从信号中解调出来。由于我们在上文中已经对Pothos已经所有了解,现在我们就利用它来实现。第一步,通过添加SDR设备源(具有频率控制功能)和“Wave Monitor”,我们就拥有了接收所有ASK信号的一个最简单的设备。第二步,将调谐控件参数设置为433.9MHz并按下遥控钥匙扣的按钮,此时我们就能看到出现了一些微小的波形改变。因为这是设计的一种最简单的接收器中,所以性能不是很好,还有进一步改进的空间。比如,我们对信号需要一些增益的处理,此时添加一个“Periodogram”是个好主意。这与频谱分析仪给出的图相同。当我们的信号开始随着增益的改变而失真时,我们想看到一个信号的频谱图,以此来估计信号失真的严重程度。理想情况下,在信号传输过程中。我们希望信号开始出现失真(例如出现超过1个峰值)之前获得最大增益。在我们的例子中,20dB是比较理想的,随着增益进一步增加,信号开始出现失真。使用时序的波形图时,我们可以看到中心频率处有一个很大的尖峰。这是RF信号的DC(直流)分量。我们可以使用“DC remove”模块将其消除。接着往下看,此时信号仍然有点微弱,因此我们可以:
- 以数字方式增加信号的增益
- 增加图形的视觉增益
对波形进行进一步的放大会增加视觉效果,但效果有待您去进一步评估。“Wave Monitor”具有用于对波形进行缩放的“轴”控制,尽管这不是解调波形的好方法,因为它需要缓慢的人机界面,即使最快的智能示波器也很难解调信号,并且会丢失很多信号。那么,让我们来解决这些问题。为了获得增益,我们添加了一个乘法器以将信号放大20倍。从简单的解码方法“Envelope Detector”开始,使用此控件的主要目的在于检测载波包络(打开时)并将其转换为数字输出。
在“normal”模式下添加“Wave Trigger”,我们可以观察到信号(类似于示波器)。可以在“Wave Trigger”和“Wave Monitor”上调整点数,以查看整个传输信号的细节。如果钥匙扣的code是静态的,则足以手动解码或将码序列保存到文件。此时,我们就拥有了一个简单但有效的ASK接收器了。
四、GNU Radio
到目前为止,我们还未谈到GNU Radio。其实,Pothos与GNU Radio的联系非常紧密,在许多方面都相似,并且还能够与GNU Radio结合使用。使用了Pothos GUI之后,GNU Radio Companion GUI应该会感到很熟悉。如果尚未安装,请立即安装。(具体安装方法可参考开源SDR实验室博客)就像Pothos一样,我们解调信号的流程是相同的:Radio->Gain->Demod->Analysis。要将LimeSDR与GNU Radio一起使用,我们需要使用“osmocom Source”并将设备参数设置为“driver=lime,soapy=0”。【其实,早就有了gr-limesdr,推荐大家安装使用】https://wiki.myriadrf.org/Gr-limesdr_Plugin_for_GNURadio
说到这里,我们需要指出GNU Radio与Pothos的一些重要区别。在GNU Radio中,建立一个新文件,我们会自动得到2个模块。第一个是“Variable(变量)”模块,该模块将“sample_rate”定义为一个变量,它定义的采样率被程序中的所有控件使用。另一个是“Options(选项)”,其中包含一些设置选项。我们需要将采样率更改为1e6(1Msample/s),将“Generate options”更改为WX(双击该模块即可)。 QT/WX是不同的可视化,并且由于我们要在程序中使用的模块多数在多数在WX的规范下,因此需要更改为WX。使用GNU Radio,我们有很多方法可以重新生成在Pothos中生成的ASK波形。我们使用了下面这些模块的某种组合:
- DC blocking block
- RMS block
- thresholds block
- Freq Xlating FIR Filter
- AM modulation block
- Clock Recovery MM
鉴于我们的目标是设计ASK解码设备,因此我们采取最方便的方法。就此而言,使用“Clock Recovery Module”是将数据恢复为二进制数据并保存到文件的最佳方案。我们发现这是一个设计很复杂的模块,因此,可以肯定下面的配置不是最优的,要想充分利用该模块并不容易。我们调整的唯一参数是“omega”值。经过一些反复试验,我们选择了可接受的初始值为18。我们的采样率为1Msample/sec。这是一个“悬空手指”(finger in the air)的猜测,因为我们尚不知道最终的符号率。请注意,如果使用“Wave Trigger”,则采样率现在变为“samp_rate/samp_per_sym”。
当我们下变频之后,时钟恢复模块对我们来说效果会更好。这可以通过使用“AM modulation block”来实现。另一种方法是使用“RMS block”创建一个包络检测器,并将其与“Clock Recovery Module”一起使用,波形需要通过添加负常数来补偿零附近的偏差,最后再添加一个“binary slicer”和一个“file sink”,来实现数据的存储。是不是很惊讶,如此步骤竟然实现了对ASK信号的解码!
此时仍然需要对输出的数据做一些解析。解析数据本身就是一个值得探讨话题,但是有一些程序可以为我们做到这一点,解析器的一个示例“grc_bit_converter”。我们通过该解析器的运行输出数据,并在下面得到结果。我们可以清楚地看到前导码,然后看到一串比特序列。
从这些数据可以很明显地看出,我们对每个bit的采样过多了,可能我们的omega值设置地不正确。将omega值增加到25可使每位字节减少,但仍然不正确。
在这一点上,我们可以继续进行微调或更好地进行测试来计算正确的omega值。但是,出于解码的目的,这应该足够了。
从当前的数据来看,每比特大约为1到1.5个字节(太多了),但是从中可以很容易地以编程方式选择我们想要的模式。例如,小于0xA0为零,大于0xA0为1,单字节为一位,三字节为两位。从中可以看出,进一步完善将是不错的选择,但不是必须的。
把我们的假设与我们的包络检波器的波形进行比较,我们可以看到他们能够很好地联系在一起,我们确信在(一定程度上)起了作用。在此基础上,我们可以随时调整模型并继续改善接收程序的性能。
五、总结
我们所设计的程序达到了预期的效果,但是也要许多可以改进的地方,比如AGC。对于AGC功能的实现仍然有许多方法。另外提醒一下,如果我们只是想查看波形,Pothos和Wave Trigger会很好,如果我们想嗅探所有ASK传输并即时对其进行解码,那么时钟恢复模块会更好。
六、有用链接和联系方式
https://myriadrf.org/news/limesdr-made-simple-part-6-one-way/
淘宝店铺、QQ技术交流群、微信公众号、哔哩哔哩、CSDN联系方式如下:
标签:GNU,OOK,增益,LimeSDR,Radio,信号,ASK,我们 来源: https://blog.csdn.net/OpenSourceSDR/article/details/110204262