這個實作使用了多種軟硬體平台,包括MATLAB、QTcreator等。發射通道是在Ubuntu虛拟機使用QTcreator編譯代碼控制的,接收通道在window下利用MATLAB實作的,整個下來花了兩天左右的時間才完成。
一、硬體及配置
硬體使用的是zedboard+fmcomms2,在硬體端運作的是官方支援MATLAB開發的SD卡系統,下載下傳和配置都使用MATLAB官方的軟體包設定guide。運作guide時,由于我的電腦不能識别出SD卡,是以我隻能直接通過MATLAB腳本下載下傳系統到SD卡。
軟體包:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1ATO4QzMxgDMzAjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
設定時使用的代碼段,通過學習硬體支援包中的函數來運作的:
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;
最終顯示的結果如下圖
能夠很清晰的看到僞碼調制。
四、信号生成代碼的關鍵修改(坑)
開始使用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"。運作比較順利,隻不過在室内捕獲到信号跟蹤不上。
在使用這個軟體接收機接收生成的代碼居然也不行,還在找原因。