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

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

本文原文作者是sund,原文链接是http://www.sund-xys.cn/matlab-rtlsdr/,经原文作者授权后转载。欢迎大家关注本文作者的博客http://www.sund-xys.cn/。

目录

一、前言

二、RTL-SDR驱动安装

三、安装matlab RTL-SDR硬件支持包

四、在MATALB上使用RTL-SDR

1、FM广播接收

2、RTL-SDR硬件支持包的函数

3、录制无线信号测试

4、连续扫频测试

五、总结


一、前言

matlab在R2013b版本以后支持了调用RTL-SDR的硬件支持包,但是相关资料很少;中文互联网上的教程关于如何使用的教程几乎是空白。在这里我尝试将我的使用过程总结一下以抛砖引玉,希望能够帮助到其他的无线爱好者更方便的使用RTL-SDR~
  RTL-SDR是Realtek的一款SDR,后来被人hack以后能够开启2.2GHz以内频段的接收(最大是2.2G,这和你购买的sdr所使用的前端调谐器有关),理论采样率为3.2MHz,但是在实际使用中我推荐设置为2.4MHz以下可以无失真的接收。下面是常见的RTL-SDR调谐器的型号以及对应的频率范围:

  本文大概有以下几个部分:
  1.RTL-SDR驱动安装
  2.安装matlab RTL-SDR硬件支持包
  3.支持包的相关使用函数和例程

二、RTL-SDR驱动安装

在拿到RTL-SDR这个地球上最便宜的sdr设备后(京东上100r,淘宝5 60r左右。我用的是RTL2832U),需要用Zadig软件安装一下RTL-SDR的驱动。Zadig请自行下载~一般京东或淘宝的店家会有RTL-SDR的软件包,包括Zadig和各种版本的SDRSharp软件(一个很方便观察无线频谱的软件),以及飞机追踪的套件(很多无线电爱好者喜欢用它尝试接收1090MHz的民航轨迹信号)。

安装驱动前,需要将RTL插在电脑的USB口。然后打开Zadig,在Options下点击List All Devices,并且勾选上Ignore Hubs or Composite parents,注意这里一定要勾选Ignore这个选项,如果不勾选则安装的驱动(会出现USB开头的)虽然可以让RTL-SDR在SDRSharp等软件上使用,但是无法在MATLAB平台上识别到设备。

接下来在下面的选择框中选择RTL开头的驱动,点击安装等待即可。

三、安装matlab RTL-SDR硬件支持包

安装好RTL的驱动后,在matlab的附加功能-获取硬件支持包里找到RTL的支持包Communications Toolbox Support Package for RTL-SDR Radio

安装这个支持包后,按照指示一步步完成第一次的设备识别。

注意,此时RTL需要一直插在电脑上。

等待识别成功后,在matlab的work space输入sdrinfo,观察是否能够正常识别到RTL设备。

四、在MATALB上使用RTL-SDR

先说一下,RTL-SDR硬件支持包的官方网站 在这个官网上有一本674页的图书,里面有详细的文档。

1、FM广播接收

首先尝试一下RTL-SDR连接MATLAB正常接收无线信号,对在matlab上调用rtl有一个直观感受。运行以下代码观察频域是否能接收附近的无线信号,通常我会用FM频段(在中国FM频段为87-108MHz)的信号测试SDR的情况,这里我测试接收91.6MHz处的FM广播信号:

fc   = 91.4e6; % Center frequency (Hz)
FrontEndSampleRate = 1e6;     % Samples per second
FrameLength        = 256*20;  % Frame length% Create receiver and spectrum analyzer System objects
hSDRrRx = comm.SDRRTLReceiver(...'CenterFrequency', fc, ...'EnableTunerAGC',  true, ...'SampleRate',      FrontEndSampleRate, ...'SamplesPerFrame', FrameLength, ...'OutputDataType',  'double');hSpectrum = dsp.SpectrumAnalyzer(...'Name',             'Passband Spectrum',...'Title',            'Passband Spectrum', ...'Method',           'Welch', ...'SpectrumType',     'Power density', ...'FrequencySpan',    'Full', ...'SampleRate',       FrontEndSampleRate, ...'SpectralAverages', 50, ...'FrequencyOffset',  fc, ...'YLimits',          [-80,10], ...'YLabel',           'Magnitude-squared, dB', ...'Position',         figposition([50 30 30 40]));%% Stream processing
% View spectrum.  While the spectrum analyzer is running, you can measure
% peaks, occupied bandwidth, and other properties of the signal.
if ~isempty(sdrinfo(hSDRrRx.RadioAddress))for count = 1 : 5000[data, ~] = step(hSDRrRx);  % no 'len' output needed for blocking operationdata = data - mean(data);  % remove DC componentstep(hSpectrum, data);end
elsewarning(message('sdrbase:sysobjdemos:MainLoop'))
end% Release all System objects
release(hSDRrRx);
release(hSpectrum);

版权声明:这段代码修改自Mathworks的官方例程
如果可以观察到正确的FM信号,则证明可以使用了:

2、RTL-SDR硬件支持包的函数

调用rtl需要先用 comm.SDRRTLReceiver 创建RX对象。具体语法包括:

RXobj = comm.SDRRTLReceiver
RXobj = comm.SDRRTLReceiver(Name,Value)
RXobj = comm.SDRRTLReceiver(RadioAddress,Name,Value)

但是在实际使用中,如上一节所写的一样,我们需要指定RX对象的各种参数,包括中心频率、采样率、自动增益控制等等。这个函数所支持的参数有:
RadioAddress — 指定使用哪个USB口的RTL-SDR设备。默认是0。这个值可以用 sdrinfo 来查看。
CenterFrequency — 指定RTL接收无线信号的中心频率,单位为Hz。默认为102.5MHz。
EnableTunerAGC — 指定是否打开自动增益控制。默认为true。
TunerGain — 指定调谐器的增益。单位为dB。默认为0。注意,如果要手动指定增益,需要将EnableTunnerAGC设置为false。
SampleRate — 指定RTL的采样率。在matlab上这个支持包上支持的范围是225~300kHz和900~3200kHz,官方建议设置小于等于2560kHz可以避免失真。
OutputDataType — 指定输出的数据类型。可选类型有 int16 | double | single 。当选择输出int16数据类型时,输出的是原始的16位IQ数据。默认为int16。
SamplesPerFrame — 指定每帧的采样数。默认为1024。 这里值得多说一下的是,RTL的RX对象对于每次采样是采集到到指定的每帧采样数后完成本次采样。所以,在实际的连续采样时,我们需要连续多次调用RX对象进行采样。那么,每一次采样的真实时间为:

FrameTime = SamplesPerFrame / SampleRate

所以在实际的连续采样中我们可以设置一个runTime作为计时器并不断更新来控制接收时间。
FrequencyCorrection — 指定频偏矫正。默认为0,单位为ppm。支持的矫正范围为-1e4 ~ 1e4。值得注意的是,据我所知,市面上售卖的RTL-SDR的晶振有一些是不带温度补偿(TCXO)的。
EnableBurstMode — 指定是否开启突发模式。默认为true。(这个我不太了解具体是什么,尝试打开和关闭好像没发现有什么区别…)
NumFramesInBurst — 指定连续突发的帧数。默认为10(同样不太了解应该在什么情况下使用…)
  声明RX对象例子:

rx = comm.SDRRTLReceiver(...'CenterFrequency', 120e6, ...'EnableTunerAGC',  true, ...'SampleRate',      2.4e6, ...'SamplesPerFrame', 2048, ...'OutputDataType',  'int16');

其他参数没有特殊声明都是默认值。

调用RX对象的语法包含:

rxdata = RXobj()
[rxdata,len] = RXobj()
[rxdata,len,lost] = RXobj()
[rxdata,len,lost,late] = RXobj()

这里的RXobj为前面声明的RX对象名称,调用时将RXobj替换成你所声明的对象名称即可。
对于输出参数:
rxdata — 采样的数据值。数据类型、数据长度等与RX对象里的参数设置一致。
len — 返回有效采样数据的长度。如果没有采集到数据,则返回0。
lost — 返回丢失的采样数据长度。如果是正常运行,则lost返回值为0。
late — 返回帧延迟数量。
对于进行无线实验,录制一段信号,我们关注的是rxdata原始数据,所以让其返回int16类型即可(IQ原始数据)。len、lost、late一般会用于观察RTL的实时性能,如果出现了数据丢失或者延迟,说明RTL实时运行可能存在问题,这有可能和所使用电脑的CPU、内存、硬盘性能有关。

RX对象函数包含:

step 运行采集数据算法

release 释放资源,用于修改已有的RX对象的参数

reset 重置RX对象内部状态

3、录制无线信号测试

在实际采集数据时,我们可以这样写:

recordData = [];
for FrameNum = 1 : 100 %想要采集多少帧按照自己的需求recordData = [recordData RXobj()]; % 或者可以写成step(RXobj),或是RXobj.step()
end

然而,在前面也提到了我们通常录制一段无线信号更偏向以时间为单位,例如录制多少秒,以上面这种按帧的方式不便于理解和计时,因此,我们可以这样写:

RunTime = 0; % 计时器
DurTime = 10; % 这里我假设需要录制10秒
recordData = [];
FrameTime = RXobj.SamplesPerFrame / RXobj.SampleRate;
if ~isempty(sdrinfo(hSDRrRx.RadioAddress))while Runtime < DurTimerecordData = [recordData RXobj()]; % 这里我将原始数据完全的保存到变量里了,这样做其实很费性能...RunTime = Runtime + FrameTime;endelsewarning(message('sdrbase:sysobjdemos:MainLoop'))
end

将原始数据保存到变量里再做计算是一个非常费性能的操作,以我的Envy 13笔记本为例,CPU为i7-8550U,内存为8G,想要绘制带宽为2MHz几秒钟的无线信号的瀑布图要等待数十秒……下面是绘制一段91.6MHz的FM信号,时间长为3.5秒的频谱图的结果。绘制这张图让我的matlab卡了大概20多秒,想要再修改一下坐标轴直接卡死…所以只截图了不带坐标轴的地方…(我都玩rtlsdr了 还指望我能用上什么好电脑-.-)

4、连续扫频测试

虽然RTL的带宽很小,但是这个支持包的开发者提供的样例程序里给出了一个从25MHz到1750MHz的扫频代码…我尝试运行了一下,确实能扫频…只能说一句牛逼了

我在房屋内进行了两次25MHz~1750MHz的扫频测试,下面分别是两次的扫频结果:

在这两次测试中,RTL的采样率设置为2.8MHz,FrameLength为4096,Tuner的增益为40dB。由于带宽实在是太低了,两次测试的实际运行时间分别为287.4292s和411.5904s。第二次可能是因为我调用了matlab的代码追踪,让整体的运行时间更加长了-.-

关于扫频的代码,由于我几乎没有修改原作者的代码,就不便放上来了,感兴趣的同学可以在开发团队的官网下载,具体位置在../Software_Defined_Radio_using_MATLAB_Simulink_and_the_RTL-SDR___book_and_support_files/spectrum/sweep下的rtlsdr_rx_specsweep.m文件。

五、总结

RTL-SDR这个地球上最便宜没有之一的软件无线电设备,是很多人接触、入门无线领域的第一个设备,我个人认为从RTL开始接触学习无线通信&无线安全等方面是一个非常好的选择,在一些情况下用RTL会比用usrp更容易携带和随时测试(当然,RTL是不可能碰瓷usrp的高性能的)。从安全角度,很多无线窃听的攻击需要无线设备的隐蔽性和可携带性,例如TEMPEST窃听和GSM窃听等,RTL是一个很好的选择(!我不是推荐实施恶意攻击0.0 只是看到很多这么做实验的…)

写这篇教程的想法是因为在折腾RTL的时候,一直用的是HDSDR,SDR#,GNU Radio这些软件。但是我个人的一些实验需求需要在matlab进行一些计算,从其他软件上录制后再导入到matlab进行计算实在麻烦(虽然似乎可以单独开一个端口传输采集的数据),就考虑直接在matlab上控制RTL来采集信号和计算了。然而在网上能看到的教程少之又少,matlab官网关于这个支持包也只给出了基本的函数描述,中文互联网上没有更多的资料了,就把我踩过的坑写写以抛砖引玉~ 有一说一这个硬件支持包的坑还是有点的,比如每次采集数据是按照每帧大小采集的,matlab的官网上的描述又没有给出如何采集确定秒数的数据等。

在折腾这个RTL-SDR硬件支持包中,很多资料来源于原开发团队的官方图书《Software Defined Radio using MATLAB® & Simulink® and the RTL-SDR》,这本图书在官网有电子版下载,以及他们给出的很多例程代码,都是可以免费下载的。

关于RTL-SDR在matlab上的使用我还参考了一些其他但不限于以下的资料:

* matlab官方文档
* RTL-SDR在matlab上解码无线信号白皮书
* desktopSDR-paper这是原作者团队于2015年发表在IEEE Communications Magazine上的一篇关于这个支持包的文章
* desktopSDR官网

About The Author of this blog:Sund

wireless side-channel / air-gapped attack / covert communication / wireless sensing

MATLAB的RTL-SDR硬件支持包使用详细教程相关推荐

  1. 如何安装第三方站点下载的Matlab工具箱或硬件支持包,亲测有效。

    如何安装第三方站点下载的Matlab工具箱或硬件支持包,亲测有效. 背景说明 安装方法 说明 背景说明 今天给大家说一说,有时候我们下载Matlab官方的工具箱或者硬件支持包会出现下载时间过长,下载到 ...

  2. Matlab 2017b安装硬件支持包

    Matlab 2017b安装硬件支持包 最新不知道怎么了,Matlab R2017b在线安装硬件支持包总是显示"网络连接问题".搜索了一下,找了解决方案: 1.去下列网址下载离线包 ...

  3. 玩转 MATLAB 附加功能/硬件支持包安装

    解决不能下载附加功能.硬件支持包的使用方法. MATLAB 作为一个开放的科学计算.系统仿真与设计.以及软件产品开发的工程平台,其生态圈有非常丰富的内容. 尽管时至今日 MathWorks 已在最新的 ...

  4. Matlab安装硬件支持包

    Matlab安装硬件支持包 由于我们使用的版本是未激活的版本,所以在线安装就会出现下面的问题 1.只能去下列网址下载离线包下载工具下载硬件支持包和可选功能 根据自己的操作系统选择对应版本,得到的如下 ...

  5. MATLAB和SIMULINK硬件支持包安装的问题总结

    安装MATLAB SUPPORT PACKAGES FOR ARDUINO 和 SIMULINK PACKAGES FOR ARDUINO 时,经常出现报错信息第三方支持包Arduino Softwa ...

  6. 解决matlab无法下载arduino的simulink硬件支持包的方法

    在下载arduino硬件支持包时,simulink和matlab下载多达十几个第三方支持包. 由于网速或者被墙的原因往往下载到一半就会报错,提示下载出现问题  应对方法如下:打开硬件支持包的下载位置, ...

  7. Matlab硬件支持包开发流程

    最近在做基于模型设计的开发,不仅仅要做MBD还要做配套的硬件支持包,即MCU对应的底层驱动,查阅了很多资料后发现,这方面的资料实在是太少了,自己整理了一些硬件支持包的开发流程,和大家分享一下. 目录 ...

  8. TIA博途中无法添加HSP硬件支持包的解决办法

    TIA博途中无法添加HSP硬件支持包的解决办法 硬件支持包安装的过程应该很简单,但是在安装的时候遇到了一个奇怪的问题. 如下图所示,下面就描述一下问题发生和自己的解决方法: 打开TIA博途V16,在 ...

  9. 魔百盒M401A_晶晨S905L3A_2+16G_安卓9_原厂卡刷固件包及详细教程

    魔百盒M401A_晶晨S905L3A_2+16G_安卓9_原厂卡刷固件包及详细教程 固件特点: 1.采用江苏版401原厂卡刷包制作: 2.当贝桌面纯净版: 3.适用于晶晨S905L3A: 4.使用原机 ...

最新文章

  1. maplet, power set, domain subtraction,
  2. hdu 5087(LIS变形)
  3. ES6 数值的扩展
  4. ios调用restful接口_做iOS上最好的REST API测试App
  5. 小米笔记本 镜像_华为的裤衩——小米互传
  6. Spring Security笔记:HTTP Basic 认证
  7. 佛祖保佑,永无BUG
  8. 联想昭阳k29轴拆机步骤图_【tableau入门教程23】雷达图
  9. 虚幻4引擎实现自动开门蓝图
  10. sg90舵机工作原理_舵机跑舵原因无解,锲而不舍终除隐患好文推荐!
  11. 八类网线和七类网线的区别_七类网线和六类网线区别有哪些
  12. 把数组排成最小的数(剑指offer第33题)
  13. 不应被忘记的历史——聊聊前阿布时代的切尔西
  14. |函数相乘分离 函数增长速度|day6
  15. controller(控制器)
  16. android屏幕分辨率适配总结
  17. 什么是CDN?怎么搭建?搭建CDN需要什么软件!
  18. 通用权限管理设计篇(一)
  19. N-ary Tree n叉树学习
  20. [知识点整理]中科院/国科大 自然语言处理nlp 期末考试知识点整理

热门文章

  1. 如何使用砌体在WordPress中添加Pinterest样式发布网格
  2. 凡客:成于营销,败于营销
  3. 计算机软件与微电子专业,系专业跟年级_ 计算机软件跟微电子专业98级.doc
  4. 【源码】具有“放大镜”功能的函数magnify
  5. 素材pptuku shutterstock站酷海洛创意海图片代创意矢量图片下载
  6. 咪咕盒子MG100,电视机顶盒禁用软件安装软件
  7. matlab中的折现图
  8. win10+VS2017编译配置boost_1_78_0
  9. gms签名不一致_云浮【签名墙】攻略
  10. Windows仍在设置此设备的类配置。(代码56)