使用RTL-SDR和Matlab Simulink玩转软件无线电(二十一)

3.13 扫描频谱:把25MHz1.75GHz的信号都收下来。

这一节我们会做本章最后一个练习,使用一个RTL-SDR扫描整个频率范围内的信号。对于大多数RTL-SDR设备来说(R820T版本,1.6节里讲过)这个范围是25MHz1.75GHz,整个宽度是1.725GHz。(注意,有些少见的RTL-SDR使用了E4000的调谐器,它的范围是从53MHz2.2GHz,但是它在1.1GHz1.25GHz间不能用,我们会用它和R820T版本对比)


我们定义扫描是一个不断调谐RTL-SDR到不同中心频率并获取频谱信息的过程。图3.17介绍了这一过程如何产生整个频谱的信息。


在理想情况下,我们会把SDR的采样率设置得很高,比如100MHz,但是我们现在的设备只是一个RTL-SDR,它的带宽最大只有2.8MHz,每次重新调谐只能增加2.8MHz的一小段。每次选择的新的中心频率都比之前的高2.8MHz。因此如图3.17fc(i+1)=fc(i)+2.8MHz,调谐15次产生42MHz带宽的信息,之间没有重叠。


我们写了一个Matlab脚本,你可以运行一下试试。


练习3.13 扫描整个频率范围从25MHz1.75GHz

这个练习中你会使用RTL-SDR来扫描整个频谱,并且绘图。我们提供了脚本,你不需要自己写,只需要点击运行即可。如果你想知道更多的原理,可以先看看练习4.2


(a)打开Matlab。把工作文件夹设置到练习目录/spectrum/sweep,然后打开脚本…/rtlsdr_rx_specsweep.m


(b)检查参数。rtlsdr_rx_specsweep函数开头有各种参数。这些参数用来控制最低和最高频率,以及RTL-SDR的设置。


(c)更改location为你自己的地名。默认是我们的地名glasgow。这个参数决定了标题和文件名。设置start_freqstop_freq,这是你要扫描的范围。你需要确定你的RTL-SDR可以调谐到这些频率上。R820TE4000的范围在表3.2中给出。


(注意:如果是E4000RTL-SDR,你需要你要分两段扫描,因为调谐器内部的PLL不能设置在它的死区里)


你可以更改RTL-SDR相关的参数,比如rtlsdr_idrtlsdr_gain。你也可以更改rtlsdr_fs。但是如果你改了以后就与我们后面的解释不相符了。


默认情况下,RTL-SDR的采样率是2.8MHz,同时有2个通道IQ。也就是说在matlab代码里,信息的带宽是2.8MHz,并且包含了fc-1.4MHzfc+1.4MHz的频谱信息。由于频率响应不平坦,见练习3.12,把每次扫描的步进设置为低于2.8MHz更好。Matlab脚本的信息范围减小为fc-1.2MHzfc+1.2MHz,这样RTL-SDR的响应足够平台。每次重新调谐,增长的频率值是1.4MHz,这样不停重复这个步骤就会得到完整、平坦的频率信息。


其他参数可以看看函数开头。


nfrmhold表示的是RTL-SDR每次重新调谐后收取的帧数。理想情况下这个数字越大越好,但是如果增加这个数字将极大提高程序处理时间。fft_hold控制了取值的方式。如果设置为avg,就是把每个频率分量的功率的平均值算出来,如果设置为max,这个操作使用的就是这段时间内这些分量的功率的最大值。


nfft设置的是FFT计算的点数。dec_factor用来控制显示图像时的抽取率。我们设置的是16,这样最终的图像看上去不会太繁杂。overlap是表示两次调谐间重叠覆盖的范围。正如我们之前所说。默认的重叠值是0.5,表示RTL-SDR每次调谐后增加fs/2Hz。最后一个参数,nfrmdump表示的是每次重新调谐后要扔掉多少数据。RTL-SDR每次重新调谐后大概有100帧的IQ采样是要扔掉的,后面的数据才会是有效数据。在脚本中我们把无效数据扔掉,这样它们不会影响平均值的计算。


我们前面说过,更改这些参数可能造成不好的结果。你现在先不要改。


(d)观察剩余代码。与练习2.6里的代码相比,我们这里的代码更复杂一些,在显示前要处理更多数据。大致的代码工作流程如图3.18,你要能把这些部分的描述和代码对应起来。


Function:rtlsdr_rx_specsweep

%用户可以设置仿真参数和扫描范围

%做了一些计算来找到所有要调谐的中心频率点

%调用create_spectrumcapture_and_plot函数

%画图并保存


Function:create_spectrum

%创建并自定义图像窗口,使其看上去类似频谱仪

%运行axes_position,创建两个轴


Function:axes_position

%通过当前的图像大小(单位是像素)来重新调节两个轴在图像窗口中的位置


Function:resize_spectrum

%用户每次重新调整图像窗口就会回调这个函数

%调用axes_position来重新在窗口里绘制坐标轴


Function:capture_and_plot

%创建RTL-SDR对象和其他接收机组件

%把数据帧从RTL-SDR采集下来

%把数据转到频域

%然后把RTL-SDR调谐到下一个中心频率点,重复前面的过程

%所有数据都得到后,把它们绘制到图像窗口上


(e)信号分析:提供了频谱扫描功能。在你运行脚本扫描你附近的频谱活动前,你可以先看看其他地方的结果。打开’R820T Glasgow’的扫描结果(如图3.19)或者点击下面的超链接。


这幅图展示的是Matlab图像窗口(由脚本绘制,使其看起来像个频谱仪),它显示的是整个频谱范围内各信号在各频率分量上的功率。你可以把窗口最大化,这样你就能看到完整标题。上方的蓝线展示的是dBm为单位的频率分量功率,下面橘黄色的线表示的功率值的单位是瓦特。


(f)看看频谱图,观察整个扫描结果里有多少频率峰值,我们可以看到Glasgow有大量不同的信号。使用放大工具可以仔细观察,把这些信号与下表3.3的介绍相互参照一下。


在这几个频率上放大,你可以看到各种信号都有自己的特性,幅度,带宽,调制类型都不同。

有些信号的功率很高,带壳很窄,有些信号的带壳很大,有许多载波,但是强度都低一些。


(g)还有些别的扫描图像。在/sweep文件夹里,你可以看到许多地方的扫描结果有美国的英国的,还有大西洋上方30000英尺高空的。你可以在网上查查这些信号是什么。


(g)准备运行脚本。你熟悉了脚本并预见了它大概的结果,是时候运行了。确保RTL-SDR接入电脑,Matlab能够调用它,然后把别的无关程序关掉释放内存。


(i)运行脚本。点击运行按钮,等待几秒,Matlab会与RTL-SDR建立连接,然后开始接收数据。在运行过程中,RTL-SDR的当前频率值会以如下方式在Matlab命令窗口中显示。


这个脚本会持续运行,直到所有频谱活动都记录下来。这个过程可能需要10分钟,如果你电脑的内存小可能时间更长。如果你要终止程序,可以在键盘上按下CTRL+C


如果你在运行完成前就终止,那么你不会看到图像。只有当它完全扫描后,才能看到图像。


完成后,频谱仪的图像就出来了,这个图像表示的是你附近的频谱活动,你可以看到两个坐标轴。你可能需要最大化窗口,这样图像标题和坐标轴的显示才会正确。


(j)除非你在Strathclyde大学运行程序,否则你的结果会跟我们的结果很不一样。因为世界上所有地方的频谱图都不一样。这也是本练习有趣的地方。


(k)观察你的频谱。使用放大工具看看你附近的频谱,你找到和我们前面说过的类似信号了吗,你能猜猜它们是什么吗?


(i)识别信号。把信号的中心频率记住,然后找找你的国家的相关信息,认出这个信号的种类。英国读者可以查一下Ofcom的频率分配表。


(m)E4000RTL-SDR/sweep文件夹还给了E4000的扫描结果。你看到区别了吗


E4000是零中频调谐器。基带信号很可能含有很大的直流波峰。这与R820T完全不同,R820TDC分量附近没有东西。E4000的直流分量太大,甚至不能用练习3.1的方法来去除,它会保留在频谱里,这就产生了一个问题。


观察E40002GHz的范围,你还能看到72100MHzUMTS频道,每个5MHz宽。注意频谱看上去毛刺很多。这些毛刺是每次调谐的DC分量。也就是说每个毛刺都对应了一个中心频率。R820T设备不会有这种现象,但是R820T设备不能接收1.75GHz以上的信号。


3.14总结

本章节的练习帮助你了解RF频谱,正是它们实现了我们的日常通信。你可以看到我们用了不同的调制方式。你也能通过频谱特性把它们区分出来。我们介绍了通过观察来调谐无线电的方法,你学会了如何调谐RTL-SDR的增益。你现在学的东西对后面的部分很有用。

你可能感兴趣的:(Simulink)