GPS信号撷取

## 简介

GPS信号撷取的目的在于获知所得到的卫星为何，若是有某颗卫星资讯是可得知的，则必须取得此信号的两个性质：

- 频率

从规格可以得知L1的频率为1575.42 Mhz，L2的频率为1227.60 MHz，之后的讨论皆以L1做讨论，L1的信号经过一连串的处理之后，频段IF=9.548 MHz，从特定卫星得到的频率并不一定是如规格所给予，而是因为有相对运动的关系，在频率上产生多普勒效应，因为卫星的移动，假设GPS接收机静止接收GPS信号，多普勒效应所影响的范围大约为5 kHz，如果GPS接收机也处于高速移动的状态下，多普勒效应所影响的频率可能会到达10 kHz。

- 码相位

码相位代表C/A 码开始的正确资料区块

目前来说，做GPS信号撷取的方法都是根据GPS信号的特质来做处理，卫星信号是由32个不同的伪随机噪声（Pseudorandom Noise,PRN）序列区隔，而上述所说的特质就是指这些伪随机噪声序列的彼此之间的几乎没有互相关，只有自己本身和自己只有在没有延迟的情况下，自相关函数才会有极值。假设接收到的信号$\mathit{s}$是由$\mathit{n}$个可得知的卫星信号组合而成。

```
     <math>s(t)=s^1(t)+s^2(t)+...+s^n(t)</math>
```

会运用接收机本身的伪随机噪声序列产生器产生$k$卫星的伪随机噪声序列，再透过改变码相位和振荡器所产生的载波频率不同，来与接收到的信号做处理比对，而这几种方法分别为：

- 直接搜寻（Serial Search）
- 平行频率空间搜寻（Parrallel Frequency Space Search）
- 平行码相位搜寻（Parrallel Code Phase Search）

## 直接搜寻(Serial Search)

<image>

右图1即为直接搜寻算法的流程图，从图1可以看到由接收机先产生特定卫星的伪随机噪声序列和本身的振荡器产生载波信号，所产生的码相位范围是从0~1022，输入的信号在与伪随机噪声（PRN）序列相乘后，再跟载波信号相乘，此处的载波信号分为两个，一个是振荡器所产生的载波信号，另一个则是产生的载波信号加上一个$90^o$的相位差。

接下来将所得到的信号I、Q对时间1毫秒做积分，最后再平方相加得到信号的能量，若所得到的能量超过所设定的标准，则频率和码相位参数就是正确的，接着就会把这些参数传递到GPS信号追踪（GPS Signal Tracking）的算法。

从流程图可以发现，直接搜寻算法改变的有两个方面，一个是频率方面，选择所有可能的载波频率，范围是在IF±10 kHz，每一区隔为500 Hz，另一个就是码相位方面，选择所有可能的1023个码相位，因此，有种类似在二维空间中找寻一点的概念，总共需要的次数为：

$(2*({10000 \over 500})+1)*1023=41*1023=41943$

很明显的，这是一个极大的数字，这么大的一个数字就是直接搜寻算法的弱点，而此算法的优点在于可以很直接的实现，通常是应用在硬件的GPS上。

## 平行频率空间搜寻(Parallel Frequency Space Search)

<image>

直接搜寻的算法的缺点在于花费时间往两方面去搜寻所有可能的值，要是有一方面的因素可以消除，又或者是可以平行的进行搜寻，则算法程序的效能会大大的提升。从平行频率空间搜寻算法的名称，可以大概猜测到此算法应当就是省略去频率空间的搜寻，图2即为此算法的方块图。

如图2所示，输入信号首先和接收机本身所产生的特定卫星的伪随机噪声序列相乘，码相位分别为0~1022总共1023种，所得到的信号再利用傅立叶变换从时域转换到频域，这里的傅立叶变换可用离散傅立叶变换或是快速傅立叶变换，当输入信号与接收机本身所产生的信号完美的相关之时（意即同样的伪随机噪声序列而且没有延迟。），傅立叶变换后得到的极值落点的频率，代表的就是载波信号的频率。

所得到频率的精确度决定于离散傅立叶变换的长度，长度代表了在分析资料里的取样数，要是1毫秒的资料被分析，则取样数与取样频率的关系为1比1000，也就是说，当取样频率$\mathit{f_s}=10 MHz$，则取样数$\mathit{N}=10,000$。

在离散傅立叶变换的长度为10000，前 N/2 个输出取样代表了从 0 到 $\frac{f_s}{N}$Hz，意即输出频率的分辨率为：

$$\Delta f=\frac{f_s/2}{N/2}=\frac{f_s}{N}$$

因为$\mathit{f_s}=10 MHz$，所以频率的分辨率就是

$$\Delta f=\frac{10Mhz}{10000}$$

与直接搜寻算法比较，直接搜寻算法搜寻码相位和频率两方面的所有可能，平行频率空间搜寻算法只从1023个不同的码相位着手，理论上来说是会比直接搜寻算法来的快，但是因为在平行频率空间算法中需要用到傅立叶变换，所以乘法器和加法器运用会较多，因此在硬件上还是以直接搜寻算法应用较多。

## 平行码相位搜寻(Parallel Code Phase Search)

<image>

从直接搜寻算法的式子内可以发现，占比较大部分的反而是1023次的码相位搜寻，平行频率搜寻算法省去了41种频率的搜寻，而要是省略的是1023种码相位的搜寻，可想而知的是一定会更加有效率，最近的GPS接收机就开始使用了上述所提的概念，叫做平行码相位搜寻算法。

信号撷取的目标就是要将输入信号和接收机本身产生的伪随机噪声序列做相关运算，于是我们用圆形相关运算（circular correlation）取代了原本的1023种码相位的搜寻。有限长度$N$序列$x(n)$与$y(n)$的离散傅立叶变换如下：

$$X(k)=\sum_{n=0}^{N-1} x(n) e^{-j2\pi kn/N}$$

$$Y(k)=\sum_{n=0}^{N-1} y(n) e^{-j2\pi kn/N}$$

这两个信号的圆形相关运算序列$z(n)$为：

$$z(n)= \frac{1}{N}\sum_{m=0}^{N-1} x(m)y(m+n) = \frac{1}{N}\sum_{m=0}^{N-1} x(-m)y(m-n)$$

在底下式子省略了$\frac{1}{N}$，$z(n)$的$N$点傅立叶变换可以表示为：

$$Z(k)=\sum_{n=0}^{N-1} \sum_{m=0}^{N-1} x(-m)y(m-n) e^{-j2\pi kn/N}=\sum_{m=0}^{N-1} x(m) e^{j2\pi km/N} \sum_{N=0}^{N-1} Y(m+n) e^{-j2\pi k(m+n)/N}=X^{*}(k)Y(k)$$

$X^{*}(k)$是指$X(k)$的共轭复数（Complex Conjugate），整个算法的流程如右图3所示，输入信号先与接收机本身震荡器产生的载波频率相乘，得到了$I$ 信号和与其相位差$90^o$的信号$Q$ 这两个信号组成了复数的信号

$$x(n)=I(n)+jQ(n)$$

接着再做离散傅立叶变换，而接收机本身所产生的伪随机噪声序列去做傅立叶变换后得到的信号取共轭，这两个信号做相乘，再做反傅立叶变换，得到的信号是在时域的，而再取绝对值平方项，若有极值，极值所在的点即为码相位。跟之前算法做比较，此算法只搜寻了41种频率，效率更是大大的提升，但是由于要做傅立叶变换和反傅立叶变换，在硬件实现上亦有困难处所在。

## 参考文献

Kai Borre, Dennis M. Akos, Nicolaj Bertelsen, Peter Rinder, Soren Holdt Jensen。《A Software-Defined GPS and Galileo Receiver: A Single-Frequency Approach》M。Birkhäuser Boston，2006年。