LimeSDR在MATLAB上的使用指南

前言

  LimeSDR是一款开源的,相对低成本的软件定义无线电平台。LimeSDR兼顾了比肩usrp的高性能和较低的价格,对于度过新手期的无线爱好者是一款非常有吸引力的SDR。然而,由于LimeSDR是无线圈子用爱发电的产品,并且最早是考虑面向科研用途,目前关于LimeSDR的软件配套并不像RTL-SDR或是USRP这种已经很好商业化的SDR一样成熟。例如,LimeSDR想要在GNU Radio上调用的话,需要用到SoapySDR、PothosSDR等当作胶水层与GNU Radio进行配合使用;SDRSharp软件也不能很好的支持LimeSDR;matlab也没有给lime做配套的硬件支持包。
  然而,LimeSDR的性能可以弥补RTL-SDR的很多不足,如频率范围、采样率等等。目前互联网上关于LimeSDR的使用教程或是相关文档较少,中文互联网上的教程更是只有几家lime的代理商和少数的使用者有所分享。在此,我将我尝试在matlab上使用LimeSDR的过程记录下来以抛砖引玉,希望能够帮助到更多的lime使用者~

关于LimeSDR

  LimeSDR最早于2016年开始生产,是一款完全开源的硬件产品,其所有的软件和硬件都是开源的,在这里可以找到关于LimeSDR的PCB、原理图等文档以及一部分相关软件:LimeSDR-USB。其性能在一定程度上可以比肩USRP B210,而价格只有B210的4分之一左右。下面是一张关于常见的软件无线电设备的性能图:

  可以看出,在采样率、采样位数、全双工、支持收发天线数量等方面可以媲美USRP,当然在频率范围等方面略有不足。
  在拿到LimeSDR后需要将连接馈线和拼装外壳,具体的过程参考:开源SDR实验室:LimeSDR外壳安装及基本测试。下图是我的lime(我是从开源SDR实验室这家代理买的,所以外壳上印有他们的名字):

因为LimeSDR最大可支持2 * 2的收发,所以在板子的的TX和RX上需要引出来4个SMA口:

装上外壳后用USB3.0线连接电脑(由于供电和数据吞吐速度问题,最好使用USB3.0),在天线侧连接需要的天线即可:

话说这个拉杆天线意外的好用…在RTL-SDR、LimeSDR、USRP 310三个上我们做过一个简单的测试,在同一位置处,使用普通的全向天线(大约30厘米)、拉杆天线(拉到基本对应的半波长)、WiFi的2.4g增益天线,拉杆天线在FM频段和2.4G频段上收到信号的强度都略好一些。。。不太懂为什么甚至比带增益的wifi天线还好用了0.0

驱动安装

  在Windows上首次连接LimeSDR时,会无法识别这个USB设备,需要我们手动下载并安装lime的驱动。驱动下载地址,在 设备管理器 中的找到不被识别的这个设备,选择自己下载的驱动并安装。最后在 通用串行总线控制器 里能找到“Myriad-RF LimeSDR-USB”就说明驱动已安装成功。

LimeSDR在MATLAB上使用的可能方案

  中文互联网上已经有很多关于用LimeSDR的原开发组织提供的软件使用和测试(LimeSuite等),这里就不再赘述。主要是围绕如何在matlab上(强行)使用LimeSDR。
  目前我能找到的能够让matlab识别并调用LimeSDR的方案有:
  (1)OpenUSRP项目。通过NI的驱动和LabVIEW & matlab对usrp的支持,将LimeSDR伪造成USRP,从而使得matlab能够调用LimeSDR。这个方案需要下载NI的驱动,将LimeSDR的配置文件替换进去。具体的使用稳定性等我没有测试,尝试配置了一下比较麻烦。如果您感兴趣可以参考这些:
  JiangWei的博客:LabVIEW for LimeSDR
  LimeSDR 的 FM接收机 LabVIEW 版
  OpenUSRP
  (2)Simulink-MATLAB-LimeSDR项目。Simulink-MATLAB-LimeSDR 我们的教程是通过这个项目进行的。

运行环境

   Windows 10, MATLAB R2021a, 编译器:VS 19 community。以及需要安装好LimeSDR的驱动

下载Simulink-MATLAB-LimeSDR项目

  首先从https://github.com/jocover/Simulink-MATLAB-LimeSDR/releases/tag/thunk下载libLimeSuite_thunk_maci64.dylib,libLimeSuite_thunk_pcwin64.dll和Source code (zip),并解压Simulink-MATLAB-LimeSDR-thunk.zip。

  下一步需要将下载的两个文件libLimeSuite_thunk_maci64.dylib和libLimeSuite_thunk_pcwin64.dll复制到解压文件夹目录下:

  复制到目标文件夹下:

  此时,如果我们在matlab上运行limeSDR.build_thunk,会提示没有LimeSuite.h文件:

  那么,LimeSuite.h文件原作者并没有说在哪里有,但是如果尝试过LimeSDR的2 * 2的MIMO测试,应该都用过LimeSuite,所需的文件都在LimeSuite项目里。但是,但是!如果我们再去下载安装LimeSuite又会踩很多坑,因为在win10下编译LimeSuite需要很多前置软件,编译的时候又会和自己电脑上的环境有各种莫名的问题。因此,在本篇教程里,提供的方法将会比其他教程更加方便且不会有失败的问题。

借用LimeSuite项目

  由于需要用到LimeSuite里的文件,所以现在https://github.com/myriadrf/LimeSuite下载整个项目的源码,并解压。

  然后在该文件夹下搜索LimeSuite.h和LMS7002M_parameters.h两个文件,将这两个文件复制到前面的Simulink-MATLAB-LimeSDR文件夹下。


  此时,仍然需要一个叫LimeSuite.dll的文件,但是这个文件的生成是需要在win10上用cmake编译LimeSuite才能生成的,我按照Windows源代码编译LimeSuite这个教程尝试编译得到的.dll文件无法在该项目里使用(在后面的编译阶段,我一直不能够编译出LimeSuite.exe这个GUI界面,因此生成的LimeSuite.dll存在问题,直接复制到matlab-limeSDR这个文件夹下仍然会报错)。
  我这里的解决办法是,在LimeSuite项目的release里找到了别人编译好的dll文件…..链接在这里:LimeSuite项目release。只需下载LimeSuite20.10_64bit.dll文件即可。

  最后,将这个dll文件复制到我们的matlab-limeSDR文件夹下,并将这个dll文件重命名为LimeSuite.dll即可。注意,这里必须要重命名,因为代码里需要检测到这个文件名。
  此时,我们需要的所有依赖文件都拿到了,最终的文件夹下应该有的文件有以下这些:



在matlab上首次编译Simulink-MATLAB-LimeSDR

  首次运行的时候,需要先编译一下,因此需要你的电脑上有VS或者Mingw等编译器,这个在这里不再赘述。在matlab的工作区输入 limeSDR.build_thunk,会出现橙色的警告信息,但这个不影响我们的使用,文件夹下同时也看到了VS的编译文件:



尝试使用matlab-LimeSDR

  现在我们通过USB3.0线连接LimeSDR和电脑,在matlab上声明一个LimeSDR对象:

rx = limeSDR()

  会发现有报错信息:




  根据报错,我们将limeSDR.m文件中的第170行注释掉。再次运行rx = limeSDR()



  又出现报错,继续将174行注释掉,再运行rx = limeSDR()



  ok~~~ 至此,我们可以在Matlab上使用LimeSDR了~
  输入

rx.info

  可以看到自己的LimeSDR的各种信息:

  由于LimeSDR有2个发射天线和2个接收天线,所以有rx0,rx1,tx0,tx1四个可调用的天线。

接收无线信号

  由于该项目没有给出使用文档,这里给出的使用方法是我通过看源码的变量命名猜的…或许存在我理解不对的地方
  我们尝试一下使用rx0这根天线接收环境中的无线信号。首先看一下rx0包含的参数:




  samplerate — 采样率,默认为3e6。可修改范围为0.48M – 63.30M (只是不报错情况下可以设置的范围,具体是否能够支持63.3M或许与电脑的性能有关吧)
  frequency — 中心频率,默认为1e8。可修改范围为100k – 3.8G。应该是左对齐模式。
  bandwidth — 带宽,默认为0。应该是在发射端要设置的,接收端修改这个参数不影响采样效果。
  antenna — 选择使用的天线,rx默认为2,tx默认为1。根据我的测试antenna选择2的时候,使用的是rx1_2端口,发送端由于我手头设备不全,暂时没法测试。。
  gain — 增益,接收端默认为0.7808,发送端默认为0.8421(不太懂为什么是这样的数值)
  running和timestemp,这两个是只读参数,无法修改。

  下面尝试一下接收信号

rx = limeSDR();
rx.rx0.frequency = 91e6; % 设置中心频率为91.6M
rx.rx0.samplerate = 1e6; % 设置采样率为1e6

rx.rx0.enable;      % 激活rx0
rx.start;           % 启动limeSDR

data = rx.receive(3e6); % 采3e6个点结束

rx.rx0.disable;     % 取消激活rx0
rx.stop;            % 停止limeSDR

  这里我们尝试采样了3e6个点,然后我们观察一下频谱:




  阿这….可能是室内的FM信号太弱了…那些奇怪的噪声是LimeSDR本身的器件噪声和DC噪声,这是因为limeSDR本身的硬件设计上存在一定缺陷,滤波等问题略大。

2021.10.15插入更新

————————————–分割线————————————–

  后面发现是由于天线选择问题,导致不仅没有接收到有效信号,还出现了非常多的噪声。具体分析在最后,下面是正确的频谱样子:




中间有微弱的FM广播信号(由于我的学校地理位置较偏。。。附近真的收不到FM信号。。。),我带宽也放到了10M,能看到比较弱的很窄的FM信号。

————————————–分割线————————————–

  对于接收rx.receive()函数,输入的参数是每次采样的点数,和RTL在matlab的使用一样,如果我们想要控制采集时间,我们只需这么写:

RunTime = 0; % 计时器
DurTime = 5; % 设置录制5秒
RecordPoint = 1e6; %设置每采集1e6个点返回
FrameTime = RecordPoint / rx.rx0.samplerate;
data = [];
while RunTime <= DurTime
   data = [data rx.receive(RecordPoint)];
   RunTime = RunTime + FrameTime;
end
plot(abs(fft(data, 1e6)));

  每帧的实际采样时间FrameTime = RecordPoint / rx.rx0.samplerate,因此只要设置一个计时器RunTime和DurTime即可。
  看一下fft,可见LimeSDR的噪声很大。。。这个确实坑啊。。。



关于LimeSDR的指示灯

  对于判断LimeSDR是否正常工作,我们可以通过LimeSDR的指示灯来判断。
  当连接上LimeSDR时,正常状态下LimeSDR上的两个指示灯LED1和LED2会有一个常绿,一个红绿闪烁。




  当执行limeSDR.build_thunk和rx = limeSDR后,指示灯变成一个常绿,一个闪烁绿光:



  当执行rx.rx0.enable和rx.start,指示灯变成一个常红,一个闪烁绿光:


最后

  LimeSDR我认为是一款性价比非常高的SDR,价格只需要2000+rmb左右,它的频率范围,采样率等可以做到大部分USRP才能做的事情,弥补了以往一系列SDR的很多不足。然而也存在一些问题,例如硬件设计上,滤波的设计不够好,导致器件噪声很多等。
  关于LimeSDR在matlab上发射信号的教程,由于我个人的工作不太涉及使用SDR发射信号,另外原作者没有给出什么使用文档,再去猜测相关代码实在是需要很大的精力,我只尝试了最基础的发射,还没有搞明白如何控制多天线发射、全双工收发等问题(唯一能够成功全双工是开两个matlab一个控制rx一个控制tx。但是这样相当费劲)。这个教程暂时只更新到接收端的使用,如果有可能,后面再更新tx的使用吧~

2021.10.14更新

  突然意识到上面那个频谱图没收到信号,可能的原因是调用的天线是高频段的?lime的接收分为1.5G以下和1.5G以上,可能是上次测试的时候使用的天线搞错了?有时间再测测

2021.10.15更新

  今天验证了一下确实当RX.rx0.antenna = 2时,调用的是低频段天线(LimeSDR官方所谓的对应1.5G以下频率的),而antenna = 1时用的是高频天线。如果翻过来就会只接收到乱七八糟的噪声…这是个不小的坑…而且LimeSDR板子上的天线接口是很多,具体对应的频段什么的似乎各不相同,相关资料比较少,我暂时没有折腾明白。。。有机会再更新…

Add a Comment

邮箱地址不会被公开。 必填项已用*标注