天天看點

軟體無線電zedboard+fmcomms2實作GPS信号模拟和接收一、硬體及配置二、代碼編譯和運作三、信号接收四、信号生成代碼的關鍵修改(坑)五、後續

這個實作使用了多種軟硬體平台,包括MATLAB、QTcreator等。發射通道是在Ubuntu虛拟機使用QTcreator編譯代碼控制的,接收通道在window下利用MATLAB實作的,整個下來花了兩天左右的時間才完成。

一、硬體及配置

硬體使用的是zedboard+fmcomms2,在硬體端運作的是官方支援MATLAB開發的SD卡系統,下載下傳和配置都使用MATLAB官方的軟體包設定guide。運作guide時,由于我的電腦不能識别出SD卡,是以我隻能直接通過MATLAB腳本下載下傳系統到SD卡。

軟體包:

軟體無線電zedboard+fmcomms2實作GPS信号模拟和接收一、硬體及配置二、代碼編譯和運作三、信号接收四、信号生成代碼的關鍵修改(坑)五、後續

設定時使用的代碼段,通過學習硬體支援包中的函數來運作的:

dev = sdrdev('AD936x');
downloadImage(dev,'BoardName','ZedBoard and FMCOMMS2/3/4','SDCardLocation','H:')
           

二、代碼編譯和運作

開源的支援軟體無線電的GPS信号模拟軟體應該有不少,我使用的是下面這個代碼:

https://github.com/Mictronics/pluto-gps-sim

這個工程是在 gps-sdr-sim工程的基礎上開發的,挺好用的,我修改了一些配置和參數直接就可以運作。

運作指令:-e brdc1520.20n -c 3967283.15,1022538.18,4872414.48 -U "ip: 192.168.3.2" -A -70.0  -T  "now" 

星曆檔案brdc1520.20n是在http://mgex.igs.org/IGS_MGEX_Data.php網頁history裡面的bkg或ign都可以下載下傳。網絡配置和上一篇部落格一緻。

至于工程編譯的一些問題這裡就不較長的描述了,大家應該可以解決。我自己寫了一個Cmakelists檔案建構了用QTcreator建構了可編譯的工程,調試運作比較友善,因為涉及多線程有些地方不能加斷點調試,還需要學習一下相關的調試方法。

三、信号接收

信号接收用的是MATLAB支援包中的zynqRadioToneReceiverAD9361AD9364ML.m代碼。做了較大的修改,首先是參數設定:

RadioBasebandRate = 10e6;
CenterFrequency = 1.5754e9;
ToneFrequency = 20e3;
           

其次,由于硬體端的發射通道已經在使用中,是以注釋掉

%sdrTransmitter();
           

當然我加了一些代碼,包括使用filterdesign工具設計了濾波器。

designCustomFilter(sdrReceiver);
filtnv = { ...
'BasebandSampleRate',sdrReceiver.BasebandSampleRate, ...
'filtPathRates',sdrReceiver.filtPathRates, ...
'filtCoefficients',sdrReceiver.filtCoefficients, ...
'filtCoefficientSize',sdrReceiver.filtCoefficientSize, ...
'filtDecimInterpFactor',sdrReceiver.filtDecimInterpFactor, ...
'filtGain',sdrReceiver.filtGain, ...
'filtRFBandwidth',sdrReceiver.filtRFBandwidth, ...
'filterConfigStruct',sdrReceiver.filterConfigStruct ...
}
save 'mycustomfilter' 'filtnv'
load mycustomfilter
sdrReceiver.UseCustomFilter = true;
           

最終顯示的結果如下圖

軟體無線電zedboard+fmcomms2實作GPS信号模拟和接收一、硬體及配置二、代碼編譯和運作三、信号接收四、信号生成代碼的關鍵修改(坑)五、後續

能夠很清晰的看到僞碼調制。

四、信号生成代碼的關鍵修改(坑)

開始使用MATLAB收信号時怎麼設定參數都不行,後來檢查了信号仿真代碼,發現信号生成代碼裡對硬體設定有bug:

iio_channel_attr_write_bool(
        iio_device_find_channel(phydev, "altvoltage0", true)
        , "powerdown", false); // Turn OFF RX LO  //orignal is true
           

關閉了RX LO!修改為上述再編譯就好了。

另外你想看到清晰的時域波形,就隻能發送一顆衛星的信号,是以設定參數最多發一個就行了。

五、後續

在用gnss-sdr(https://github.com/gnss-sdr/gnss-sdr)接收的時候遇到點問題,首先是最新版本的編譯通過了,但運作時總是報記憶體洩露,調了半天,因為不熟悉ProtoBuf 就放棄了。使用了2018年下載下傳的版本進行編譯通過了,但運作時報錯_Signal_Source: Undefined implementation for block,發現編譯時設定-ENABLE_FMCOMMS2=ON居然沒用,隻能在Cmakelists檔案裡 set(ENABLE_FMCOMMS2 ON)。運作參數檔案為 -config_file "/home/wangjie/gnss/gnss-sdr/conf/gnss-sdr_GPS_L1_fmcomms2_realtime.conf"。運作比較順利,隻不過在室内捕獲到信号跟蹤不上。

在使用這個軟體接收機接收生成的代碼居然也不行,還在找原因。

繼續閱讀