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的增益。你現在學的東西對后面的部分很有用。