3.13 扫描频谱:把25MHz到1.75GHz的信号都收下来。
这一节我们会做本章最后一个练习,使用一个RTL-SDR扫描整个频率范围内的信号。对于大多数RTL-SDR设备来说(R820T版本,1.6节里讲过)这个范围是25MHz到1.75GHz,整个宽度是1.725GHz。(注意,有些少见的RTL-SDR使用了E4000的调谐器,它的范围是从53MHz到2.2GHz,但是它在1.1GHz和1.25GHz间不能用,我们会用它和R820T版本对比)
我们定义“扫描”是一个不断调谐RTL-SDR到不同中心频率并获取频谱信息的过程。图3.17介绍了这一过程如何产生整个频谱的信息。
在理想情况下,我们会把SDR的采样率设置得很高,比如100MHz,但是我们现在的设备只是一个RTL-SDR,它的带宽最大只有2.8MHz,每次重新调谐只能增加2.8MHz的一小段。每次选择的新的中心频率都比之前的高2.8MHz。因此如图3.17,fc(i+1)=fc(i)+2.8MHz,调谐15次产生42MHz带宽的信息,之间没有重叠。
我们写了一个Matlab脚本,你可以运行一下试试。
练习3.13 扫描整个频率范围从25MHz到1.75GHz
这个练习中你会使用RTL-SDR来扫描整个频谱,并且绘图。我们提供了脚本,你不需要自己写,只需要点击运行即可。如果你想知道更多的原理,可以先看看练习4.2。
(a)打开Matlab。把工作文件夹设置到练习目录/spectrum/sweep,然后打开脚本…/rtlsdr_rx_specsweep.m
(b)检查参数。rtlsdr_rx_specsweep函数开头有各种参数。这些参数用来控制最低和最高频率,以及RTL-SDR的设置。
(c)更改location为你自己的地名。默认是我们的地名glasgow。这个参数决定了标题和文件名。设置start_freq和stop_freq,这是你要扫描的范围。你需要确定你的RTL-SDR可以调谐到这些频率上。R820T和E4000的范围在表3.2中给出。
(注意:如果是E4000的RTL-SDR,你需要你要分两段扫描,因为调谐器内部的PLL不能设置在它的死区里)
你可以更改RTL-SDR相关的参数,比如rtlsdr_id和rtlsdr_gain。你也可以更改rtlsdr_fs。但是如果你改了以后就与我们后面的解释不相符了。
默认情况下,RTL-SDR的采样率是2.8MHz,同时有2个通道I和Q。也就是说在matlab代码里,信息的带宽是2.8MHz,并且包含了fc-1.4MHz到fc+1.4MHz的频谱信息。由于频率响应不平坦,见练习3.12,把每次扫描的步进设置为低于2.8MHz更好。Matlab脚本的信息范围减小为fc-1.2MHz到fc+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_spectrum和capture_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)E4000的RTL-SDR。/sweep文件夹还给了E4000的扫描结果。你看到区别了吗
E4000是零中频调谐器。基带信号很可能含有很大的直流波峰。这与R820T完全不同,R820T的DC分量附近没有东西。E4000的直流分量太大,甚至不能用练习3.1的方法来去除,它会保留在频谱里,这就产生了一个问题。
观察E4000的2GHz的范围,你还能看到7个2100MHz的UMTS频道,每个5MHz宽。注意频谱看上去毛刺很多。这些毛刺是每次调谐的DC分量。也就是说每个毛刺都对应了一个中心频率。R820T设备不会有这种现象,但是R820T设备不能接收1.75GHz以上的信号。
3.14总结
本章节的练习帮助你了解RF频谱,正是它们实现了我们的日常通信。你可以看到我们用了不同的调制方式。你也能通过频谱特性把它们区分出来。我们介绍了通过观察来调谐无线电的方法,你学会了如何调谐RTL-SDR的增益。你现在学的东西对后面的部分很有用。