版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LimeSDRMadeSimple这是LimeSDR平台系列的第一篇,这个的目标是帮助你实际使用SDR,在学完后你就能够有足够的信心自己写SDR程序。什么是可能大多数读者都知道SDR是什么。我们可以把它与传统无线电的对比就好像是一整个包含螺软件无线电SDR是把传统中用硬件实现的部件(比如,混频器,滤波器,放大器,调制/解调器,实际上,SDR还可以实现的功能,无法用一句话来简单概括。这个技术还刚起步,我们还在尝编程的硬件上做开发。比如CPLDFPGA开发,或者是ASIC实现。也可以是一部分软件和一部你可能会认为SDR是新一代的技术,但是我从来没听过实际用途。到底有没有人在使用呢?实际上世界上已经有无数SDR设备,你的屋子里可能就有。SDR。ADC和DSP正在取代传统的前端IC。尽管有多种选择,目前市场上性价比最高的还是LimeSDR。LimeSDR100kHz~3.8GHz的频蜂窝、WiFi、蓝牙、IoT协议(LoRa/SigFox等)、导航、气象信息、航空信息、海事信息、空间通信、还有广播和电视。这只是LimeSDR支持的一部分通信方式,你还可以用于其他你想得到的领我们现在了解了LimeSDR是低价、开源、支持现成APP的软件无线电平台,它能支持几乎所有通信标准。这意味着由于LimeSDR的开源特性,所有软硬件都可以研究和修改。原理图、布局、零件(BOM)和软件都可以根据CreativeCommons和Apache2.0协议使用。LimeSDR的部分是7002,它是可编程的射频集成电路。简单说来,7002是有点FPGA。这个后期我们会进一步探索7002,会研究它的详细功能。LimeSDR有两对接收/2x2MIMO10低频段和高频段做了优化(8个口),2个口是接收通道的宽频段接RX1_1/RX2_1=<1.5GHzRX1_2/RX2_2=>1.5GHzRX1_3/RX2_3=100kHz~3.8GHz宽带RX口的性能一般会比高频段和低频段口差,低/高频段口也是专门为宽带应用设计,因此DannyWebster写的针对短波的修改。其它 板子另外一头是USB3.1接口和可选的电源口。大多数情况下LimeSDR可以只用USB供电,只是要记住,板子的需求比USB2.0500mA的标准高。尽管大部分USB2.0设备能提供足够的功率,但是还是可能不够。如果可能,还是推荐使用USB3.x900mA电流。USB2.0口还可能限制带宽,所以推荐USB3.x口。对于2.4GHz频段的应用,USB3.x可能造成很多谐波干扰。有些线缆和电脑的电磁不好,可能会提升底噪,造成无法正常通信。最常见的情况是USB3.x干扰了WiFi信号。如果发生这种情况,你可以考虑使用USB2.x(带宽降低)或者想办法做。USBCypressUSB3.0CYUSB3014-BZXC(EZ-USBFX3)。这个设备写入了VID/PID,会被LimeSDR驱注意在Windows中,这个设备在设备管理器中显示的是Myriad-RFLimeSDR-USBJ198个GPIO口,可以用API调用,作为输入和输出。注意它们FPGA3.3V的电压。我们推荐你对连接在GPIO3.3V电源口,可以用来LimeSDR板子上最后一个主要组件是AlCycloneIV,它支持一定程度上的后端处理,波形生和EZFX3一样,FPGA内的代码也是根据Apache2.0协议免费提供的,你可以自己修改,设你可以先一个LimeSDR接下去的会讲LimeSuite和Pothos的安装(Windows用户需要PothosSDR安装包)。注意安装可能会有更新,所以和我们的会有少许区别。和LimeSDR硬件一样,LimeSDR的软件提供了很高的灵活性,你可以以它们为基础来做自己的开3块:中层用户(代码和API)专家(底层 7002M深入了解。这个系列会帮你一步步这个级别。与SoapySDR有关的知识可以在之前的文章里找到。下一篇文章,我们会讲到RF输入,以及7002,我们会了解到LimeSuite里的控制选项这是LimeSDR系列的第二篇,用来帮助你实际使用SDR,并且写自己的程序。上一次我们探讨了LimeSDR是什么以及它的功能。这篇文章我们会讲解7002M和射频输入输出,这是许多我们还讲过多个RF接口以及它们存在的原因。在我们深入讲解 7002M的内部工作原理前,我我们只看一条射频通道(Lime的7002M有2条完全相同的射频通道,比如TX1_2和TX2_2RFRF电路吓到你,因为有很多分立的器件。然而,掌握一定方法后就可以方便地理解它们的原理了。大多数电子学,甚接下 的东西可能会讲到一些数学。须记住一些这两个说的是电容和电感在不同频率下的阻抗,尽管容抗随着频率增加而减少,感抗是随着频率增加而增加的。第二,须注意到,所有电路都同时有电容和电感。包括导线、PCB线路,这个图像来自百科上的Oleg我们还需要了解另一个概念,也就是传输线理论。如果和目的地的阻抗不匹配,那么一部分的3GHz的四分之一波长很小(2.5cm),那么电气短线就要小于这个距离,如果你使用任何超过这个长度的导线,就必须做好匹配。另外,LimeSDR还会用到天线,因此TX1_2和RX1_H之间有一个很明显的区别是MOSFET和SKY13323芯片。射频环路是开关控制的(SKY133230.1~3GHzSPDT开关),MOSFET(BF1105R)提供了在如果我们忽略这回环,你可发现3个输本上是差不多的你可以看到1L和X_W之间只是有几个不一样。1_H差不多,不过使用了非中零点伦这样我们可加入偏置),并且去了电感(取代之的是22电容)。简单说这些T~T5把单信号转(如果我们把前面说的概念都记下来,然后重新看这3个输,我们可以看出亮点:对于低频率输,频率比设范围更低时,8/6对于差信号会表现像一个很小阻抗,7/90会随之更改,当们远离最佳率点时,反的量会增加,导致能降低。对高频率输也是类似,但是这条通路里的2/42f你手头的板子可能MN18或者MN26被取走了(1)。这样电感的效应就没7002M上一篇文章,我们说这个类似于FPGA。但是这个并没有FPGA内部的门阵列。它是一个射频,可以在使用中调整为100kHz到3.8GHz之间的任何频率。这种类型的器件被称作FPRF(现场可编程射频),因为它可以高度定制,因此它拥有很多类似FPGA的优点。上面的展示了 7002的模块图,我们可以看到内射频输入(主要是了使得这个信号在后期放大过程中对噪声更免疫。如果我们在放大器前加入了噪声(中到处会有噪声),噪声也会被放大,因此大多数射频电路中LNA一般都在最前面一级。接收通道的后面一级中,信号与RXPLL混频,产生了一个基带信号(下搬移)。RXPLL是系统时钟经过低噪声合成器生成的。在LimeSuite程序中,我们可以在SXR选项卡(RX合成器)中设置RXPLL。RXPLL要用到的系统时钟在CLKGEN选项卡中(数字时钟)设置。这就是为什么它们两个都需要配置(我们需要用PLL来生成一个时钟进行下搬移)。这一部分很容易被忽视,但是这是7002M的重要组成部分。这个LNA/TIA的作用如下:DCoffset来预防信号饱和,保持在ADC动态范围内。一旦信号经过RXTIA后,它会被送入低频率的低通滤波器或者高频率的低通滤波器(RXLPFLRXLPFH)LimeSuite的RFE最后一级增益(RXPGA)和最后一级的低噪放叫做RXPHAADC原理有关。任何ADC2^(ADC的位简单起见,我们假设我们的ADC24层ADC值(00=0V01=0.33V10=0.66V11=1V)0V~1V整个范围内变化。0~0.33V1位的有效ADC2ADC的信号在0.66V1V范围内变化,也会有类似问题。RXPGA就是为了解决这个问题,使得信号幅度正好符合ADC的要求。这些控制选项在的RBB2个?I和Q7002M输出的形式是I同相和Q正交数据。这是一种记录信号幅值和相位的方法(Q与I的相90度,因此是正交的)。在射频通信领域,使用这种方式来记录同样的数据比其它方法方便好多。如果你想要了解知识,可以查看NI的资料。你可以先一个LimeSDR接下去的会讲LimeSuite和Pothos的安装(Windows用户需要PothosSDR安装包)。注意安装可能会有更新,所以和我们的会有少许区别。RX部分,这样就能更好理解LimeSuite程序里的设置选项。上一篇文章理论比较多,这一篇文章理论会少一些,我们会做实际操作。我们会使用“selftest”例子作为本文的基础。原因是只要你有LimeSDR,你不需要额外的硬件(比如test中的例子)2100MHz3G蜂窝网络的频段,你大多数情况下都没有在这个频段发射的。我们使用了内部环路,这样就不会真正发射出信号,但是任然会有一小部分射频用的频段上去),这样你就不会不地在这个频段发射出信号了。我们的内部环路加在高频率的3.7FFT图像后,我们可以具体理解一下这个例子到底做了些什加载在7002M内部有上千个寄存器,因此要手动设置会非常麻烦。我们使用ini文件来解决这个问题,它里面包含了7002M的寄存器设置,可以自动设置它们,我们不需要关心。如果你对这个感,这个文档。 0x0020=0xFFFD<ResetandPWRsettings0x0021=0x0E9F<SPI/I2Ccontrol0x0022=0x07DF<PadDrivecontrolsettingsSXTTXPLL(发射部分的锁相环)和时钟发生器的,它和SXR非常类似,所以我们可以calculate和tune按钮,但是最好还是理解一下接下来要说的东西需要的知识RXPLL(锁相环),PLL只是把时钟的相位我们可以看一下下面的PLL结构图,可以发现PLL3InputsNint,Nfract&PLLCLK(refAfeedbackloopAVCOselftestcalculate按钮后,这个选项卡中的许多参数都自动调整 7002M的数字部分,因此有些参数需要优化一下。我们的主要目标是在发射部分的DAC(数模转换)中做过采样,以此提升SNR(信噪这个顾名思义就能知道是什么,它控制了SKY13323射频,把它选为了环路模式加载WCDMA当我们加载波形后,还需要勾选MIMO,这样波形就会在两条发射通道上同时。如果你没有把相应的波形文件放到LimeSuite要求的文件夹下时,WCDMA按钮是无效的。如果你碰到这个问题,可以点击Custom按钮来加载你那里的WCDMA波形。我们终于可以来调节信号了。我们可以只对A通道做更改,而不更改B通道,这样就能看出效果。你先要保证你能做到selftestIQ图像应该和我们的截图在开始之前,我们需要知道选项卡中的某些选项是对两个通道同时有效的,比如SXT中的asan。 7002M的结构了,从中我们可以看到这些细枝末节。在我们前面看到的资料里,可以发现PLL模块是被两个通道共享的,因此改变这个参数对两个通道同时起作用。这就是为什么我让先了解了背景知识,这样你在这里才会理解。到的I/Q)号,比如QA4我们知道7002M的最前面一级是LNA,那么我们先来调整它,它现在的设置应该是GMAX,也就是达标了最大值。我们把它降低为GMAX-12,可以发现星座图看起来更紧密了,这意味着我们RX的LNA改回GMAXTXPADgaincontrol16TXLNA的一部分(TRF选项卡里)。你可以看到,结果和之前的类似。另外,TBB选项卡里还有一个frontendgain,它调整的是基带增益。我们现在调整一组参数,先把TXPAD12(TRF选项卡),然后再把frontendgain调整60(TBB选项卡),这样还原到原来的增益。我们看到增益确实增加了,但是信号出现了失真。不止是星座图变成了很大的一个点,而且对这是因为我们对滤波器过载了,你可以看到IQ星座图里的严重失真(变成方的了)。在相邻频段还TXPADself_test.ini里设置好了,所以我们可以直接按RXTIA和PGA增益,但是大多数self_test.ini(TX和CLK中点击CalculateTune按钮)TX52MHz,我们可以更改这个滤波器参数,这么修改会造成更差的结Tune100MHzTune按钮,你会得到一个稍微小一点的IQ图,因为我们发出了的噪声(这里不理解?噪声多了不是应该更大么)TXLPFL滤波器。我们还可以去掉PFA_BB和PFS_TB大的干扰,为们没有滤波器了无法过滤高谐波。你最不2z。WCDMA波形是很干净的。比如,我们选择LPF_Bypass10MHz的输入滤波器后可能看不RC滤波器。再次选上LPFL,并把电现在我们已经对一篇文章里到的大多数块做过设置了。尽还有许多地我们没有说,比如Bas设置A/AC模块,以及 0M的数字部分。但是这设置对于新户来说不重要,我们以后说。LeSR现在我们来继续看LimeSDR的有关知识。这是第四篇文章,尽管这是我们实际操作的第二个联系,上一篇文章我们看了self_test.ini,把这个例子里大多数有关内容都讲了。这次我们会使用之前学到到这里,我们假设LimeSuite如果你没有装好,你可以去装一下Pothos,同时装好GQRX或者SDRConsole(你不是一定要装这个两个程序,其它类型的程序也可以)。FM75cm长的没有的导线接在SMA头上就行。还有,我们现在的工作频率还是需要的,因此记得发射端不要接高增益天线。值得的是,现在大多数欧洲国家可以合法得使用MP3FM频段、nW级别的信号,所以说理论上你可以用LimeSDR来发射这种信号,但是最好还是不要。GQRX/SDR大多数人第一次用SDR都会使用GQRX或者SDRConsole。我们不会讲太多小细节,但是还会讲后期就可以在别的程序中调谐到这个信号。你可以使用这两个程序来找VHFFM广播。在我们这里,BBC390.9MHz。SDRConsole只支持Windows,它支持LimeSDRLNAL(低频率通道)RX1_L,因为我们找的信号在100MHz附近。你第一篇文章,你就知道怎么接线了。如果你要按着我的做,那你现在最好先面说到的程序里找到一个合适的广播频率。找到后你就可以开始写我们的第一个程序了。大多数情况下,第一步都会写一个FM 接一个可以运行的程序,你可以JoshBlum写的。但是在开始之前,我还要介绍一下Pothos。Pothos是一个用于SDR的基于数据流的编程环境。简SDRSource,在SDR双击这个模块,打开SDRSourceDeviceArgs,有很多参数,你只要直接点下拉框,然后选择你的LimeSDR在channels选项卡中里,你需要选择LNAL,并且要听的广播的频率以Hz的形式输入。比如,我们现在要听90.9MHz就要写作 Hz,你也可以写作90.9e6。commit2个模块,分别是AudiosinkFreqDemod。这些都做好后,点击go按一个SDR设备(LimeSDR)输出IQ1MSps/sFM解调器一个声音的模块首先我们要检查是否有足够的增益,我们可以先调整SDR的增益,调高点。要调到多高取决于你的信号强度。一旦达到足够增益后,信号会从白噪声,变成一个奇怪,这个声音还是听不清在1MSps/s的采样率,这是不对的,我们需要降采样。最简单的方法是使用一个滤波器(但是不做滤波)FIRfilter,然后找到Decimation35,把DataType从ComplexFloat32Float32。这是因为解调后我们的信号就不是IQ信号了,把这个模块接到解调模块和音频信宿模块中间。spectrogram。和很多Pothos模块意义,它有widget,别忘了把它加入graphwidget。spectrogram,我们可以清晰得看到没有设置好滤波器,这样我们可以看到一个很宽的频段,相当1MHz带宽的信号,把噪声也收下来了。FIRFilter模块不需要修改,直接用就可以。我们这里用的是ComplexFloat320口(橘黄色)接好。什么都不会变化,还是会有噪声和音频一起输出到喇叭上。现在我们加入一些tapsFIRDesignerFIRFilter上,这样就会出现Connection控制面板,FIRDesigner的输出。点击左侧的tapsChanged,然后点右侧的setTaps,最后commit。这样我们听到的频信号更好。但是等一,像我们听到像是蓝精灵在说话。声还是有问题。这是因为我们前面告诉你的ecatn设置是错的,应该是25出的音频频率会化。你可以一下这个参,上去会很趣。我们现在有了一个非常简单的FM了。你还可以加入一些调谐频率和增益的控制。在用于降FIR滤波器上再加入一个filterdesigner,也会提高音频质量,还有采样率和带宽也可以调整。这个简单的应用可以帮助你学会使用pothosJoshFM程序。这些模块是大多数SDR系统的组成部分:滤波器->解调器->降采样。这是本的第五篇,我们上一次看了软件无线电的软件部分,使用了一个相对简单的流图开发环境Pothos。从理论的角度比再之前的几篇文章简单些。根据百科的定义,软件无线电是我们开始调整一些与SDR硬件有关的参数,这是数据在纯硬件中处理的最后阶段了,其它地方的数据全部在软件中处理(有一些特殊情况也会用到FPGA)。100kHz3.8GHz,很神奇,但是硬件还是要用硅实现,受限于它的设计,它还是只能做有限的事情。FM例子里加入了滤波器、解调器、检波器,这LeuteGI,然后直接跳到Ptos,后它们之间呢为了回答这问,我们现在深入一下702M的控。我们现在想要深了解,那么会进入一些较杂的领域。如果把之前文章都理解彻了,还想来学点西,也许我下面讲的就你要的。那么我们在来介绍另个软件GUOctae。Oaave一个类似 的开软,支持数学计算也可以当作个软件开发境如果你需要做一复杂的数学验,otae很适你。而其他不怎研究数学的也不用台担,因为有很多现成例子,而且的编程语言很懂。如果你想要真正使用如果你想要真正使用,安装起来比Pothos和LimeSuite些。我们会用ASK的例子,这个例子更接近一个试验品,而不是一 软件在写这些例子的时候,我用的环境是Windows。我没有测试过Linux下的情况,可能会有些小问如果你要用LinuxLime的软件包。除此以外,还要安装gnuplotsudoapt-getinstallgnuplot,如果没有它你可能会碰到错误。这是对全新安装的Ubuntu来说的。如果你直接从上面的里了这些文件,你要注意:只有ASK和FSK例子可以直接运行。其他人的例子都是蜂窝网络频段的,你需要有使用才可以在那些频段发射。GNU我们安装这些应用就是为了探索SDR的软件部分,Octave应该能满足需要。在说SDR的参数之 和Octave本来都是为了解决数学问题的。这样用它数矩阵。用Python或者C语言来做处理很麻烦,因为这样会产生一个数组。Octave/(矩阵)就是为矩阵处理设计的,这样就会简单好多。为了验证这一点,我们来生成一个带有IQ分量的正弦波。这些代码可以直接写成一个完整的程序,也可以在命令行里输用j表示复数:我们要绘制一半的波形可以输入:iqsinehalf=iqsine/2。这就是数学语言的力量。尽管自己生成信FM调制。FFT和频谱图。如果你想要研究SDR,你可能很难找如果你还没认可Octave的能力,你可以边看ASK调幅键控ASK是一个很常见的编码方式,在简易无线电设备中经常使用,比如你的车库门。技术很简110100101,当在欧洲,这个频段有最大的限制。所以和别的例子一样,你不能用高增益天线发射,如果现在加载ASK.m文件,根据你的安装环境不同你可能要在你的代码里加入一行:在pkgloadcommunications下面加上pkgloadlimesdr。接下来运行例子,你就能发射波形了。你也可以设置useLimeSDR=false,这样你就不需要LimeSDR也能测试。三篇文章里讲的ini文件。我们打开.m文件,可以看到里面调用了这个.ini文件并传入了LimeLoadConfig变量。那么我们如何更改设置呢?很简单,用LmSuGI打开.ni文件,像之前我们改eftet.ni里的直到现在,这个例子都在Windows环境运行。octaveiqDataTx和iqDataTxo,后者是TX通道里的滤波要求就降低了。观察octave的例子,我们可以把代码分为几部分:LimeLime我们测试了另一种用LimeSDR接收和发射信号的方法。我们介绍了一个很强大的DSP软件,以及SDRini文件是如何输入给硬件的。下一篇文章我们会讲到的LimeSDR发射信号的内容,但愿我们不会讲到太多代码和数学。在Pothos和GNURadio中接收ASK/OOK这是第六篇LimeSDR。上一篇文章我们在Octave中发射和接收ASK信号。我们没怎么详细在接下来的文章里,我们会研究单级ASK的发射和接收,这种ASK也被叫做OOK开关键控。这个433MHz(UHF频段)的ASK/OOK设备。如果你我们还是要警告你,把天线从不用的TX口处取走,这样就不会不发射出信号了。要一些,深入学习接下来我们会讲到一些通信理论。前面,ASK是最简单的调制方式。ASK的实现方式里最简单10。这也是OOK,2个等级:开和关。这个单音一般433.9MHz(我们待会儿会讲如何得到这个频率)。频率和增益对于SR和传电路都一样。比:们的发射频经在模拟电路里,我们使用受控环路锁定载波,并调整接收电路达到匹配。PLL或者一个简单的电路就可以完成,原理都比较类似。在SDR里,我们也能用同样的方法来解决,或者直接忽略掉这ASK接信号振幅对于传统电路和SDR在硬件中,我们可以调节LNA或者在软件里乘以一个信号解决,各有优点。一定时间实现。这时可以引入前导码来解决。简单来说,这是一段信号,在这段时间内会去DDR内存里就需要用锁相环来锁定时间(就跟RF一样)我们从eBay买了一个无线,用于ASK发射机,我们会它发出的信号。在欧洲,这类的频率一般都是433MHz的频段。但是要有效,我们需要找到准确的频率值。我们使用LimeSuiteGUIFFTviewer来观察发射出的频率。把SXR频率改为433MHz,我们就能看到FFT图了,然后按下上的按钮,会出现一个新的尖峰。然后重新调整中心频率,直到尖峰在中间,这时我们就找到了的频率。我们的频率是433.9MHz。设计一个设计一个SDR我们之前用过Pothos,所以这次还是用它。加入一个SDRSource(包含频率控制)WaveMonitor,我们就有了最简单的ASK了。把调谐频率设置为433.9MHz,然后把拿到接收天线旁边,按下按钮,我们就能看到微弱的波形了。这是最简单的,效果不是太好,需我们需要加入一些增益,并加入一个Pedgm(1个尖峰)使用PeriodogramRF信号的直流分量。我们可DCremoval模块来去掉它。用一个放大镜看信号也可以看着大一点,但是没必要这样。wavemonitor有一个坐标轴的控制功简单)。然后用一个简单的解调算法,叫做EnvelopeDetector。这样就能检测载波的包络线了(对1的时候),然后把检测出的结果转变为数字输出。我们可以加入一个WaveTriggernormal模式,这样就能捕捉信号了(类似于一个示波器上的功能)。点的数量可以在WaveTrigger和WaveMonitor里设置,这样你就能观察到整个过有效的(尽管不是自动的)ASK。重量级程序:GNU迄今为止,我们都没说GNURadio。Pothos和GNURadio很接近,而且可以支持与GNURadio的协同使用。你用过PothosGUI后GNURadiocompanion应该也会很熟悉了。如果你没安装,可和Pothos一样,我们的流图也类似:无线电接收->增益->解调->分析。要在GNURadio里使用 Source,并且在devicearguments里填入这里我们要讲一些与Pothos的区别。打开一个新文件后,我们会自动生成两个模块。一个是Variable,这里有sample_rate这个变量。这个模块的功能顾名思义,这我们要使用的采样率。另一个模块叫作Options1e6(1Msps/s),并且把GenerateoptionsWX,我们可以双击这些模块来更改这些设置。QT/WX代表不同的图形WX,所以要这么改。我们可以在GNURadio用各种方式实现前面在Pothos里做的工作。我们使用了下列模块(但是这DCblocking模块RMS模块Threholds模块FreqXlatingFIRFilterAM解调模块ClockRecovery我们的目标是制作一个ASK设备,我们现在使用最合适的方式实现。对我们来说ClockRecovery模块可能是最合适的,因为这个模块可以把信号恢复成二进制数据,并且保存下来。我们整的参数是omega181MSps/s。这个设置是一个猜测的值,因为我们不知道符号率到底是多少。如果我们这时候接上一个wavemonitor,这里的采ClockRecoveryAM模块来实现。另式是使用RMS模块,实现一个包络线检波器。要把它与ClockRecovery模0点附近。最后加上一个binaryslicer和filesink就完成了这个ASK解析设备。有一些程序可以自动完成这个任务,比如grc_bit_converter。我们把前面生成的数据经过这个程序从这个数据可以发现,我们每个符号对应的采样太多,因此说明我们的omega我们可以进一步地精调,或者想办法计算出正确的omega值。然而,如果只是为了数据流,现1~1.5个字节来表示原来的一个比特,这显然太多了,但A0就表示0,高于A011132AGC。还有我们只是要看波形,Pothos和WaveTrigger模块就够了。如果我们要所有ASK数据,并且要实时,那么ClockRecovery模块就会更好。还有一点:记录ASK数据可能很有趣,但是如果你还没尽兴,我们下次还会深入讲ASK在GNURadio中接收和发射ASK这是第七篇。我们继续上一次的内容,我们会仿制出一个最简单的无线电设备。上一篇文章我们可以接收比特流,但是每个符号对应的比特数是错误的。这篇文章,我们计划改进ASK,要实现这个目标我们需要同时有发射机(类似)和接收设备。我们手头正好有BrennenstuhlPrimera-Line插座。出于好奇,我们看了它的信号,它们也是ASK而且还是OOK,因source对应于Multiplyconst10RMS模块把信号从正弦波的形式转换为二进制形式Addconst增加了直流偏置,把信号移动下来,使其穿过零点,这是ClockrecoveryClockrecovery模块和BinaryslicerAM我们现在用RMS做AM如果我们看一下RMS模块内部,它很简单:Outsqrt(Avg)Avg1-Alpha)*Avg=10个采样点取平正弦波Abs(正弦波现在你应该可以清楚知道RMS模块为什么能解调AM信号了,因为当载波出现时RMS模块输出一00。ClockRecovery上一篇文章中我们发现,用程序来解调比特比直接观察波形更难。因为须根据比特的波特率在正确的时间点采样,并出比特流。我们使用了clockrecovery模块,我们上次用几个字节来datasheet。我们这次无法找URH程序可以帮助我们做这个事情,但是只用GNURadio也可以实现。有些设备的波特率会变化,这样难度比较高。比如之前在eBay买的就是这样,那么就会增Brennenstuhl电源开关就没有这个问题。我们只需要在RMS模块后接一个示波器,然后计算最小的脉冲的长度,就可以得到准确的Omega值。我们算过了上升沿和下降沿的时间间隔大约是0.51ms510510就是我们的新的Omega510clockrecovery模块中前,我们要知道,把这么大的数字作为Omega不太好。1051Omega更好。现在我们的器就可以正常解调UHF电源开关的信号了,我们可以解调开关按钮各自的信号,我 了解怎样的数据在开启和关闭我们的Brennunstuhl很不错,但是如果无法发射这样的信号那也美多433MHz的OOK发射机,并且重复我们前面观察到的序列。流图中首先应该我们观测到数据。就像收数据时一样有各种方法这个数。为了方便,我们里使用了ectorSuce而是文件或者mesaebox把我们的数编码为vecto11,,1…,001。我们还加入了15个051011111…502个…111。但是这样的实现方式不优雅。更好的方式是使用RepeatInterpolation模块。这样它会根据差值长度来重复每个比特(在我们这里就是重复510个采样点)Throttle模块来设置比特率为率。这样我们就有了一个,波特率符合我们的要求。然而这是一个数字信号,没有载波,无法433.91MHz的正弦波应该够了。我们用SignalSource来创建。OOK信号的好处是,它们要不就是开启(1),要不就是关闭(0),那么我们只需要把最好增加一个门,我们可以用GUIChooser01,这样用这个来控制另一个乘法模块,来最后一级是SinkDeviceArguments:Frequency:Bandwidth:5.1e6须这样设置,否则GNURadio会自动填写一个错误的值,造成流在按下运行按钮前,必须注意尽管433MHz是免费频段,但是你还是要限制,把增益降低 增益会更好。不是所有情况下都这样的,比如一个正好在发射机旁边 我们希望这篇文章展现了GNURadio和LimeSDR的强大之处,我们自己实现了一个,用来OOK设备都是如此,包433MHz频段,我们暂时就讲到这里了,但是来可能还会回来讲FSK和PSK,我们可能会尝试一些别的设备。这是第八篇。我们在第一篇就,我们会从SDR新手开始一步步教你,直到你学会调用APIGNUOctavePothos和GNURadio了,那么直接调用API只需要再前进一小步。在Linux下开发(Ubuntu系统首先我们需要一个编译器,我们使用gccLinux的主要部件,所以你很可能已经有了。如果你没有,可以运行sudoapt-getinstallgcc来安装版本。 oWorld程序#include//sowecanuseprintfintmain(){ oworld\n”);//“\n”meansnew}保存并关闭。接下来我们需要使用gcc编译它,我们运行这个命令:gcc-std=c99o_world.c-o这个命令会生成oworld.bin,它是一个可执行程序,如果你没有写-o,那么会自动生成a.out。-std=c99表示使用的csoapyc99标准。运运 方便起见,我们可以把SopaySDRAPI看作一个黑盒。就好像printf一样,我们只需会用,当我们填入正确的数据后,它会按照我们的要求来工作。这个APIc++python版本,你如果不熟悉cAPI文档在Device.h要使用这个API,必须安装SoapySDRLinux,但是Windows也是支持的,只不过设置SoapySDR了。如果没有安装,可以点这里。你可以C语言的例子,并且保存为example.c文件然后就想编译oworld.c一样,只不过这次gcc命令要这样写$gcc-std=c99example.c-lSoapySDR-lm-o然后运行一下,会报错SoapySDRDevice_makefailRTL-SDRdevicenot但是这个例子并不要用RTL-SDR不要害怕,只需要做些修改,这个代码就适合LimeSDR“SoapySDRKwargs_set(&args,"driver",SoapySDRKwargs_set(&args,"driver",这样我们的例子就可以工作了,它了我们的LimeSDR的设置和序列号,另外还读了10组数1024个采样点。API的文档说得很清楚了。比如如果我们想要更改增益,增益类型已经在代码里显示了,这是用如SoapySDRDevice_listGains(sdr,SOAPY_SDR_RX,0,我们可以看一下API对这个函数的描述ListavailableamplificationElementsshouldbeinorderRFto\paramdeviceapointertoadevice\paramdirectionthechanneldirectionRXor\paramchannelanavailable\param[out]lengththenumberofgain\returnalistofgainstringSOAPY_SDR_APIchar**SoapySDRDevice_listGains(const*device,constintdirection,constsize_tchannel,size_t要调整增益,我们只需要在这个文档里搜索关键字“_setGain”API中搜索到的内容贴在下面了,你可以看到它与listGainAPI很接近,那么仿照前面的代码来设置增益应该很简单。Settheoverallamplificationina*Thegainwillbedistributedautomaticallyacrossavailable*\paramdeviceapointertoadevice*\paramdirectionthechanneldirectionRXor*\paramchannelanavailablechannelonthe*\paramvaluethenewamplificationvaluein*\returnanerrorcodeor0forSOAPY_SDR_APIintSoapySDRDevice_setGain(SoapySDRDevice*device,constintdirection,constsize_tchannel,constdoublevalue);通过上述信息,我们可以这样调用APIintsuccess=SoapySDRDevice_setGain(sdr,SOAPY_SDR_RX,0,20dB的增益。就是这么简单,整个API的文档都是这么写的,所以要加入其每个频率1024个采样点,并计算RMS值。我们可以设置开始频率和结束频率,并且设置每次Hz。例子分解开来,这样我们的主循环可以小一点,代码也方便。我们需要用到函数和指针,所以你最好先学点C语言基础(我们自己也需要做点练习)。structSoapySDRDevice*Setup(void);voidDeviceInfo();voidRead_1024_samples(structSoapySDRDevice*sdr,doublefreq,complexfloat*buffer);void这个函数相对复杂,它会返回一个SoapySDRDeviceSDRLimeSDR交互。structSoapySDRDevice*sdr=structSoapySDRDevice{//enumerateSoapySDRKwargs*results=SoapySDRDevice_enumerate(NULL,&length);for(size_ti=0;i<length;i++){printf("Founddevice#%d:",forfor(size_tj=0;j<results[i].size;printf("%s=%s,",results[i].keys[j],}}SoapySDRKwargsList_clear(results,//createdevice//argscanbeuserdefinedorfromtheenumerationresultSoapySDRKwargsargs={};SoapySDRKwargs_set(&args,"driver","lime");SoapySDRDevice*sdr=SoapySDRDevice_make(&args);if(sdr=={printf("SoapySDRDevice_makefail:%s\n",//return}return}这是一个简单的函数,返回信息数据,在调用时需要传入SDRvoidDeviceInfo(structSoapySDRDevice{//querydevicechar**names=SoapySDRDevice_listAntennas(sdr,SOAPY_SDR_RX,0,printf("Rxantennas:for(size_ti=0;i<length;i++)printf("%s,",names[i]);names=SoapySDRDevice_listGains(sdr,SOAPY_SDR_RX,0,&length);printf("Rxgains:");for(size_ti=0;i<length;i++)printf("%s,",names[i]);SoapySDRStrings_clear(&names,SoapySDRRange*ranges=SoapySDRDevice_getFrequencyRange(sdr,SOAPY_SDR_RX,0,&length);printf("Rxfreqranges:for(size_ti=0;i<length;i++)printf("[%gHz->%gHz],",ranges[i].minimum,ranges[i]. }Read1024samples(sdr,frequency,sdr是Setup()函数创建的,frequency是要调谐到的频率值,最后的buffn是用来接收的采样点的buffer。这些值会到buffn变量的指针中。们加入了增益,并且强制设置LNAL作为接收天线。voidRead_1024_samples(structSoapySDRDevice*sdr,doublefreq,complexfloat*buffer){//checkfreqiswithinrangeif(freq<10e3){freq=printf("Frequencyoutofrangesettingmin:}if(freq{freq=printf("Frequencyoutofrangesettingmax:}//applyif(SoapySDRDevice_setSampleRate(sdr,SOAPY_SDR_RX,0,1e6)!={printf("setSampleRatefail:%s\n",}if(SoapySDRDevice_setAntenna(sdr,SOAPY_SDR_RX,0,"LNAL")!={printf("setAntennafail:%s\n",}if(SoapySDRDevice_setGain(sdr,SOAPY_SDR_RX,0,20)!={printf("setAntennafail:%s\n",}if(SoapySDRDevice_setFrequency(sdr,SOAPY_SDR_RX,0,freq,NULL)!={printf("setFrequencyfail:%s\n",}//setupastream(complexfloats)SoapySDRStream*rxStream;if(SoapySDRDevice_setupStream(sdr,&rxStream,SOAPY_SDR_RX,SOAPY_SDR_CF32,NULL,0,NULL)!=0){printf("setupStreamfail:%s\n",}SoapySDRDevice_activateStream(sdr,rxStream,0,0,0);//startstreamingvoid*buffs[]={buffer};//arrayofbuffersintflags;//flagssetbyreceiveoperationlonglongtimeNs;//timestampforreceivebufferintret=SoapySDRDevice_readStream(sdr,rxStream,buffs,1024,&flags,&timeNs,100000);//shutdowntheSoapySDRDevice_deactivateStream(sdr,rxStream,0,0);//stopstreamingSoapySDRDevice_closeStream(sdr,rxStream);}最终我们需要关闭之前用Setup函数打开的SDRvoidClose(structSoapySDRDevice{//cleanupdevicehandle//return}90%了,我们现在写一个最小型的例子。我们需要include下面这些文#include<SoapySDR/Device.h>#include<SoapySDR/Formats.h>#include<stdio.h>//printf#include<stdlib.h>//#include<complex.h>size_t3structSoapySDRDevice*sdr=Setup();一个频率工接下来只需要加入一小部分代码就可以开始创建很多应用程序了。这就是我们的频率例子:3个参数:开始频率、结束频率、间隔。这个代码就会设置好LimeSDR,计算需要做多少次。根据这个结果,程序会在每个频率上1024个采样点,然后计算RMS值。RMS均,就是把所有值取平方,再求平均,再求平。这个结果会打印到终端里。注意sqrt命令要加入-lm才可以编译正常,可能你的电脑不一定要加。intmain(intargc,char{intargvcount=0;{printf("invalidinput");}structSoapySDRDevice*sdr=Setup();//HEREWECANDO//LetsdoasitesurveymeasuringeveryxxxHzanddis yingthepowerdoubleStartFreq=strtod(argv[1],NULL);doubleEndFreq=strtod(argv[2],NULL);doubleIntervaldoubleNumberOfScanPoints=(EndFreq-StartFreq)/Interval;printf("StartingRMSscan,Startis:%f,Endis:%f,Intervalis:%f\n",StartFreq,EndFreq,Interval);printf("Thisgivesatotalof:%fSamplepoints",NumberOfScanPoints);while(NumberOfScanPoints!=0){//createare-usablebufferforrxsamplescomplexfloatbuffn[1024];doublefrequency=StartFreq+(Interval*((EndFreq/Interval)-Read1024samples(sdr,//printf("ret=%d,flags=%d,timeNs=%lld\n",ret,flags,timeNs);floatrealavg=0;for(intx=0;x<1024;{printf("%f+i%f\n",creal(buffn[x]),cimag(buffn[x]));realavg=realavg+(creal(buffn[x])*creal(buffn[x]));}realavg=printf("Freqis:%f,RMSis:%f\n",frequency,rea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共营养师四级综合试题【含答案】
- 2026年初级会计考试题库及答案
- 电网运维单位设备检修安全管理规定
- 沈阳社区面试题及答案
- 纺织厂员工绩效考核办法
- 某家电厂产品安全检验细则
- 城市轨道交通月度销售协议
- 【会计模板】融资工作流程
- 年产125万吨高端清洗剂及075万吨金属清洗剂生产线项目可行性研究报告模板立项申批备案
- 百日咳专项考试试题
- TCEIAESD1005-2022防静电不发火地坪施工与质量验收规范
- 儿童青少年脊柱弯曲异常防治专项行动实施方案(2024-2027年)
- 《山西清徐县葡萄产业发展现状、问题及完善建议》12000字(论文)
- 《市场营销专业浅析》课件
- 新疆哈密新能煤化工有限责任公司招聘笔试题库2024
- 中学生自我价值感分析
- 克罗恩病的护理课件
- JB-T 4149-2022 臂式斗轮堆取料机
- 道路绿化养护投标方案(技术方案)
- 【数学建模】优化模型培训课件
- 松江云安JBQBYA火灾报警控制器使用手册
评论
0/150
提交评论