0×00 前言前端
GNSS是Global Navigation Satellite System的縮寫。中文稱做:全球衛星導航系統、全球導航衛星系統。linux
GNSS泛指全部的衛星導航系統,包括全球的、區域的和加強的,如美國的GPS、俄羅斯的Glonass、歐洲的Galileo、中國的北斗衛星導航系統,以及相關的加強系統,如美國的WAAS(廣域加強系統)、歐洲的EGNOS(歐洲靜地導航重疊系統)和日本的MSAS(多功能運輸衛星加強系統)等,還涵蓋在建和之後要建設的其餘衛星導航系統。api
0×01 摘要安全
本文描述一種利用GNSS-SDR玩轉身邊無線信號的最廉價方式。因爲這款產品是許多人共同努力的結果,沒法一一羅列,在此僅說起一下此產品的先驅,V4L/DVB內核的開發人者Antti Palosaari,他發現基於 realtek瑞昱(也稱螃蟹)RTL2832U 芯片的USB電視棒存在一種未公開的操做模式, 啓用以後能夠做爲一種廉價的軟件無線電的前端。這個重要功能是芯片容許設備向主機發送原生的I/Q採樣信號,而後主機負責對DAB/DVB+/FM信號進行解調。這對GNSS軟件接收器來講是好消息,由於它覆蓋了目標頻率帶寬。網絡
參考規格說明書,RTL2832U可以以高達3.2 MSPS基帶採樣頻率輸出8位I/Q採樣信號。不過,經測試發現無損的最高採樣頻率是2.8 MSPS。頻率範圍嚴重依賴於所用的調諧器。使用Elonics E4000調諧器的電視棒可能提供最寬的頻率範圍(64-1700MHz,而1100-1250MHz之間的存在採樣盲區)。當超出規範使用時,調諧器能夠覆蓋50MHz-2.2GHz(包括盲區)。有關此設備兼容性的更多信息能夠參考OsmocomSDR Wiki。ide
全球衛星導航系統(GNSS)Galileo-E1和GPS-L1鏈路的中心頻率是 1575.42MHz,而E400調諧器芯片能夠覆蓋這個頻段。咱們能夠配置GNSS-SDR,把RTL2832U做爲實時信號源,從而爲搭建GPS-L1信號接收器提供一種低成本的選擇(數十塊)。關於GNSS-SDR這個新功能,本文將介紹操做細節以及一些性能測試。函數
0×02 OsmoSDR驅動oop
爲支持realtek瑞昱RTL2832U芯片的電視棒,GNSS-SDR須要使用OsmoSDR GNU Radio數據源模塊(source block)及其驅動。研究人員實現新的 GNSS-SDR數據源適配器,即其實是OsmoSDR上gr_hier_block2的類實例,而關聯的GNSS-SDR 數據源名稱爲Osmosdr_Signal_Source。適配器的源碼位於:性能
trunk/src/algorithms/signal_source/adapters/osmosdr_signal_source.h
trunk/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc
經過包含如下頭部文件,調用libgnuradio-osmosdr 函數庫:測試
#include <osmosdr_api.h>
#include <osmosdr_source_c.h>
編譯時增長GNSS-SDR對RTL2832U的支持是可選的,須要安裝 OsmoSDR庫。關於一步步構建的操做方法,請查閱位於trunk/README的GNSS-SDR 說明文檔。
0×03 設置GNSS-SDR 開啓GPS-L1實時模式
爲了兼容 USB DVB-T設備,咱們必須在 GNSS-SDR配置文件(gnss-sdr.conf) 中選擇 Osmosdr_Signal_Source做爲信號源模塊(SignalSource block)。此外,咱們也須要配置以下參數:
基帶採樣頻率 //the baseband sampling frequency
射頻中心頻率 //the RF center frequency
射頻增益(IF gain) //the RF gain
自動增益控制(AGC) 模式 //the AGC operation
可正常接收 GPS-L1 C/A信號的有效配置以下:
[GNSS-SDR]
;######### GLOBAL OPTIONS ##################
GNSS-SDR.internal_fs_hz=2000000
;######### CONTROL_THREAD CONFIG ############
ControlThread.wait_for_flowgraph=false
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=Osmosdr_Signal_Source
SignalSource.item_type=gr_complex
SignalSource.sampling_frequency=2000000
SignalSource.freq=1575420000
SignalSource.gain=60
SignalSource.AGC_enabled=true
SignalSource.enable_throttle_control=false
安全研究員建議把採樣頻率設爲2 MSPS。在酷睿2四核Q9000處理器@2.66GHz主頻和4G內存的硬件狀況下,這一配置能夠實現8個衛星信道的實時接收操做。此外,啓用E4000的自動控制增益(AGC)能夠得到最好效果。
0×04 RTL2832U振盪器精度和穩定性的問題
正如Michele Bavaro在他GNSS 博客上提到的, RTL2832U 電視棒所用晶體振盪器的精確度很是低。經過在兩種設備(EzCap666和Generic P160)上的實驗證明了這個問題。做者使用高精度的信號生成器在GPS-L1鏈路上產生未調製的載波信號,而後在捕獲的信號中測量載波頻率錯誤。在EzCap設備上產生的誤差是80KHz,而在P160設備上產生的誤差是14.8KHz。
本地晶體振盪器的的偏差會給GNSS接收器形成兩種影響:
1.基帶信號會偏移到一箇中頻( Intermediate Frequency //IF //中高頻;中高頻中間頻率; ),等同於壓控振盪器的誤差(VCO deviation)。也能夠視爲明顯的多普勒頻移。若是疊加的多普勒頻移(實際的信號多普勒頻移+偏移的中頻)超過可辨識的多普勒搜索間距,信號識別便會失敗。
2.因爲模數轉換器的採樣時鐘也要參考本地振盪器,因此採樣頻率也會出現誤差。這個問題會影響追蹤的延時鎖相環(Delay Locked Loop DLL),由於配置文件中設置的理論採樣時鐘頻率與實際的採樣時鐘頻率存在誤差。若是誤差太大,追蹤的延時鎖相環(DLL)也會鎖定失敗。
多虧了GNSS-SDR的靈活性,安全研究員能夠經過修改軟件接收器配置來消除這兩種負面影響。一方面,能夠經過啓用以下的頻率轉換FIR過濾器來使用信號調節模塊(Signal Conditioner block )抵消中頻(IF):
;######### SIGNAL_CONDITIONER CONFIG ############
SignalConditioner.implementation=Signal_Conditioner
DataTypeAdapter.implementation=Pass_Through
;######### INPUT_FILTER CONFIG ############
InputFilter.implementation=Freq_Xlating_Fir_Filter
InputFilter.input_item_type=gr_complex
InputFilter.output_item_type=gr_complex
InputFilter.taps_item_type=float
InputFilter.number_of_taps=5
InputFilter.number_of_bands=2
InputFilter.band1_begin=0.0
InputFilter.band1_end=0.85
InputFilter.band2_begin=0.90
InputFilter.band2_end=1.0
InputFilter.ampl1_begin=1.0
InputFilter.ampl1_end=1.0
InputFilter.ampl2_begin=0.0
InputFilter.ampl2_end=0.0
InputFilter.band1_error=1.0
InputFilter.band2_error=1.0
InputFilter.filter_type=bandpass
InputFilter.grid_density=16
InputFilter.sampling_frequency=2000000
InputFilter.IF=14821
;######### RESAMPLER CONFIG ############
Resampler.implementation=Pass_Through
Resampler.dump=false
Resampler.item_type=gr_complex
另外一方面,經過設置GNSS-SDR內部採樣頻率參數預計的採樣時鐘頻率,能夠測量和斟酌採樣頻率錯誤。
GNSS-SDR.internal_fs_hz=corrected_value
InputFilter.sampling_frequency=corrected_value
Resampler.sample_freq_in=corrected_value
Resampler.sample_freq_out=corrected_value
0×05 GPS有源天線
安全研究員使用帶有陶瓷貼片天的低噪聲放大器(Low Noise Amplifier LNA)天線做爲有源GPS天線,從而下降總體的噪聲。下圖展現Garmin GA27C GPS天線,咱們能夠看到在它的PCB板子上有塊陶瓷貼片:
除去塑料殼的Garmin GA-27有源天線
爲把天線鏈接到DVT-T電視棒上,安全研究員須要作一些硬件的修改:
1. 假設GPS天線配置了SMA鏈接器,爲了讓GPS天線可以與DVB-T電視棒對接,咱們須要本身製做射頻(RF)電纜把SMA鏈接器轉換成MCX鏈接器。
2. 須要使用Bias-T網絡(Bias-T network)饋入(feed)低噪聲放大器(LNA)。
0×06 性能測量及結論
爲實時接收和處理GPS信號,安全研究員評估了兩種不一樣的配置。
第一種方法:安全研究員使用自制的20dB放大和過濾電路把DVB電視棒鏈接到有源貼片天線。增益模塊(gain block)提供+5伏直流電壓爲有源天線內部的低噪聲放大器(LNA)供電。
下圖爲DVB電視棒(generic P160)、低噪聲放大器(LNA)和有源天線的組合:
使用外部LNA電路把通用P160 DVB-T電視棒鏈接到的GA-27天線
另外一種方法:安全研究員使用bias-T網絡(standard bias-T network)把有源GPS天線與DVB電視棒的直接鏈接起來。此設置以下圖所示:
使用bias-T網絡把通用P160 DVB-T電視棒鏈接到GA-27天線
在這些實驗中,安全研究員使用Dell XPS M1530筆記本,配置爲:
Intel 酷睿2雙核 T9300 CPU (Intel Core 2 Duo T9300 CPU)
內存:4 GB
操做系統:Ubuntu 12.04
GNU Radio版本爲3.6.0
本文撰寫之時(SVN rev. 227),在把RtlsdrSignalSource 的採樣頻率從2MSPS下降1MSPS狀況下,上述設備能夠支持4個衛星信道的實時操做。雖然支持的帶寬有限,可是GNSS-SDR都可以經過上述兩種配置獲取、追蹤、肯定位置。天線放置在CTTC(建築羣熱時間常數簡寫)建築的屋頂,並在實驗過程一直保持固定。
Tracking.dump=true
Tracking.dump_filename=./tracking_ch_
在後續的分析處理中,研究人員使用Matlab腳本進行完整性檢查(sanity check),腳本位置以下:
trunk/src/utils/matlab/gps_l1_ca_dll_pll_plot_sample.m
圖片清楚地顯示了GPS C/A導航信號。PLL和DLL鑑相器的輸出很是雜亂。
追蹤數據分析
最後,直接經過Google地圖來描繪獲取到的KMV位置文件,以下圖所示。黃線代碼表示10秒間隔內位置的變化,而紅箭頭表示天線實際所在的位置。此外,咱們也繪製了高度的變化狀況。使用4顆衛星和很是低的採樣頻率-1.2MSPS,研究人員即可以估計位置的時間和速度時間曲線(Position Velocity and Time PVT),這裏估計的定位偏差在200米範圍內。
使用Google地圖分析GNSS-SDR估算的位置
0×07 總結
總結這個初步的實驗,研究人員得出結論,使用低成本的Realtek DVB-T電視棒實現GNSS定位是可行的。據稱,這是GNSS軟件接收器首次使用RTLSDR設備進行實時定位操做。這個里程碑可讓咱們使用筆記本和極低成本的硬件獲取GNSS服務的潛能。研究人員正在計劃進一步測試和提高對RTLSDR設備的支持。
*原文地址:gnss-sdr.org