从零开始研发GPS接收机连载——6、捕获模块设计与验证

本文详细介绍了从零开始研发GPS接收机的捕获模块设计与验证过程,包括数据位宽压缩、捕获算法选择(并行码相位FFT-IFFT和短时相关+FFT)、捕获参数设计以及FPGA实现。通过实验验证,成功捕获到多颗卫星信号,捕获时间在30ms内,证实了设计的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

从零开始研发GPS接收机连载——6、捕获模块设计与验证


前言

我们知道捕获一颗卫星而言是对码相位和多普勒频率的二维搜索。
多普勒频率是由卫星运动已经接收机运动共同叠加的结果。一般情况下的地面运动引起的多普勒都比较小,而卫星运动最大引发的多普勒为:()
总之,两者叠加的多普勒不会超过正负5KHz,一些要求高动态场景的多普勒一般也是在正负10KHz内

数据位宽

我们这里有12bit位宽IQ输入,但一般的GPS接收机是不需要这么多位宽的,我们将其压缩成2bit位宽就可以了,这样能够很大程度上节省资源。
在有限带宽的情况下,一位ADC的量化误差所引起的损耗为1.96dB,两位ADC的量化误差所引起的损耗为1.2dB,三位ADC的量化误差所引起损耗为0.6dB。

捕获算法选择

早期硬件资源不充足的时候使用串行捕获,时间比较久。后面FPGA资源越来越大的时候,比较经典的算法是并行码相位FFT-IFFT算法。我一般喜欢用这种方法在matlab上进行算法验证,最简单的就是使用这种方法,几行代码就实现了其功能。

并行码相位FFT-IFFT算法
优点:
1、 设计结构和流程都比较简单
(1) 中频信号搬到零频
(2) 然后做FFT = A
(3) 本地伪码做FFT = B
(4) C = IFFT(A*CONJ(B))
结果等效于所有码相位进行了相关运算,运算速度快。在一个频点一次性将所有码相位搜索完
2、 速度也比较快

缺点:
1、 大点数FFT模块比较消耗资源
2、 对于电文翻转的抵抗性差,例如如果运气不好,正好采集的中频数据中间存在着电文翻转,那么本次相关运算将会趋近于0。而且对于电文速率较高的情况(类似B1 GEO卫星这种2ms就一个电文)就会使得性能下降,

后面又有短时相关+FFT的算法
短时相关+FFT的算法
优点:
1、同时搜索码相位的同时也搜频
码相位直接采用相关器实现,搜频使用FFT算法
2、资源使用灵活

缺点:
1、设计和流程较复杂
同时N个相关器进行运算,其时序设计比较复杂
FFT搜频存在以下问题:
1、如果频率落在两个分辨的频点中间,峰值会有所下降
2、如果频偏离中心频点较远,则峰值会下降,
如下图所示:
在这里插入图片描述
这种问题可以通过补0来缓解,不过无法完全消除
在这里插入图片描述

捕获参数设计

1、码相位参数
我们参照半码片为一个码相位的方法,理论上是2046个码相位,实际设计我们将25M时钟的12个时钟周期作为一个码相位,那么实际上一共是2083个码相位

2、 短时相关+FFT参数
我们希望我们的搜频范围为正负10KHz的范围,那么每个点的时间间隔应该为50us,也就是说1ms数据分成了20段,我们希望我们捕获到的频率误差为200Hz以内,那么FFT两个点之间的频率分辨间隔为400Hz以内,那么FFT的分析时间要2.5ms以上,因此我们设置FFT点数为64个点,在20个数据点的基础上补足44个0,则FFT的分析时间为3.2ms,捕获的频率误差156Hz
总之
短时相关时间:50us
FFT点数:64

3、 捕获时间计算
因为在搜索码的过程中同时就完成了搜频运算,因此我们计算捕获时间只需要计算所有码相位的相关时间即可
相关累加时间:1ms
相关器数量:100个
将捕获核心算法时钟提升到采样率的7倍以上(还可以更高),那么等效的相关器就相当于700个。
非相干累加次数:10次
因此700个码相位完成一次捕获搜索需要时间为10ms。而2083个码相位只需要3个700次码相位搜索即可完成,也就是30ms。
一颗星的捕获时间:
一颗卫星最慢也只需要30ms即可完成捕获,最快10ms完成捕获
整个GPS系统捕获时间:
所有卫星捕获时间取平均数20ms,那么32个GPS卫星全部遍历一遍只需要600ms。加上FPGA其他模块的延时以及软件的一些开销时间,也就是说在1s内肯定能够完成整个GPS卫星的捕获。

FPGA实现的一些组成模块

在这里插入图片描述
1、 数据缓存
2、 100个相关器
3、 FFT模块
4、 FFT结果缓存以及非相干累加逻辑
5、 门限判决部分
6、 PL与PS部分的配置接口

上板测试

刚开始的时候,没有捕获到任何一颗卫星,这种情况下只能将数据采集下来进行进一步分析,
ILA的最长深度为130172个,差不多有5ms多的长度,足够用于捕获了。当然也可以使用ILA级联的方法采集更多的数据。

将采集的数据经过与verilog设计等效的matlab来进行分析,发现对输入信号的搬频方向反了。
注意,对于搬频方向搞反是常见的错误,改正过来后,明显的相关峰就出来了
在这里插入图片描述

串口打印的捕获结果如下,这里PS程序将所有的卫星都遍历了一遍

The cur_acq_ch,satid,phase,doppler,signal,noise is :0,1 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :1,2 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :2,3 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :3,4 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :4,5,7210,15,1769,580
The cur_acq_ch,satid,phase,doppler,signal,noise is :5,6 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :6,7 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :7,8 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :8,9 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :9,10 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :10,11 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :0,12 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :1,13,24094,0,1875,583
The cur_acq_ch,satid,phase,doppler,signal,noise is :2,14 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :3,15 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :5,16,23998,-4,3948,591
The cur_acq_ch,satid,phase,doppler,signal,noise is :6,17 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :7,18,11758,5,14730,597
The cur_acq_ch,satid,phase,doppler,signal,noise is :8,19 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :9,20 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :10,26,10966,3,7507,583
The cur_acq_ch,satid,phase,doppler,signal,noise is :0,21 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :2,22 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :3,23 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :6,24 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :8,25 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :9,31,15694,13,1422,588
The cur_acq_ch,satid,phase,doppler,signal,noise is :0,27,3610,-6,1812,576
The cur_acq_ch,satid,phase,doppler,signal,noise is :2,28 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :3,29,12754,9,9279,588
The cur_acq_ch,satid,phase,doppler,signal,noise is :6,30 failed
The cur_acq_ch,satid,phase,doppler,signal,noise is :2,32 failed


捕获到了5号星、13、16、18、26、31、27和29号星。和之前手机上观测的数据完全吻合,非常好。而且连信号强度也能够对应的上,打印中的signal值就是对应的信号强度
在这里插入图片描述

总结

做FPGA大型算法工程的时候有一套与之对应的matlab程序或者C模型程序是至关重要的,完成这项工作的难度不亚于在FPGA上的实现,但也是必须要做的,否则当开始调试的时候出来不了结果的话,则很难进行定位,反而会花费巨量的时间,以至于最后放弃。

捕获是FPGA最难的一部分,完成了这部分之后有种豁然开朗的感觉,不过后面跟踪能不能也实现就得继续进行下去才知道了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA十年老鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值