




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LimeSDRMadeSimple系 什么是 也许这样你还不能理解。那么可以参考百科的定义 目前实际用途在 我本人在机顶盒领域工作多年,我了解到目前的趋势是固定的调谐器/解调器都被“全频段捕获”前端尽管有多种选择,目前市场上性价比最高的还是LimeSDR。LimeSDR支持100kHz~3.8GHz我们可以通过应用来了 下其灵活性蜂窝、WiFi、蓝牙、IoT协议(LoRa/SigFox等)、导航、气象信息、航空信息、海事信息、空间通信、还有广播和电视。这只是LimeSDR支持的 部分通信方式,你还可以用于其他你想得到的领域。我们现在了解了LimeSDR是低价、开源、支持现成APP的软件无线电平台,它能支持几乎所有通信标准。这意味着由于LimeSDR的开源特性,所有软硬件都可以研究和修改。原理图、布局、零件清单(BOM)和软件都可以根据ativeCommons和Apace2.0协议使用。LimeSDR的部分是7002,它是可编程的射频集成电路。简单说来,7002是有点像射频领域的FPGA。这个后期我们会进步探索7002,会研究它的详细功能。RFLimeSDR有两对接收/发射通道,可以只用于接收,也可以实现2x2MIO,你可以看到共有10个F接口,但是只支持2个接收和2个发射,这是为什么?因为我们的接收和发射口都分别对低频段和高频段做了优化(所以这样就用到了8个口),然后剩余的2个口是接收通道的宽频段接口。要把每个通道的接口合并为个是很的。我们目前的设计既可以保证灵活性又可以保证性能。RX1_1/RX2_1=低频段<1.5GHzRX1_2/RX2_2=高频段RX1_3/RX2_3=宽频段 DannyWebster写的针对短波的修改。 头是USB3.1接口和可选的电源口。大多数情况下LimeSDR可以只用USB供电,只是要记住,板子的需求比USB2.0500mA的标准高。尽管大部分USB2.0设备能提供足够的功率,但是限制带宽,所以推荐USB3.x口。说到功率,对于某些应用你可能还要加功放,但是低功率的无线电应用可以不需要额外硬件对于2.4GHz频段的应用,USB3.x可能造成很多谐波干扰。有些线缆和电脑的电磁不好,可能可以考虑使用USB2.x(带宽降低)或者想办法做。USBCypressUSB3.0CYUSB3014-BZXC(EZ-USBFX3)。这个设备写入了VID/PID,会被LimeSDR驱动识别。这个里的代码都是开源的,如果你有需要可以自己做修改。J19可能在 些应用中很有用。它是8个GIO口,可以用API调用,作为输入和输出。注意它们是被板载FPGA驱动的,它们电流较低,并且只支持3.3V的电压。 板子上还有两个JTAG口,但是大多数人不会去用,只有高级应用才会用 CycloneIV,它支持定程度上的后端处理,波形生成,和EZFX3样,FPGA内的代码也是根据Apache2.0协议免费提供的,你可以自己修改,设计从哪里你可以先个LimeSDR接下去的会讲LimeSuite和Pothos的安装(Windows用户需要PothosSDR安装包)。注意安装可能会有更新,所以和我们的会有少许区别。 专家(底层开发需要你对7002M深入了解。这个系列会帮你 篇文章,我们会讲到RF输入,以 7002,我们会了解到 Suite里的控制选项这是LimeSDR系列的第二篇,用来帮助你实际使用SDR,并且写自己的程序。上次我们探讨了LimeSDR是什么以及它的功能。这篇文章我们会讲解7002M和射频输入输出,这是许多神奇需要再次观察这些输入输出口,了解它们的区别。最好先看下板子的原理图。为了简单起见,我们只看条射频通道(Lime的7002M有2条完全相同的射频通道,比如TX1_2和TX2_2是模如果你对原理图不熟悉,或者只是大概看过原理图,但是不熟悉F,那么F电路吓到你,因为有很多分立的器件。然而,掌握 定方法后就可以方便地理解它们的原理了。大多数电子学,甚至是大学里教的电子学课程, 般都只考虑原理图中电路在静态条件下的情况(要不就是开着,要不就是关着),这些资料可能会考虑 些模拟条件。大多数设计中,这些知识就足够了,因为我们可以忽略频率效应的影这样理解起来会更容但是在射频电路其它因素可能会变得更重。频率的介绍(这里会讲到物理知识接下来的东西可能会讲 些数学。须记 些甚至是很小的块导线,它们通常都被看作寄生现象(也就是说我们不想要它们出现)。从这里你就可以看出为什么输入端要覆盖超宽的频率会那么,就是这些寄生现象造成的。反这个图像来自百科上的Oleg我们还需要了解另个概念,也就是传输线理论。如果和目的地的阻抗不匹配,那么部分的些规则是不同的。比如说3GHz的四分之波长很小(小于2.5cm),那么电气短线就要小于这个距这些小知识可以用在很多地现在数学和物理知识已经讲完了,我们可以 下3个输和2个输出口的区别了 如果我们忽略这个回环,你可以发现3个输基本上是差不多的,你可以看到RX1_L和RX1_W之间只是有几个值不样。RX1_H也差不多,只不过使用了非中心零点伦(这样我们可以加入偏置),并且去掉了电感(取而代之的是MN22的电容)。简单说,这些(T1~T5)把单边信号转换 这些网络的阻抗受到频率影 了,它原本会把低频率的信号反弹回去,取走后就不会了(类似的,个较小的电感也会产生类似7002M上篇文章,我们说这个类似于FPGA。但是这个并没有FPGA内部的门阵列。它是个射频,可以在使用中调整为100kHz到3.8GHz之间的任何频率。这种类型的器件被称作FPRF(现场可编程射频),因为它可以高度定制,因此它拥有很多类似FPGA的优点。上面的展示了7002的模块图,我们可以看到内部有很多东西。那么这些东西到底做了射频输入(主要是 了使得这个信号在后期放大过程中对噪声更免疫。如果我们在放大器前加入了噪声(中到处会有噪声),噪声也会被放大,因此大多数射频电路中LNA般都在最前面级。混频 是7002M的重要组成部分。我们下搬移到基带后,就会碰到第二级的低噪放,同时也 个电流电压转换器这个LNA/TIA的作用如对于基带信号提 个初级低通滤 旦信号经过RXTIA后,它会被送入低频率的低通滤波器或者高频率的低通滤波器(RXLPFLRXLPFH),它们是可配置的。在LimeSuite的RFE选项卡中最 级增益(RXPGA)和 简单起见,我们假设我们的ADC只有位,也就是说对应了4层C值(V=0.V.66V。如果我们想要用上整个范围,那么我们的信号必须在0~1V整个范围内变化。如果我们的信号值只在0,那么我们只有1位的有效ADC值,而不是我们本来想要用到的2位。因此,我们需要加 个增益。如果增益太大也会碰到类似问题,如果我们给ADC的信号在0.66V到1范围内变化,也会有类似问题。但是为什么前面提到的组件都正好有2个?I和Q代表什么 多。如果你想要了解更多知识,可以查看NI发生成的信号的大小,输出时只需要最后级增益。滤波在发射中更为重要,因为我们需要发射出更从哪里你可以先个LimeSDR接下去的会讲LimeSuite和Pothos的安装(Windows用户需要PothosSDR安装包)。注意安装可能会有更新,所以和我们的会有少许区别。 最后的些想法期的软件讲解中进步深入。现在我们大概知道7002M的工作方式了,我们可以在下篇学习LimeSuite软件了,我们后期还会讲如何在些应用中做修改,来提升应用的性能。这是这个系列的第三篇。我们会以之前的为基础,如果你没看可以点这里上次我们详细看了RX部分,这样就能更好理解LimeSuite程序里的设置选项。上篇文章理论比较多,这篇文章理论会少些,我们会做更多实际操作。开我们会使用“selftest”例子作为本文的基础。原因是只要你有LimeSDR,你不需要额外的硬件(比如 这个例子中使用的频率是2100MHz,在英国是3G蜂窝网络的频段,你大多数情况下都没有在这个频段发射的。我们使用了内部环路,这样就不会真正发射出信号,但是任然会有 小部分射频能量从我们接着天线的口上漏出来。因此做这个测试时最好移除天线(或者你也可以换到你有权使用的频段上去),这样你就不会不地在这个频段发射出信号了。我们的内部环路加在高频率的通道上,因此你选择的频段也必须在这个范围内。在7002M内部有上千个寄存器,因此要手动设置会非常麻烦。我们使用ini文件来解决这个问题,它里面包含了7002M的寄存器设置,可以自动设置它们,我们不需要关心。如果你对这个感,这个文档。下面是self_test.ini中的部分,我们提取出来作为 0x0020=0xFFFD<ResetandPWRsettings0x0021=0x0E9F<SPI/I2Ccontrol0x0022=0x07DF<PadDrivecontrolsettingsSXT是用来控制TXPLL(发射部分的锁相环)和时钟发生器的,它和SXR非常类似,所以我们可以同时观察。我们暂时不需要调整参数,只需要点击calculate和tune按钮,但是最好还是理解下到底接下来要说的东西需要更多的知识之前的文章我们讲过RXPLL(锁相环),以及如何合成 个时钟源是由参考时钟和乘法器、除法器起生成的。PLL保我们可以 下下面的PLL结构图,可以发现PLL由3部分组成Inputs(Nint,Nfract&PLLCLK(refAVCO压控振荡了。你可以试试改变频率,然后看看那几个参数会对应变化(记得看完了要改回来,然后按下这个时钟发生器部分和前面说的有点相似,它用来控制2的数字部分,因此有些参数需要优化 下。我们的主要目标是在发射部分的A(数模转换)中做过采样,以此提升SNR(信噪比),更高的时钟 般来说效果都会更好。这个顾名思义就能知道是什么,它控制了SKY13323射频,把它选为了环路模式加载WCDMA波FPGA 部分功能是波形回放功能,它能够按照正确的格式给7002M提供已知的波形数据先要保证你能做到selftest中的两个波形看上去差不多的样子。波形的IQ图像应该和我们的截图 们之前看过7002M的结构了,从中我们可以看到这些细枝末节。在我们前面看到的资料里,可我们暂时不更改发射参数,先更改接收部分的参数,改下上篇文章提到过的参数。我们现在看到的I/Q图像,可以注意到这个形状是大块点(理论上应该填满这块)。如果我们用的是别的信号,它能帮助你更改参数,你可以先随意调整下,最终再做优化。我们知道7002M的最前面级是LNA,那么我们先来调整它,它现在的设置应该是GMAX,也我们试试。先把RX的LNA改回GMAX,然后到TXPADgaincontrol处改为16,它是TXLNA的部你可以看到,结果和之前的类似。另外,TBB选项卡里还有个frontendgain,它调整的是基带增益。我们现在调整组参数,先把TXPAD调整为12(TRF选项卡),然后再把frontendgain调整为我们看到增益确实增加了,但是信号出现了失真。不止是星座图变成了很大的个点,而且对出现了毛刺。显然这个设置是不对的,这可以作为错误的设置的例子。来说,在调整完大多数设滤波TBB(发射部分滤波器设置幸运的是,下面还有个Tune按钮会自动计算滤波器系数。输入100MHz,然后点击Tune按钮,你会得到个稍微小点的IQ图,因为我们发出了更多的噪声(这里不理解?噪声多了不是应该更大座图。我们对频率造成了很大的干扰,因为我们没有滤波器了,无法过滤高阶谐波。你最好不RBB(接收部分滤波器设置手动调整输入滤波器参数可能会比较容易理解,这些滤波器是C滤波器。再次选上,并把电容值增加到1200,我们可以看到,波形严重失真了,因为我们把高频率的信息过滤掉了。虽然我们可以手动调整滤波器,但是我还是推荐你自动选择这些值,这就和TX里面 样。点击ue按钮会原原本的设置。最 但是它还是与前面的所有文章都有关系,如果你没有看前三篇文章,我推荐你看下。上篇文章我们看了self_test.ini,把这个例子里大多数有关内容都讲了。这次我们会使用之前学到的知识来提高信号质量,并创建我们第个应用。开到这里,我们假设LimeSuite已经在你电脑上装好了,并且运行正常如果你没有装好,你可以去装下Pothos,同时装好GQRX或者SDRConsole(你不是定要装这然后我们还需要些额外的硬件,比如FM天线。如果没有也不要紧,你可以用根75cm长的没有还有,我们现在的工作频率还是需要的,因此记得发射端不要接高增益天线。值得的是,可以用LimeSDR来发射这种信号,但是最好还是不要。GQRX/SDR大多数人第次用SDR都会使用GQRX或者SDRConsole。我们不会讲太多小细节,但是还会讲几里,BBC3频道的信号最强,频率是90.9MHz。SDRConsole只支持Windows,它支持LimeSDR,并且支持硬件加速功能。没有太多地方要设置,信号在100MHz附近。你第篇文章,你就知道怎么接线了。GQRX的输入控制页面的设置方式也是类似的。通过前几篇文章你应该能过自己做设Pothos 个可以运行的程序,你可以JoshBlum写的。 双击这个模块,打开SDRSource的属性,把它们改为如下设置。注意DeviceArgs,有很多参数,你只要直接点下拉框,然后选择你的LimeSDR就可 点击commit,并加入2个模块,分别是Audiosink和FreqDemod。这些都做好后,点击go按钮。记白噪个SDR设备(LimeSDR)输出IQ信号采样率1MSps/s我们设置了默认的增益和滤波信号强度。旦达到足够增益后,信号会从白噪声,变成个奇怪,这个声音还是听不清在说 plexFloat32改为Float32。这是因为解调后我们的信号就不是IQ 多Pothos模块意义,它有widget,别忘了把它加入graphwidget。 是时候 些滤波FIRFilter。这些控件内部有变量,连起来后会有些不同,所以暂时先别连起来。在FIRDesigner属性里,把频率上限设置为16kHz(16e3或者16000),剩下的设置都用默认的 些taps。把FIRDesigner输出拖到FIRFilter上,这样就会出现Connection控制面板,在里这样我们听到的音频信号更好了。但是等下,好像我们听到像是蓝精灵的在说话。声音还出的音频频率会变化。你可以玩下这个参数,听上去会很有趣。最我们现在有了个非常简单的FM了。你还可以加入些调谐频率和增益的控制。在用于降采样的FIR滤波器上再加入个filterdesigner,也会提高音频质量,还有采样率和带宽也可以调整。这个我们的的理论知识都比较少。我们以后会通 些实用的例子 些理论,这样就更能发挥LimeSDR的潜力 根据百科的定义,软件无线电是现在是时候复习下前面学到的 篇:介绍第二篇:匹配和这两篇文章我们讲了软件无线电的射频部分,是用硬件实现的第三篇 个实际的例 第四篇:Pothos使从这里开始灵活性更高了。之前我们还在物理世界中,受到硬件模块的限制。虽然可以从z调谐到z,很神奇,但是硬件还是要用硅实现,受限于它的设计,它还是只能做有限的事情。而从这篇文章开始,我们着手研究软件:我们在FM例子里加入了滤波器、解调器、检波器,这些都有段漏第三篇和第四篇文章中间有些不连贯,我们先讲了用LimeSuiteGUI,然后直接跳到Pothos,后者很上层的软件开发环境,因此大多数底层参数都做了抽象。我们怎么知道哪些设置开启了?是否有东西在它们之间呢?为了回答这些问题,我们现在深入看下7002M的控制。进入深 Octave。Ocatave是个类似的开源软件,支持数学计算,也可以当作个软件开发环境。如果你需要做些复杂的数学实验,octave很适合你。而其他不怎么研究数学的人也不用台担心,如如果你想要真正使用们会用ASK的例子,这个例子这里的安 ,安装起来比Pothos和LimeSuite麻烦些。个试验品,而不 此以外,还要安装gnuplot,你可以输入sudoapt-getinstallgnuplot,如果没有它你可能会碰到错人的例子都是蜂窝网络频段的,你需要有使用才可以在那些频段发射。GNU我们安装这些应用就是为了探索SDR的软件部分,Octave应该能满足需要。在说R的参数之前,我们先来看看这个软件包的介绍。和Octave本来都是为了解决数学问题的。这样用它们来实简单举个例子,要用软件实现增益,我们只需要在数字部分做个简单的乘法实现增益或者除法实现衰减就行。尽管概念很简单,但是实现比较难,因为采样点太多,我们会得到个很大规模的复数矩阵。用Python或者C语言来做处理很麻烦,因为这样会产生个数组。Octave/(矩阵)就是为矩阵处理设计的,这样就会简单好多。为了验证这 入输入如下命令来 半的波形可以输入:iqsinehalf=iqsine/2。这就是数学语言的力量。尽管自己生成信 如果你还没认可Octave的能力,你可以边看ASK例子,边考虑,我们如何生成并发射调幅键控 你可以直接读波形来理解,下图的数据是11010010编码后产生的,用 communications下面加上pkgloadlimesdr。接下来运行例子,你就能发射波形了。你也可以设置useLimeSDR=false,这样你就不需LimeSDR也能测试还是个 数样更改参数。更改发射频率、采样率、滤波器,参照之前的方法就行,这就是为什么我们先讲直到现在,这个例子都在Windows环境运行。octave还是实验性质的,可能会碰到些小问题。Linux下我们发现只能接收不能发射注意在运行例子时会产生大量的变量。观察这些变量很有趣。比如iqDataTx和iqDataTxo,后者是前者过采样后的变量。过采样可以减少混叠的可能性,因为它把可能可能混叠的信号隔远了,这样TXLime接收波Lime其它代码都是为了绘图和增加可读性。关键点在于启动命令,里面包括了个发射函数,接收也很重要,你可以学习如何接收。注意,如果你只要发射个单波形,有个LimeTransmitSamples命最 在Pothos和GNURadio中接收ASK/OOK信 我们还是要警告你,把天线从不用的TX口处取走,这样就不会不发射出信号了。要些,深入学习接下来我们会讲到些通信理论。前面,ASK是最简单的调制方式。ASK的实现方式里最简单的种是用单音来表示1,然后没有单音表示0。这也是OOK,2个等级:开和关。这个单音般来我们这个协议很简单,所以我们可以用个足够好的示波器观察,并直接用眼睛看出数据和很多简单的概念样,我们还需要了解些其它知识。在实际的无线电接收中,我们的电路需要时间去调整和锁定频率和增益。对于SDR和传统电路都样。比如:它们的发射频率经常会在模拟电路里,我们使用受控环路锁定载波,并调整接收电路达到匹配。PLL或者 个简单的路就可以完成,原理都比较类似。在R里,我们也能用同样的方法来解决,或者直接忽略掉这个问题,而是用后期的数字滤波来解决。这需要假设我们有足够的带宽来捕捉信号。正确的ASK接收机对于频率偏移和相位变化能过很好的免疫,所以我们 般不需要担心这些。增信号振幅对于传统电路和SDR都是要注意的事项。最终都需要用某种增益控制来解决。比如(自动增益控制)是最好的,但是手动 完成锁定,锁定后才接收真正的数据。这个技术不但在射频通信里用到。你现在使用的电脑或者机可能也在做这样的操作,而 秒要做几百万次。因为DDR内存里就需要用锁相环来锁定时(就跟RF样) 射出的频率。把SXR频率改为433MHz,我们就能看到FFT图了,然后按下上的按钮,会出现个新的尖峰。然后重新调整中心频率,直到尖峰在中间,这时我们就找到了的频率。我们的钥设设 个迄今为止,我们用的都是现成的设计,比如Josh的。接下来我们要自己设计了 我们之前用过Pothos,所以这次还是用它。加入个SDRSource(包含频率控制)和个Wave 以用DCremoval模块来去掉它。把图像上的增益 点,但是没必要这样。wavemonitor有 我们把前面说的几点实现下。为了实现增益,我们乘以个数字,这样可以把信号放大20倍(很简单)。然后用个简单的解调算法,叫做EnvelopeDetector。这样就能检测载波的包络线了(对应我们可以加入个WaveTrigger,并设置为normal模式,这样就能捕捉信号了(类似于个示波器上的功能)。点的数量可以在WaveTrigger和WaveMonitor里设置,这样你就能观察到整个过程。如果这个数据时静态的,那可以手动解调,并保存为文件。这样我们就搞定了:个简单但是有效重量级程序:GNU迄今为止,我们都没说GNURadio。Pothos和GNURadio很接近,而且可以支持与GNURadio的协同使用。你用过PothosGUI后GNURadiocompanion应该也会很熟悉了。如果你没安装,可以现在装下和Pothos样,我们的流图也类似:无线电接收->增益->解调->分析。要在GNURadio里使用 Source,并且在devicearguments里填入driver=lime,soapy=0。 我们可以在GNURadio用各种方式实现前面在Poths里做的工作。我们使用了下列模块(但是这不唯 :FreqXlatingFIRAM解调ClockRecovery 个wavemonitor,这里的采样ClockRecovery模块在消除载波后表现得更好,因为载波的存在会影响很多事情。我们使用AM模块来实现。另种方式是使用RMS模块,实现个包络线检波器。要把它与ClockRecovery模块结合使用,波形需要加上个负常数,然后移到0点附近。最后加上个binaryslicer和filesink就完成了等下,这个设备还没那么好,因为输出的格式还需要翻译。改变数据格式是另个话题了,现在有些程序可以自动完成这个任务,比如grc_bit_converter。我们把前面生成的数据经过这个程序转从这个数据可以发现,我们每个符号对应的采样太多,因此说明我们的omega值是错的。我们omega值增加到25,这样每个符号对应的二进制位输出就少 些,但是还是有问题 最许多其它的实现方案。写程序就这样,要实现个目标会有多种方法,有些方法比另些好。如果我们只是要看波形,Pothos和WaveTrigger模块就够了。如果我们要所有ASK数据,并且要实时,那么ClockRecovery模块就会更好。还有点:记录ASK数据可能很有趣,但是用于不如果你还没尽兴,我们下次还会深入讲ASK在GNURadio中接收和发射ASK信这是第七篇。我们继续上次的内容,我们会仿制出个最简单的无线电设备。上篇文章我们可以接收比特流,但是每个符号对应的比特数是错误的。这篇文章,我们计划改进ASK,并且设计个发射机,重放数据。要实现这个目标我们需要同时有发射机(类似器)和接收设备。我们手头正好有BrennenstuhlPrimera-Line插座。出于好奇,我们看了它的器信号,它们也是ASK而且还是OOK,因此我们上 source对应于DCblocker用来对接收到的信号去除直流分量,这个模块使得示波器不会显示出大的直流分Multiplyconst模块产生了 RMS模块把信号从正弦波的形式转换为二进制形式Addconst增加了直流偏置,把信号移动下来,使其穿过零点,这是Clockrecovery模块要求的Clockrecovery模块和Binaryslicer模块把数据恢复出来并记录到文件中AM解我们现在用RMS做AM解调,做得还不错,但是原理是什么 下RMS模块内部,它很简单:Out=sqrt(Avg),其中Avg=(1-Alpha)*Avg+Alpha*abs(in)^2,我们这里设置Alpha=1,那么Avg=abs(in)^2。 正弦波Abs(正弦波 ClockRecovery模 在正确的时间点采样,并出比特流。我们使用了clockrecovery模块,我们上次用几个字节来表 我们如何知道每个比特对应多少采样点到。或者用URH程序可以帮助我们做这个事情,但是只用GNURadio也可以实现。 Brennenstuhl电源开关就没有这个问题。我们只需要在RMS模块后接个示波器,然后计算最小的我们的采样率是1MSps/s,因此每1x10^-6秒就有个采样点。那么我们可以得到0.51ms对应于510在我们把510输入到clockrecovery模块中前,我们要知道,把这么大的数字作为Omega不太好。最好先做降采样,然后再做clockrecovery。我们增加个RationalResampler,然后降采样率设置为比特流每次传输(包含重复传输)都会有这个前导码 关闭按钮的载荷打开按钮的载荷
构建发 为了方便,我们这里使用了VectorSrouce,而不是文件或者messagebox。把我们的数据编码这个vectrsource会不停循环比特流,但是的速率是流图设置的采样率,在我们这里是Ss,这样它的速度会比我们需要的快510倍。我们可以用 个超大的vector代替,每个比特都重复510次,比如替换为1中间502个…。但是这样的实现方式不优雅。更好的方式是使用tInterlin模块。这样它会根据差值长度来重复每个比特(在我们这里就是重复510个采样点),这样的效果实际上是 样的。接下来,我们可以使用Throttle模块来设置比特率为1ss。这个模块会对流过的采样点的数量进行限制,把我们的输入速度降下来,达到目标波特率。这样我们就有了 个,波特率符合我们的要求。然而这是 个数字信号,没有载波,无法传输。 个433.91MHz的正弦波应该够了。我们用SignalSource来创建。 个门,我们可以用GUIChooser来选择0和1,这样用这个来控制另 最 级 Sink,我们设置为正确的参数后就好了DeviceArguments:Frequency:Bandwidth:5.1e6须这样设置,否则GNURadio会自动填写 最我们希望这篇文章展现了GNURadio和LimeSDR的强大之处,我们自己实现了 制我们的电源开关,只需要这 个简单的流图就能实现。这个对于所有OOK设备都是如此,包里了,但是来可能还会回来讲FSK和PSK,我们可能会尝试些别的设备。这是第八篇。我们在第篇就,我们会从SDR新手开始步步教你,直到你学会调用API编程。前几篇说完后,现在是时候开始写程序了。如果你已经读完了前面的文章,会用GNUOctave,也熟悉Pothos和GNURadio了,那么直接调用API只需要再前进小步。在Linux下开发(Ubuntu系统 没有,可以运行sudoapt-getinstallgcc来安装版本。搞定后,我们来试试 oWorld程序创 o_world.c,用你最喜欢的编辑器打开文件,加入下面的代码#include//sowecanuseprintfintmain(){ oworld\n”);//“\n”meansnew}保存并关闭。接下来我们需要使用gcc编译它,我们运行这个命令:gcc-std=c99o_world.c-o这个命令会生成oworld.bin,它是 运运 oworld.bin会得到如下输出SoapySDR接口方便起见,我们可以把SopaySDRAPI看作 API文档在Device.h这个头文件里SoapySDR的上也有例子,C语言的例子在这里你可以C语言的例子,并且保存为example.c文件然后就想编 样,只不过这次gcc命令要这样写$gcc-std=c99example.c-lSoapySDR-lm-o这次我们需要加入命令-lm,这是因为要用到 然后运 下,会报错:SoapySDRDevice_makefail:RTL-SDRdevicenot但是这个例子并不要用RTL-SDR不要害怕,只需要做些修改,这个代码就适合LimeSDR了,把如下文字 下改为编译,再次运行,你就会看到如下显示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了,你可以看到它与listGainAPI很接近,那么仿照前面的代码来设置增益应该很简单。Settheoverallamplificationina*Thegainwillbedistributedautomaticallyacrossavailable*\paramdeviceapointertoadevice*\paramdirectionthechanneldirectionRXor*\paramchannelanavailablechannelonthe*\paramvaluethenewamplificationvaluein*\returnanerrorcodeor0forSOAPY_SDR_APIintSoapySDRDevice_setGain(SoapySDRDevice*device,constintdirection,constsize_tchannel,constdoublevalue);通过上述信息,我们可以这样调用API来设置增intsuccess=SoapySDRDevice_setGain(sdr,SOAPY_SDR_RX,0, 先整理下我们现在要实现个新的工具。我们要从小程序起步,比如实现个频谱检测程序。我们可以对于例子分解开来,这样我们的主循环可以小点,代码也方便。我们需要用到函数和指针,所以你最好先学习点C语言基础(我们自己也需要做点练习)。我们会写些函数(这些可以看作是原型structSoapySDRDevice*Setup(void);voidDeviceInfo();voidRead_1024_samples(structSoapySDRDevice*sdr,doublefreq,complexfloat*buffer);void 这个函数可以像这样调用structSoapySDRDevice*sdr=structSoapySDRDevice{//enumerateSoapySDRKwargs*results=SoapySDRDevice_enumerate(NULL,&length);for(size_ti=0;i<length;i++){printf("Founddevice#%d:",for(size_tj=0;j<results[i].size;{printf("%s=%s,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这 个简单的函数,返回信息数据,在调用时需要传入SDR设备voidDeviceInfo(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]. 开始这个函数看上去有点可怕。你可以像这样调用它Read_1024_samples(sdr,frequency,sdr是Setup()函数创建的,frequency是要调谐到的频率值,最后的buffn是用来接收的采样点buffer。这些值会到buffn变量的指针中 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函数打开的SDR设备,我们只voidClose(structSoapySDRDevice{//cleanupdevice//return最小的我们的程序大概已经写了90%了,我们现在 个最小型的例子。我们需要include下面这些文件#include<SoapySDR/Device.h>#include<stdio.h>//printf#include<stdlib.h>//#include<complex.h>这是 的全局变size_t主函数只有这3structSoapySDRDevice*sdr=Setup();个频率工接下来只需要加 小部分代码就可以开始创建很多应用程序了。这就是我们的频率例子我们在命令行传入3个参数:开始频率、结束频率、间隔。这个代码就会设置好LimeSDR,计算需要做多少次。根据这个结果,程序会在每个频率上1024个采样点,然后计算RMS值。RMS intmain(intargc,char{{}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:printf("Thisgivesatotalof:%fSamplepoints",NumberOfScanPoints);while(NumberOfScanPoints!=0){//createare-usablebufferforrxsamplescomplexfloatbuffn[1024];doublefrequency=StartFreq+(Interval*((EndFreq/Interval)-Read_1024_sample
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 糕点烘焙原料发酵发酵剂添加工艺考核试卷及答案
- 水产品加工工新员工考核试卷及答案
- 通信固定终端设备装调工基础考核试卷及答案
- 电线电缆制造工知识考核试卷及答案
- 棉花收获机操作工技术考核试卷及答案
- 园艺生产技术员质量管控考核试卷及答案
- 辽宁省沈阳市2025-2026学年七年级上册第一次月考数学模拟试卷含解析
- 饮料灌装技术考试题及答案
- 应急行业面试题库及答案
- 银行征信面试题及答案
- 新版药品管理法培训培训课件
- 单位线法推求流域出口洪水过程工程水文学课件
- 高一上学期月考语文试题(八套)
- 幼儿园组织与管理讲座课件
- 2021年新疆第二医学院辅导员招聘试题及答案解析
- 淤泥换填渣石方案
- 2022标准方法验证报告(安检)
- 学术论文写作与规范课件
- 青岛版数学四年级上册第一单元练习题
- DB11 689-2016 建筑抗震加固技术规程
- 人工挖孔桩专项施工方案(水钻法)
评论
0/150
提交评论