虽然GPS重放/模拟没有获得完全成功,但其中一些小工具和脚本还是有用的。期间从这个“家庭自酿GPS接收机”学习了很多东西:http://www.aholme.co.uk/GPS/Main.htm
警告:请勿真正发射任何GPS信号,建议在暗室以及使用闭路电缆实验。请确保你的任何操作是合法的!后果自负!
工具、脚本以及GPS信号仓库在此:https://github.com/JiaoXianjun/GNSS-GPS-SDR
编译GPS接收机小工具 “gps_test” 的方法(在你把代码库拉下来之后,该小工具代码在c目录下):
cd c
make
为了make成功,你可能需要正确安装fftw库(比如用sudo apt-get install …),安装后库文件应当是/usr/lib/libfftw.a
1. 离线GPS C/A码 仿真
1.1 用”gps_test”接收Matlab脚本gps_sig_gen.m产生的GPS信号
a. 在Matlab中运行gps_sig_gen.m
gps_sig_gen
得到文件gps_sig_tmp.bin
b. 运行”gps_test”看能捕获到哪些C/A码:
gps_test gps_sig_tmp.bin 2.046e6 8.184e6 5000
基本算法是大范围的频域multi-bins相关搜索。
gps_sig_tmp.bin: 输入GPS信号文件,由前述gps_sig_gen.m产生
2.046e6: 载波频率(其实是中频频率)
8.184e6: 采样率
5000: 频域搜索时的最大频偏
正常情况下捕获到的C/A码和我们Matlab脚本中设置的是相同的。
1.2 用”gps_test”接收别人采集的真实的1bit量化GPS中频信号
gps_test gps.samples.1bit.I.fs5456.if4092.bin 4.092e6 5.456e6 5000
gps.samples.1bit.I.fs5456.if4092.bin: 别人采集的真实的1bit量化GPS中频信号: http://www.jks.com/gps/gps.html
正常情况下C程序检测到的C/A码和别人这个信号采集时的正确码信息是相同的:http://www.jks.com/gps/gps.html , 初步验证GPS软件C接收机程序的正确性。
2. 开路/空中 GPS信号收发测试
2.1 播放/发射别人采集的这个真实GPS信号gps.samples.1bit.I.fs5456.if4092.bin( http://www.jks.com/gps/gps.html )
a. Matlab中运行gps_bin1bit_log2bin.m把原来别人捕获的1bit量化文件转为HackRF需要的8bit量化文件 gps.samples.8bit.IQ.fs5456.baseband.bin
b. GNURadio中运行gps_Nottingham.grc 来发射我们转换得到的gps.samples.8bit.IQ.fs5456.baseband.bin. 同时/立刻(或稍提前),
c. 使用rtl-sdr电视棒来捕获我们发射的信号(不知道啥叫电视棒?看这里):
rtl_sdr -g 60 -f 1575.42e6 -s 2.8e6 -n 19.2e6 rtl_2.8Msps_1575.42MHz.bin
d. Matlab里运行proc_rtl_bin_for_gps(‘rtl_2.8Msps_1575.42MHz.bin’)来把电视棒采集的8bit文件转回我们的GPS测试程序gps_test所需的1bit文件:rtl_2.8Msps_1575.42MHz_1bit.bin
e. 运行我们的gps_test程序看能捕获到哪些C/A码:
gps_test rtl_2.8Msps_1575.42MHz_1bit.bin 0.62e6 2.8e6 100000
正常情况下这个程序给出的C/A捕获结果和别人采集时的正确C/A是相同的: http://www.jks.com/gps/gps.html
2.2 播放/发射我们自己用Matlab脚本generated by gps_sig_gen.m生成的 gps_sig_tmp_for_hackrf_tx.bin
a. GNURadio中运行gps.grc来把gps_sig_tmp_for_hackrf_tx.bin发射至空中. 同时/立刻(或稍提前),
b. 用rtl-sdr电视棒捕获信号:
rtl_sdr -g 60 -f 1574.8e6 -s 2.8e6 -n 19.2e6 rtl_2.8Msps_1574.8MHz.bin
c. 8bit量化文件转回1bit量化,这是我们gps_test程序所需要的:rtl_2.8Msps_1574.8MHz_1bit.bin
proc_rtl_bin_for_gps('rtl_2.8Msps_1574.8MHz.bin'); (MATLAB)
d. 运行:
gps_test rtl_2.8Msps_1574.8MHz_1bit.bin 0.62e6 2.8e6 100000
正常情况下你会看到程序捕获到的C/A码和我们在Matlab脚本中设置的相同。
e. 也可以用不同的载波频率才采集信号(即得到的GPS信号文件中频频率会改变)
rtl_sdr -g 60 -f 1575.42e6 -s 2.8e6 -n 19.2e6 rtl_2.8Msps_1575.42MHz.bin
f. 8bit量化文件转回1bit量化,这是我们gps_test程序所需要的:rtl_2.8Msps_1575.42MHz_1bit.bin
proc_rtl_bin_for_gps('rtl_2.8Msps_1575.42MHz.bin'); (MATLAB)
g. 运行:
gps_test rtl_2.8Msps_1575.42MHz_1bit.bin 0.62e6 2.8e6 100000
正常情况下你会看到程序捕获到的C/A码和我们在Matlab脚本中设置的相同。