本文内容、开发板及配件仅限用于学校或科研院所开展科研实验!

温馨提示:“开源SDR实验室”是北京的。

在本节,我们将研究接收和发送单极性不归零码序列的ASK信号,即把一个幅度取为0,另一个幅度为非0,这通常称为开关键控(OOK),该调制方式是经常用于门铃和车库门遥控器中。如果您要进行这个实验,则需要一些额外的硬件,并且需要433MHz(UHF)ASK/OOK设备,比如:车库门遥控器钥匙扣(以下简称钥匙扣)。

目录

一、ASK

1、频率偏移

2、增益

3、前导码

二、确定中心频率

三、接收信号程序设计

四、GNU Radio

五、总结

六、有用链接和联系方式


一、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联系方式如下:

LimeSDR官方系列教程(六):使用Pothos和GNU Radio接收ASK/OOK信号相关推荐

  1. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

  2. 以太坊构建DApps系列教程(六):使用定制代币进行投票

    在本系列关于使用以太坊构建DApps教程的第5部分中,我们讨论了如何为Story添加内容,查看如何添加参与者从DAO购买代币的功能以及在Story中添加提交内容.现在是编写DAO最终形式的时候了:投票 ...

  3. 米思齐(Mixly)图形化系列教程(六)-for循环

    目录 For执行过程 省略 省略'循环变量赋值' 省略'循环条件' 省略"循环变量增量" FOR循环使用举例 遍历数组 顺序输出数据 指定程序重复执行次数 死循环 求和 教程导航 ...

  4. PVE系列教程(六)、安装Windows11系统(专业版、企业版、家庭版通用)

    为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 PVE系列教程(六).安装Windows11系统(专业版.企业版.家庭版通用) 一.创建win11的虚拟机,并设置参数 在PVE右上角点击创建虚拟 ...

  5. ClickHouse系列教程六:源码分析之Debug编译运行

    ClickHouse系列教程: ClickHouse系列教程 根据官方文档的编译教程:How to Build ClickHouse on Linux - ClickHouse Documentati ...

  6. ASP.NET Core Web Razor Pages系列教程六:添加搜索功能

    系列文章目录:系列教程:使用ASP.NET Core创建Razor Pages Web应用程序 - zhangpeterx的博客 系列教程代码的GitHub地址:ASP .Net Core Razor ...

  7. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  8. NGUI_2.6.3_系列教程六(序列帧动画)

    今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始. 还要在啰嗦一句,首先大家要准备一些序列 ...

  9. PLUTO SDR入门系列之八:LimeSDR公司荣誉出品”PothosSDR”-内置“gqrx”,GNU radio以及CubicSDR

    LimeSDR公司荣誉出品- 开源SDR集成软件"PothosSDR"-内置"gqrx"(包括windows版本),GNU radio以及CubicSDR. 请 ...

  10. QML官方系列教程——QML Applications

    附网址:http://qt-project.org/doc/qt-5/qmlapplications.html 假设你对Qt的官方demo感兴趣,能够參考本博客的另一个系列Qt5官方demo解析集 每 ...

最新文章

  1. 100W无线充电方案文献调研 - 信息HUB
  2. 简单自学机器学习理论——正则化和偏置方差的权衡 (Part III )
  3. Java基础学习总结(14)——Java对象的序列化和反序列化
  4. 在linux中安装软件会出的问题,linux中安装程序出现的问题
  5. CSS3之border
  6. vue 父组件传子组件数值,父值变更子获取的值没有变的问题
  7. linux安装mysql遇到的问题_Linux下安装MySQL5.7及遇到的问题解决方法
  8. Spring Boot 页面国际化
  9. Shiro 的 HelloWorld
  10. java高级类_Java私塾跟我学系列——JAVA篇 第五章 Java高级类特性
  11. 宏杉科技:存储创新之路需要决心与耐心
  12. 石川:出色不如走运 (III)?
  13. Markdown怎么加入emoji
  14. 关于华三HCL使用时,设备端口状态为down的解决
  15. Spring中的一些常用注解
  16. 使用bigdecimal来保留小数
  17. 车载以太网 - SomeIP - 总纲
  18. Filezilla+花生壳内网穿透实现外网可以访问 避坑指南
  19. 使body占有整个页面
  20. WEB和WAP有什么区别前端开发的趋势

热门文章

  1. USB数据采集卡,Labjack系列 U12、 U3-HV、T7 测量电流的方法
  2. vue tinymce安装及使用
  3. Tin与Markdown的对比
  4. win7远程桌面怎么关闭计算机,win7系统关闭远程桌面服务的操作方法
  5. mysql角色权限关系表查询_用户、角色和权限,多表查询
  6. AT91SAM9260EK总是出现有RomBOOT提示但是却无法连接SAM-BA的方法
  7. python导入表格数据混乱_Python按行打乱Excel表格数据
  8. haosou属于搜索引擎的_搜索引擎登录工具
  9. “无法为保留分区分配驱动器号”的解决
  10. 参考文献的序号怎么对齐_word序号对齐方式 word中如何让编号自动对齐