本文內容、開發板及配件僅限用於學校或科研院所開展科研實驗!
溫馨提示:「開源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這個地球上最便宜的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開頭的驅動,點擊安裝等待即可。
安裝好RTL的驅動後,在matlab的附加功能-獲取硬體支持包裡找到RTL的支持包Communications Toolbox Support Package for RTL-SDR Radio
安裝這個支持包後,按照指示一步步完成第一次的設備識別。
注意,此時RTL需要一直插在電腦上。
等待識別成功後,在matlab的work space輸入sdrinfo,觀察是否能夠正常識別到RTL設備。
先說一下,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 secondFrameLength = 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 operation data = data - mean(data); % remove DC component step(hSpectrum, data); endelse warning(message('sdrbase:sysobjdemos:MainLoop'))end % Release all System objectsrelease(hSDRrRx);release(hSpectrum);版權聲明:這段代碼修改自Mathworks的官方例程
如果可以觀察到正確的FM信號,則證明可以使用了:2、RTL-SDR硬體支持包的函數
調用rtl需要先用 comm.SDRRTLReceiver 創建RX對象。具體語法包括:
RXobj = comm.SDRRTLReceiverRXobj = 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 < DurTime recordData = [recordData RXobj()]; % 這裡我將原始數據完全的保存到變量裡了,這樣做其實很費性能... RunTime = Runtime + FrameTime; end else warning(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
歡迎大家關注本文作者的博客http://www.sund-xys.cn/。