这个实现使用了多种软硬件平台,包括MATLAB、QTcreator等。发射通道是在Ubuntu虚拟机使用QTcreator编译代码控制的,接收通道在window下利用MATLAB实现的,整个下来花了两天左右的时间才完成。
一、硬件及配置
硬件使用的是zedboard+fmcomms2,在硬件端运行的是官方支持MATLAB开发的SD卡系统,下载和配置都使用MATLAB官方的软件包设置guide。运行guide时,由于我的电脑不能识别出SD卡,因此我只能直接通过MATLAB脚本下载系统到SD卡。
软件包:
设置时使用的代码段,通过学习硬件支持包中的函数来运行的:
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"。运行比较顺利,只不过在室内捕获到信号跟踪不上。
在使用这个软件接收机接收生成的代码居然也不行,还在找原因。