1 GPS 信号格式

L2 频点上调制的 BPSK 信号的基带数据有三种,目前 L2 信号一般选择 P (Y) 码和导航电文的模二加。GPS 卫星上的 10.23MHz 时钟驱动 P 码发生器,P 码码片宽度约 0.1μs0.1\mu s0.1μs,C/A 码的码片宽度约 1μs1\mu s1μs。由 P 码调制的导航信号提供高精度定位服务(PPS),C/A 码调制的导航信号提供标准定位服务(SPS)。
P 码发生器首先在 10.23 MHz时钟驱动下产生 P 码,P 码周期很长(约为 101410^{14}1014 个码片),每 7 天重复一次,美国政府通过"反欺骗"(AS)政策将 P 码加密,这种加密的主要目的是保护授权用户不受虚假的 GPS 信号影响,同时限制非授权用户使用 PPS 服务。加密过程通过一种特殊的 Y 码完成,Y 码码片速率和 P 码一样,用户必须使用密钥才能使用 Y 码信号,一般把这种加密后的信号叫作 P (Y) 码信号。
由于 P 码周期很长,直接捕获困难,C/A 码周期短,因此一般先进行 C/A 码的捕获,得到其码相位和发射时间等初步信息后,再进行 P 码的捕获。目前较新的 L1M 和 L2M 信号无需 C/A 码的介入就能直接捕获 P 码。
对于 P 码来说,一个码片内有 154 个 L1 载波周期,120 个 L2 载波周期。对于 C/A 码来说,一个码片内有 1540 个 L1 载波周期,1200 个 L2 载波周期。
L1、L2 的导航电文速率均为 50bps,每个比特宽度为 20ms,每个导航电文比特内包含 20460 个 C/A 码片或 204600 个 P 码片。受严格的星载时钟保证,导航电文比特跳变和伪码码片的跳变时刻严格同步。更进一步,由于 GPS 控制段对所有 GPS卫星星载时钟的监控和修正,可以认为所有 GPS 卫星产生的各自导航电文跳变时钟和各自伪码发生器的时钟也是同步的,而这也是 GPS 系统实现定位的一个基本前提。
GPS 导航信号包含载波、伪码和导航电文,数学表达式如下:
sL1(t)=2PCD(t)c(t)cos[ωL1t+θL1]+2PY1D(t)y(t)sin[ωL1t+θL1] s_{L1}(t)=\sqrt{2 P_C}D(t)c(t)\cos [\omega_{L1}t+\theta_{L1}]+\sqrt{2 P_{Y1}}D(t)y(t)\sin [\omega_{L1}t+\theta_{L1}] sL1(t)=2PC D(t)c(t)cos[ωL1t+θL1]+2PY1 D(t)y(t)sin[ωL1t+θL1]
sL2(t)=2PY2D(t)y(t)cos[ωL2t+θL2] s_{L2}(t)=\sqrt{2 P_{Y2}}D(t)y(t)\cos [\omega_{L2}t+\theta_{L2}] sL2(t)=2PY2 D(t)y(t)cos[ωL2t+θL2]
其中 D(t)D(t)D(t) 表示导航电文数据比特,c(t)和y(t)c(t)和y(t)c(t)和y(t) 分别表示 C/A 码和 P (Y) 码,P 不同下标表示不同信号的功率。
导航电文与伪随机码相乘后,信号带宽从 100Hz 扩展至 2MHz 左右(C/A),20MHz 左右(P),频谱图如下:

GPS 信号采用扩频通信的目的有以下几点:
- 伪随机码是不同卫星的标识,码分多址
- 扩展频带可让接收信号的信噪比不需要很高,C=Blg(1+SN)C=B \lg\left( 1+\frac{S}{N} \right)C=Blg(1+NS),B 展宽后,信噪比就可以很小,接收信号的功率可以很低,甚至可以低于噪声功率。
- 在 GPS 接收端,伪随机码的码片相位为定位提供了必要的测距信号。码片相位直接和卫星信号传输的距离有关,接收机通过检测相关峰的位置得到伪码相位,进而得到伪距观测量,实现定位。
1.1 GPS 电文
导航电文分为 5 个不同层次,最基本的结构是长度为 20ms 的数据位(bit),第二级的结构是字(word),由 30 个数据位组成 1 个字;第三级的结构是子帧(Subframe),由 10 个字组成一个子帧,一个子帧包含 300 个数据位;第四级的结构是主帧/页面(page),由 5 个子帧构成一个主帧,1 个主帧包含 1500 个数据位;第五级的结构由 25 个主帧/页面组成一个整周期的导航电文。

GPS 导航电文每隔 12.5min 发送一套完整的导航电文结构,包含了 25 主帧、125 子帧、3750 字、75000bit。

2 GPS 接收原理
2.1 GPS 卫星信号捕获
2.1.1 基础
GPS 卫星是中轨道卫星,近似将其运行轨道看作圆形,平均角速度为 ω≈1.4585×10−4rad/s\omega \approx 1.4585\times 10^{-4} rad / sω≈1.4585×10−4rad/s,平均速度为 Vs≈3.87km/sV_s \approx 3.87 km / sVs≈3.87km/s。

根据计算,当 AP 和 OA 成直角时,VdV_dVd 可以取到最大值:
VdM=VsReRs≈3870×637826560≈929.3m/s V_{dM}=\frac{V_s R_e}{R_s}\approx \frac{3870 \times 6378}{26560}\approx929.3m /s VdM=RsVsRe≈265603870×6378≈929.3m/s
此时的最大多普勒频移为:
fdM=VdMfL1c≈929.3×1575.42×1063×108≈4880.3Hz f_{dM}=V_{dM} \frac{f_{L1}}{c}\approx \frac{929.3\times 1575.42\times 10^6}{3\times 10^8}\approx4880.3Hz fdM=VdMcfL1≈3×108929.3×1575.42×106≈4880.3Hz
晶振的偏差导致的频移,理论计算表明,1ppm 晶振偏差在 L1 载频上能引起 1.57kHz1.57kHz1.57kHz 的载频偏差。
综合考虑,可以认为 GPS 接收机接收到的信号不仅在伪码相位上存在模糊现象,并且在载频上也会具有一些模糊度。所以 GPS 信号捕获可以认为是一个三维的搜索:
- PRN 码
- 伪码相位
- 多普勒频移
2.1.2 基于时域相关器的信号捕获

下面使用数学公式说明信号捕获的处理过程。
输入信号为 RF 中频采样,数学表达式如下:
sIF(t)=2Ps⋅C(t−τ)⋅D(t−τ)cos[ωIFt+ϕ(t)]+n(t) s_{IF}(t)=\sqrt{2P_s}\cdot C(t-\tau)\cdot D(t-\tau) \cos [\omega_{IF}t+\phi(t)]+n(t) sIF(t)=2Ps ⋅C(t−τ)⋅D(t−τ)cos[ωIFt+ϕ(t)]+n(t)
其中,PsP_sPs 是信号功率,C(t)C(t)C(t) 是 C/A 码,取值范围是 ±1\pm 1±1,τ\tauτ 是传输过程中的时间延迟,D(t)D(t)D(t) 是导航电文比特,ωIF\omega_{IF}ωIF 是中频载波频率,其值由 RF 电路和多普勒频移决定,ϕ(t)\phi(t)ϕ(t) 是初始载波相位,n(t)n(t)n(t) 是白噪声。
接收机载波发生器输出两路信号,分别为:
Ica(t)=2cos[(ωIF+Δω^)t+ϕ0^] I_{ca}(t)=\sqrt{2}\cos [(\omega_{IF}+\Delta\hat{\omega})t+\hat{\phi_0}] Ica(t)=2 cos[(ωIF+Δω^)t+ϕ0^]
Qca(t)=2sin[(ωIF+Δω^)t+ϕ0^] Q_{ca}(t)=\sqrt{2}\sin [(\omega_{IF}+\Delta\hat{\omega})t+\hat{\phi_0}] Qca(t)=2 sin[(ωIF+Δω^)t+ϕ0^]
信号捕获的目的之一即为调节本地载波频率使得 Δω^\Delta \hat{\omega}Δω^ 尽可能的小。当捕获成功时,频率差已经很小,当开始稳定跟踪信号时,可认为该频率差接近 0。
本地载波的 I、Q 信号与输入信号相乘,可得:
I(t)=2Ps⋅C(t−τ)⋅D(t−τ)cos[ωIFt+ϕ(t)]×2cos[(ωIF+Δω^)t+ϕ0^] I(t)=\sqrt{2P_s}\cdot C(t-\tau)\cdot D(t-\tau) \cos [\omega_{IF}t+\phi(t)]\times \sqrt{2}\cos [(\omega_{IF}+\Delta\hat{\omega})t+\hat{\phi_0}] I(t)=2Ps ⋅C(t−τ)⋅D(t−τ)cos[ωIFt+ϕ(t)]×2 cos[(ωIF+Δω^)t+ϕ0^]
Q(t)=2Ps⋅C(t−τ)⋅D(t−τ)cos[ωIFt+ϕ(t)]×2sin[(ωIF+Δω^)t+ϕ0^] Q(t)=\sqrt{2P_s}\cdot C(t-\tau)\cdot D(t-\tau) \cos [\omega_{IF}t+\phi(t)]\times \sqrt{2}\sin [(\omega_{IF}+\Delta\hat{\omega})t+\hat{\phi_0}] Q(t)=2Ps ⋅C(t−τ)⋅D(t−τ)cos[ωIFt+ϕ(t)]×2 sin[(ωIF+Δω^)t+ϕ0^]
相乘后经过积分器,积分器可看作一个低通滤波,因此可忽略上式中的高频成分,获得以下结果:
I(t)=PsC(t−τ)D(t−τ)cos[ϕ(t)−Δω^t−ϕ^0] I(t) = \sqrt{P_{s}}C(t-\tau)D(t-\tau)\cos[\phi(t)-\Delta\hat{\omega}t-\hat{\phi}{0}] I(t)=Ps C(t−τ)D(t−τ)cos[ϕ(t)−Δω^t−ϕ^0]
Q(t)=PsC(t−τ)D(t−τ)sin[ϕ(t)−Δω^t−ϕ^0] Q(t) = \sqrt{P{s}}C(t-\tau)D(t-\tau)\sin[\phi(t)-\Delta\hat{\omega}t-\hat{\phi}_{0}] Q(t)=Ps C(t−τ)D(t−τ)sin[ϕ(t)−Δω^t−ϕ^0]
上面两式只表示乘法器输出的信号分量,噪声分量如下:
nI(t)=n(t)×2cos[ϕ^(t)] n_I(t)=n(t)\times\sqrt{2}\cos[\hat{\phi}(t)] nI(t)=n(t)×2 cos[ϕ^(t)]
nQ(t)=n(t)×2sin[ϕ^(t)] n_Q(t)=n(t)\times\sqrt{2}\sin[\hat{\phi}(t)] nQ(t)=n(t)×2 sin[ϕ^(t)]
与原噪声相比只是发生了相位的旋转,即白噪声与 ejϕ^(t)e^{j\hat{\phi}(t)}ejϕ^(t) 相乘在频域上相当于频谱的平移,对频谱形状和分布没有影响。
假设本地伪码发生器生成的本 6地伪码为 C(t−τ^)C(t-\hat{\tau})C(t−τ^),本地伪码与信号的伪码相位的偏差为 Δτ=τ−τ^\Delta \tau=\tau-\hat{\tau}Δτ=τ−τ^。
假设积分时间为 T1T_1T1,则两路积分器的输出分别为:

其中,δϕ0=ϕ^−ϕ(t)\delta \phi_0=\hat{\phi}-\phi(t)δϕ0=ϕ^−ϕ(t),T1T_1T1 是积分时间,一般为 C/A 码周期,且小于 20ms20ms20ms,所以 D(t)D(t)D(t) 可以提到积分号外。
在上面两个公式中,有两个变量 τ^、Δω^\hat{\tau}、\Delta \hat{\omega}τ^、Δω^,分别固定一个变量,分析另一个变量的变化对积分器的影响。
首先,假设本地载频与接收到的载频频率一致,则上面的式子可以写为:

其中,R(Δτ)R(\Delta \tau)R(Δτ) 是伪随机序列的自相关函数,当滑动本地伪码相位与输入信号的伪码相位一致时,积分器输出可达到最大值,当相位差大于 1 个 C/A 码片时,积分器输出结果类似噪声。
然后假设本地伪码和输入信号伪码相位差为 0,此时载频变化对积分器输出产生影响,即:

信号的功率为:
P‾=PsT12sinc2(Δω^T1/2) \overline{P}=P_s T^2_1 sinc^2(\Delta\hat{\omega}T_1/2) P=PsT12sinc2(Δω^T1/2)
不同的相干时间会影响功率谱的分布:


积分时间越长,则对载频误差越敏感,意味着同样的载频误差在长时间积分的情况下更容易丢失信号功率。所以积分时间越长,则载频搜索的步长越小,一般载频步长为积分时长的倒数。
2.1.3 基于 FFT 的信号捕获
基于 DFT 和信号卷积的关系:
s(t)⊗h(t)⇔S(f)⋅H(f)S(f)⊗H(f)⇔s(t)⋅h(t) \begin{align} s(t) \otimes h(t) & \Leftrightarrow S(f)\cdot H(f) \\\\ S(f)\otimes H(f) & \Leftrightarrow s(t)\cdot h(t) \end{align} s(t)⊗h(t)S(f)⊗H(f)⇔S(f)⋅H(f)⇔s(t)⋅h(t)
把 ADC 采集后的中频信号 s(t)s(t)s(t) 与本地 NCO 的同相分量与正交分量相乘的结果看作两个中间变量:
sI(t)=s(t)⋅2cos[(ωIF+Δω^)t]sQ(t)=s(t)⋅2sin[(ωIF+Δω^)t] \begin{align} s_I(t) & =s(t)\cdot \sqrt{2}\cos[(\omega_{IF}+\Delta\hat{\omega})t] \\\\ s_Q(t) & =s(t)\cdot \sqrt{2}\sin[(\omega_{IF}+\Delta\hat{\omega})t] \end{align} sI(t)sQ(t)=s(t)⋅2 cos[(ωIF+Δω^)t]=s(t)⋅2 sin[(ωIF+Δω^)t]
把本地伪码发射器的输出记作一个本地信号 sL(t)=C(t)s_L(t)=C(t)sL(t)=C(t),则 I 路和 Q 路的积分器输出的相关结果为:
I(τ)=∫0T1sI(t)⋅sL(t+τ)dtQ(τ)=∫0T1sQ(t)⋅sL(t+τ)dt \begin{align} I(\tau) & = \int^{T_1}{0}s_I(t)\cdot s_L(t+\tau)dt \\\\ Q(\tau) & = \int^{T_1}{0}s_Q(t)\cdot s_L(t+\tau)dt \end{align} I(τ)Q(τ)=∫0T1sI(t)⋅sL(t+τ)dt=∫0T1sQ(t)⋅sL(t+τ)dt
卷积表达式为:
z(t)=∫0T1x(τ)⋅y(t−τ)dτ z(t)=\int^{T_1}_{0}x(\tau)\cdot y(t-\tau)d\tau z(t)=∫0T1x(τ)⋅y(t−τ)dτ
与积分器的输出比较,发现 τ\tauτ 的符号相反,根据傅里叶变换的性质,可得积分器输出的傅里叶变换为:
DFTI=SL(f)⋅SI∗(f) DFT{I}=S_L(f)\cdot S^*_I(f) DFTI=SL(f)⋅SI∗(f)
对上式 1 进行傅里叶变换:
DFT{I}=∫0TI∫0TIsI(t)sL(t+τ)dt ⌋e−j2πfτdτ=∫0TIsI(t)⌊∫0TIsL(t+τ)e−j2πf(t+τ)dτ⌋ej2πftdt=SL(f)∫0TIsI(t)ej2πftdt=SL(f)SI∗(f) \begin{aligned} \text{DFT}\{I\} &= \int_{0}^{T_I} \int_{0}^{T_I} s_{\text{I}}(t)s_{\text{L}}(t + \tau)\text{d}t \;\rfloor e^{-\text{j}2\pi f \tau}\text{d}\tau \\\\ &= \int_{0}^{T_I} s_{\text{I}}(t) \left\lfloor \int_{0}^{T_I} s_{\text{L}}(t + \tau)e^{-\text{j}2\pi f (t+\tau)}\text{d}\tau \right\rfloor e^{\text{j}2\pi f t}\text{d}t \\\\ &= S_{\text{L}}(f)\int_{0}^{T_I} s_{\text{I}}(t)e^{\text{j}2\pi f t}\text{d}t \\\\ &= S_{\text{L}}(f)S_{\text{I}}^*(f) \end{aligned} DFT{I}=∫0TI∫0TIsI(t)sL(t+τ)dt⌋e−j2πfτdτ=∫0TIsI(t)⌊∫0TIsL(t+τ)e−j2πf(t+τ)dτ⌋ej2πftdt=SL(f)∫0TIsI(t)ej2πftdt=SL(f)SI∗(f)
同理可得 Q 路的傅里叶变换为:
DFTQ=SL(F)⋅SQ∗(f) DFT{Q}=S_L(F)\cdot S_Q^*(f) DFTQ=SL(F)⋅SQ∗(f)
因此积分器的输出可以重写为:
I(τ)=IDFT[DFT(sL)⋅DFT∗(sI)]Q(τ)=IDFT[DFT(sL)⋅DFT∗(sQ)] \begin{align} I(\tau) & = IDFT[DFT(s_L)\cdot DFT^*(s_I)] \\ Q(\tau) & = IDFT[DFT(s_L)\cdot DFT^*(s_Q)] \end{align} I(τ)Q(τ)=IDFT[DFT(sL)⋅DFT∗(sI)]=IDFT[DFT(sL)⋅DFT∗(sQ)]
由上可得,FFT 实现信号捕获的流程如下:
- 将输入中频信号和本地载波发生器输出的同相和正交信号相乘,获取基带复信号
- 对第一步获取到的复信号做 FFT 处理
- 对本地伪码发生器输出的伪码信号做 FFT 并取共轭
- 将第二步与第三步的结果相乘并做 IFFT 处理
- 对第四步的结果取模,门限判决,如果有足够强的尖峰出现,则说明实现了信号捕获,尖峰对应的位置对应于伪码相位,而此时本地载波的频率值就是信号所在的载波频率;如果没有足够强的尖峰出现,则重设本地载波发生器的频率为下一个频率井的值,重复第一到第四步
参与 FFT 运算的信号序列长度决定了结果的多普勒频移精度,信号长度为 T1T_1T1 ,则相关峰的频率分辨率为 1/T11/T_11/T1,因此搜索频率步进值要小于等于相关峰的频率分辨率。FFT 运算的信号长度相对于时域相关器的积分长度,信号长度越长,相关峰形状越尖锐,峰值越高,对频率误差越敏感。
2.2 跟踪
2.2.1 载波跟踪
普通 PLL 对 180°相移敏感,由于 GPS 信号中存在导航比特跳变,因此 GPS 接收机使用的 PLL 必须对 180°相移不敏感 0o。
下图为 costas 环,特点就是对 180°相位不敏感,但是可能会引起相位模糊。Costas 环的目标是将所有能量保留在 I 路,为此需要提供振荡器反馈。

假设 PRN 码的码相位精准对齐,则 I 路的相乘结果为:
Dk( n )cosωIFncos( ωIFn + φ) = 12Dk( n ) cosφ + 12Dk ( n )cos( 2ωIFn + φ) D^{k}(\:n\:)\cos\boldsymbol{\omega}{\mathrm{IF}}n\cos(\:\omega{\mathrm{IF}}n\:+\:\varphi)\:=\:\frac{1}{2}D^{k}(\:n\:)\:\mathrm{cos}\boldsymbol{\varphi}\:+\:\frac{1}{2}D^{k}\:(\:n\:)\cos(\:2\omega_{\mathrm{IF}}n\:+\:\varphi) Dk(n)cosωIFncos(ωIFn+φ)=21Dk(n)cosφ+21Dk(n)cos(2ωIFn+φ)
其中,φ\varphiφ 为输入信号与本地载波的相位差。
Q 路的相乘结果为:
Dk(n)cosωIFnsin(ωIFn+φ) =12Dk(n) sinφ+12Dk(n)sin(2ωIFn+φ) D^k(n)\cos\omega_\text{IF}n\sin(\omega_\text{IF}n+\varphi)\:=\frac{1}{2}D^k(n)\:\mathrm{sin}\varphi+\frac{1}{2}D^k(n)\sin(2\omega_\text{IF}n+\varphi) Dk(n)cosωIFnsin(ωIFn+φ)=21Dk(n)sinφ+21Dk(n)sin(2ωIFn+φ)
其中低通滤波器为一个积分器,公式为:
I(t)=∫t−TItϵI(τ)dτQ(t)=∫t−TItϵI(τ)dτ \begin{align} I(t) & = \int^{t}{t-T_I} \epsilon_I(\tau) d \tau \\ Q(t) & = \int^{t}{t-T_I} \epsilon_I(\tau) d \tau \end{align} I(t)Q(t)=∫t−TItϵI(τ)dτ=∫t−TItϵI(τ)dτ
积分后乘法器输出轴的高频项趋近于 0,只保留差频项。
将信号进行低通滤波后,两倍频信号会被滤除,信号为:
Ik=12Dk(n)cosφQk=12Dk(n)sinφ \begin{align} I^k & =\frac{1}{2}D^k(n)\cos \varphi \\\\ Q^k & =\frac{1}{2}D^k(n)\sin \varphi \end{align} IkQk=21Dk(n)cosφ=21Dk(n)sinφ
本地载波的相位误差为:
QkIk=sinφcosφ=tanφφ=arctanQkIk \begin{align} \frac{Q^k}{I^k} & =\frac{\sin \varphi}{\cos \varphi}=\tan \varphi \\ \varphi & = \arctan \frac{Q^k}{I^k} \end{align} IkQkφ=cosφsinφ=tanφ=arctanIkQk
costas 环的鉴相器有多种,常用的为
| 鉴相器类型 | 输出的相位差 | 性质 |
|---|---|---|
| Q(t) × I(t) | sin[2φ(t)] | 经典 Costas 环鉴相器,在低信噪比情况下有近似优化的鉴相特性,鉴相斜率受信号幅度影响较大 |
| Q(t) × sign[I(t)] | sin φ(t) | 在高信噪比情况下有近似最优的鉴相特性,鉴相受信号幅度影响较大,运算量较小 |
| Q(t) / I(t) | tan φ(t) | 在高信噪比和低信噪比情况下都有接近最优的鉴相特性,鉴相斜率不受信号幅度影响,在相差为 ±90° 时会发散 |
| atan[Q(t) / I(t)] | φ(t) | 两象限的反正切函数,在高信噪比和低信噪比情况下都有最优的鉴相特性,鉴相斜率不受信号幅度影响 |
| 不同鉴相器的相位差输出对比如下: | ||
![]() |
||
| 其中 atan 的线性度最好,但是计算量最大;sign 的线性度次之,但计算量较小;Q/I 和 atan 可能会出现除 0 的问题,但是无需归一化,I×Q 和 sign 运算量小,但需做归一化处理,否则随着信号幅度的变化导致输出的相位差信号发生较大幅度的变化。 | ||
| 2.2.1.1 环路滤波器 | ||
| 对于一个标准的二阶锁相环,其环路滤波器 F(s)F(s)F(s) 的传递函数通常为: | ||
| $$ | ||
| F(s)=\frac{\tau_2 s+1}{\tau_1 s}=\frac{\tau_2}{\tau_1}+\frac{1}{\tau_1 s} | ||
| $$ | ||
| 公式前半部分为比例项 (Proportional),后半部分为积分项 (Integral), 其中的 τ1\tau_1τ1 和 τ2\tau_2τ2 由环路自然频率和阻尼系数决定。 | ||
| 离散化 | ||
| 在数字通信过程中,需要将连续方程离散化,假设积分时间为 TTT。 | ||
| 比例项的离散化: | ||
| 直接相乘 | ||
| $$ | ||
| P[n]=\frac{\tau_2}{\tau_1}\cdot e[n] | ||
| $$ | ||
| 其中的 e[n]e[n]e[n] 为鉴相器的输出。 | ||
| 积分项的离散化: | ||
| 积分 1s\frac{1}{s}s1 在离散域可近似等价为累加。 | ||
| $$ | ||
| I[n]=I[n-1]+\frac{T}{\tau_1}\cdot e[n] | ||
| $$ | ||
| 环路滤波器输出: | ||
| $$ | ||
| y[n]=P[n]+I[n]=\frac{\tau_2}{\tau_1}\cdot e[n]+(I[n-1]+\frac{T}{\tau_1}\cdot e[n]) | ||
| $$ | ||
| 代码实现: | ||
| 在 Soft-Gnss matlab 代码 tracking.m 中,使用增量更新的方式计算 y[n]y[n]y[n]。 | ||
| $$ | ||
| \begin{align} | ||
| y[n]-y[n-1] & =(P[n]+I[n])-(P[n-1]+I[n-1]) \ | ||
| & =\left(\frac{\tau_2}{\tau_1}e[n]+I[n]\right)-\left(\frac{\tau_2}{\tau_1}e[n-1]+I[n-1]\right) \ | ||
| & = \frac{\tau_2}{\tau_1}(e[n]-e[n-1])+(I[n]-I[n-1]) \ | ||
| & = \frac{\tau_2}{\tau_1}(e[n]-e[n-1])+\frac{T}{\tau_1}\cdot e[n] | ||
| \end{align} | ||
| $$ | ||
| 移项后可得 | ||
| $$ | ||
| \begin{align} | ||
| y[n]=y[n-1]+\frac{\tau_2}{\tau_1}(e[n]-e[n-1])+\frac{T}{\tau_1}\cdot e[n] | ||
| \end{align} | ||
| $$ | ||
| 数学公式与代码对应关系如下: |
- y[n]y[n]y[n] =>
carrNco,当前的 NCO 频率调整量 - y[n−1]y[n-1]y[n−1] =>
oldCarrNco,上一刻的 NCO 调整量 - e[n]e[n]e[n] =>
carrError,当前相位误差 - e[n−1]e[n-1]e[n−1] =>
oldCarrError,上一刻的相位误差 - TTT =>
PDIcarr
比例项的变化量 :对相位的快速变化做出反应,帮助环路快速锁定相位。
积分项的增量:将相位误差累加到频率上,如果存在恒定的多普勒频移,相位误差会产生一个非零的平均值,调整 NCO 频率。
2.2.2 码跟踪
码跟踪环的目标是保持对信号中特定码相位的跟踪,其输出是对信号中码的精确复制。
GPS 接收机中的码跟踪环被称为超前-滞后跟踪环(DLL,延迟锁定环)。思想是将输入信号与三个本地码进行相关,如图所示。

- 输入信号与严格对齐的本地载波相乘,将 C/A 码转到基带信号
- 与三路本地 PRN 码相乘,通常三路本地码的间距为 ±12\pm \frac{1}{2}±21 个码片
- 经过第二次相乘后对三路输出进行积分累加,输出的积分值代表本地码与输入码的相关程度
当本地载波存在相位误差时,DLL 环难以锁定码相位,因此接收机中一般采用改进 DLL 环。

如果本地载波相位与输入信号相位一致的话,能量会集中在同相支路。如果相位有偏差,则信号能量会在同相与正交支路之间来换切换。

如果锁定的话,DLL 输出如下。

如果码相位需要调整,则需要鉴别器输出反馈至 PRN 码发生器,常见的用于反馈的 DLL 鉴别器为:

2.2.3 锁相环带宽的影响 (The Trade-off)
2.2.3.1 A. PLL (载波环) 带宽的影响
PLL 负责锁定载波相位,它的带宽设置最为敏感。
| 带宽设置 | 优点 (Pros) | 缺点 (Cons) | 典型场景 |
|---|---|---|---|
| 窄带宽 (e.g., 5-10 Hz) | 抗噪极强。在弱信号(如 SNR=2)下也能保持锁定;相位测量非常平滑。 | 动态差。如果接收机晃动或卫星运动产生大的多普勒变化率,环路跟不上,会直接失锁。 | 静态测量、高精度定位、弱信号环境。 |
| 宽带宽 (e.g., 25-50 Hz) | 动态好。能跟踪快速运动的物体(如车载、无人机);能容忍晶振的震动。 | 引入噪声。噪声会导致相位抖动(Phase Jitter),严重时发生周跳(Cycle Slip)。 | 高动态接收机、初始捕获阶段。 |
- 影响总结 :PLL 带宽主要影响是否失锁 。你的案例中,噪声为 2 时失锁,就是因为带宽 (25Hz) 包含了太多噪声,导致相位抖动超过了 PLL 的线性范围(±90∘\pm 90^\circ±90∘)。
2.2.3.1 B. DLL (码环) 带宽的影响
DLL 负责对齐 C/A 码,它的带宽通常可以设得很低。
| 带宽设置 | 优点 (Pros) | 缺点 (Cons) | 典型场景 |
|---|---|---|---|
| 窄带宽 (e.g., 0.05-1 Hz) | 精度高。伪距测量值的方差极小,定位结果更稳。 | 收敛慢。初始化时需要较长时间才能完全对齐码相位。 | 正常跟踪阶段 (配合 PLL 辅助)。 |
| 宽带宽 (e.g., 2-5 Hz) | 响应快。能快速修正码相位误差。 | 测量噪声大。定位结果会乱跳。 | 刚刚从捕获转入跟踪时。 |
- 影响总结 :DLL 带宽主要影响定位精度。因为有 PLL 辅助(Carrier Aiding),DLL 基本感受不到动态压力,所以通常设得非常窄(< 1Hz)来获得极致的精度。
2.2.4 计算方法 (The Math)
在数字接收机中,我们通常先在连续域(S域)设计滤波器,然后映射到离散域。你的代码使用的是标准的 二阶环路滤波器 (2nd Order Loop Filter)。
2.2.4.1 核心公式
我们要从 带宽 (BLB_LBL) 推导出代码中的 时间常数 (τ1,τ2\tau_1, \tau_2τ1,τ2)。
第一步:确定阻尼系数 (ζ\zetaζ)
通常选择 ζ=0.707\zeta = 0.707ζ=0.707 (1/21/\sqrt{2}1/2 )。这是控制理论中的"最佳阻尼点",在响应速度和过冲之间取得平衡。
第二步:计算自然频率 (ωn\omega_nωn)
噪声带宽 BLB_LBL 与自然频率 ωn\omega_nωn 的关系(对于二阶环):
BL=ωn(1+4ζ2)8ζB_L = \frac{\omega_n (1 + 4\zeta^2)}{8\zeta}BL=8ζωn(1+4ζ2)
反推 ωn\omega_nωn:
ωn=8ζBL4ζ2+1\omega_n = \frac{8 \zeta B_L}{4 \zeta^2 + 1}ωn=4ζ2+18ζBL
第三步:计算滤波器系数 (τ1,τ2\tau_1, \tau_2τ1,τ2)
这是基于传递函数 F(s)=1+τ2sτ1sF(s) = \frac{1 + \tau_2 s}{\tau_1 s}F(s)=τ1s1+τ2s 推导出来的:
τ1=1ωn2\tau_1 = \frac{1}{\omega_n^2}τ1=ωn21
τ2=2ζωn\tau_2 = \frac{2\zeta}{\omega_n}τ2=ωn2ζ
2.2.4.1 代码中的实现映射
# 1. 设定参数
zeta = 0.707
# 2. 计算自然频率 wn (这里公式就是上面的变形)
# wn = B_L * (8*zeta) / (4*zeta^2 + 1)
wn_pll = pll_bw * 8.0 * zeta / (4.0 * zeta**2 + 1.0)
# 3. 计算 Tau 参数
self.tau1_carr = 1.0 / (wn_pll**2)
self.tau2_carr = 2.0 * zeta / wn_pll
第四步:数字滤波器应用 (离散化)
在 general_work 中,这些参数被用来更新 NCO。这实际上是一个数字 PI 控制器:
NCOcmd=NCOold+P⋅(Error−OldError)+I⋅Error\text{NCO}{cmd} = \text{NCO}{old} + P \cdot (\text{Error} - \text{OldError}) + I \cdot \text{Error}NCOcmd=NCOold+P⋅(Error−OldError)+I⋅Error
对应代码:
Python
carr_nco = self.old_carr_nco + \
(self.tau2_carr / self.tau1_carr) * (carr_err - self.old_carr_error) + \
carr_err * (self.pdi_carr / self.tau1_carr)
其中:
- 比例增益 § ≈τ2/τ1=2ζωn\approx \tau_2 / \tau_1 = 2\zeta\omega_n≈τ2/τ1=2ζωn
- 积分增益 (I) ≈Tpdi/τ1=Tpdi⋅ωn2\approx T_{pdi} / \tau_1 = T_{pdi} \cdot \omega_n^2≈Tpdi/τ1=Tpdi⋅ωn2
2.2.5 如何选择合适的带宽?(经验值)
为了解决你遇到的"噪声为2时失锁"的问题,建议如下配置:
A. 初始阶段 (Pull-in / Acquisition Mode)
刚捕获到信号时,频率误差大(可能有几十Hz),需要宽带宽来"抓住"信号。
-
PLL BW: 25 Hz ~ 40 Hz -
DLL BW: 1.0 Hz ~ 2.0 Hz
B. 稳定跟踪阶段 (Steady State / Tracking Mode)
一旦误差减小进入稳定跟踪,为了抗噪,应收缩带宽。
-
PLL BW: 10 Hz ~ 15 Hz (针对你的问题,建议设为 10Hz) -
DLL BW: 0.05 Hz ~ 0.5 Hz
计算演示 (针对 PLL BW = 10Hz):
-
ζ=0.707\zeta = 0.707ζ=0.707
-
ωn=8×0.707×104×0.5+1=56.563≈18.85 rad/s\omega_n = \frac{8 \times 0.707 \times 10}{4 \times 0.5 + 1} = \frac{56.56}{3} \approx 18.85 \text{ rad/s}ωn=4×0.5+18×0.707×10=356.56≈18.85 rad/s
-
τ1=118.852≈0.0028\tau_1 = \frac{1}{18.85^2} \approx 0.0028τ1=18.8521≈0.0028
-
τ2=1.41418.85≈0.075\tau_2 = \frac{1.414}{18.85} \approx 0.075τ2=18.851.414≈0.075
将这些值代入你的代码,环路对噪声的过滤能力将大大增强。
2.2.6 BOC 调制
BOC 调制的核心原理是在传统的 BPSK 调制基础上,增加了一个方波副载波对扩频码进行二次调制。

2.2.6.1 表示方法
BOC 调制通常为 BOC (m, n)。
- m:表示副载波频率 fscf_{sc}fsc 与参考频率 f0f_0f0(通常为 1.023M)的比值,m=fsc/f0m=f_{sc}/f_0m=fsc/f0
- n:表示扩频码速率与参考频率的比值
2.2.6.1 数学推导
副载波表示为:
sc(t)=sign[sin(2πfsct)] sc(t)=sign[\sin(2\pi f_{sc}t)] sc(t)=sign[sin(2πfsct)]
方波展开为傅里叶级数为:
sc(t)=4π∑k=0∞12k+1sin[2π(2k+1)fsct] sc(t)=\frac{4}{\pi}\sum^{\infty}{k=0}\frac{1}{2k+1}\sin[2\pi(2k+1)f{sc}t] sc(t)=π4k=0∑∞2k+11sin[2π(2k+1)fsct]
进行傅里叶变换:
Ssc(f)=∑k=0∞(2(2k+1)π)2[δ(f−(2k+1)fsc)+δ(f+(2k+1)fsc)] S_{sc}(f)=\sum^{\infty}{k=0}(\frac{2}{(2k+1)\pi})^2[\delta(f-(2k+1)f{sc})+\delta(f+(2k+1)f_{sc})] Ssc(f)=k=0∑∞((2k+1)π2)2[δ(f−(2k+1)fsc)+δ(f+(2k+1)fsc)]
可以看出 BOC 副载波的频谱是一个一个谱线。
