虽然GPS重放/模拟没有获得完全成功,但一些小工具和脚本还是有用的。期间从这个“家庭自酿GPS接收机”学习了很多东西:http://www.aholme.co.uk/GPS/Main.htm

警告:请勿真正发射任何GPS信号,建议在暗室以及使用闭路电缆实验。请确保你的任何操作是合法的!后果自负!

工具、脚本以及GPS信号仓库在此:https://github.com/JiaoXianjun/GNSS-GPS-SDR

(关于一些基本的软件无线电概念,Linux操作,代码库git操作,以及软件包安装(apt-get)等,参见:这篇文章)

编译GPS接收机小工具 “gps_test” 的方法(在你把代码库拉下来之后,该小工具代码在c目录下):

cd c
make

为了make成功,你可能需要正确安装fftw库(比如用sudo apt-get install …),安装后库文件应当是/usr/lib/libfftw.a

一. 离线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.htm

正常情况下C程序检测到的C/A码和别人这个信号采集时的正确码信息是相同的:http://www.jks.com/gps/gps.html
初步验证GPS软件C接收机程序的正确性。

二. 开路/空中 GPS信号收发测试

1.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

1.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脚本中设置的相同。