【信号】GPS扩频原理

news/2024/11/17 10:43:48/

本文主要介绍 GPS 是如何扩频与解扩的。

GPS 信号发送

简单来讲,GPS 数据的发送与接收分为以下几个步骤:

image-20220524171208992

如图所示,在发送时首先进行扩频,然后调制(通常是 BPSK)。接收时正好相反,先解调再解扩。

调制

在调制中主要使用了三种载波(L1、L2、L5)。

L1、L2、L5 的中心频率均为原子钟核心频率 f 0 = 10.23 MHz f_0=10.23\text{ MHz} f0=10.23 MHz 的整数倍。具体的,有

  • f 1 = 154 f 0 = 1575.42 MHz f_1=154f_0=1575.42\text{ MHz} f1=154f0=1575.42 MHz
  • f 2 = 120 f 0 = 1227.60 MHz f_2=120f_0=1227.60\text{ MHz} f2=120f0=1227.60 MHz
  • f 5 = 115 f 0 = 1176.45 MHz f_5=115f_0=1176.45\text{ MHz} f5=115f0=1176.45 MHz

这样做的好处在于更加容易生成载波信号。

扩频

GPS 主要使用了三种扩频码:P 码、C/A 码、M 码。其中,M 码为军用,缺少相关资料。

P 码(Precise code)频率为 10.23 Mbps,运行在 L1 和 L2 上。P 码总长度较长,共有 2 × 1 0 14 2\times 10^{14} 2×1014 bit,发送需要 37 周。每个卫星(1-32)和地面站(33-37)都被分配了其中的一部分,该部分周期为 7 天,对应的是星历更新的周期。

P 码采用的是相位调制,如图所示:

image-20220524172709793

加密过后的 P 码被称为 P(Y) 码。其区别是,P(Y) 码在第四个子帧中有一个标志告诉接收器扩频码已被加密,一次来防止欺骗。

C/A 码(Civilian Acquisition code)顾名思义为民用码。他的速率为 P 码的十分之一,即 1.023 Mbps。每颗卫星的 C/A 码有 1023 位,每毫秒即可广播一次。它运行在 L1 上,旨在提供标准定位服务(SPS)。作为对比,P(Y) 码则提供的是精准定位服务(PPS)。

在设计之初,美国低估了 C/A 码的定位精准度,于是通过选择可用性 (SA) 故意降低到 95% 的时间为水平 ±100 米、垂直 ±175 米精度。这一措施直到 21 世纪初才取消。

P 码和 C/A 码的生成都利用的是线性移位反馈寄存器(LSFR)。我们以 C/A 码为例。

image-20220524173604302

如图是一个典型的 C/A 码生成器结构。其中,G1 和 G2 为 LSFR。输出时,通过相位选择器选择 G2 中的两个位置做异或,所得结果再与 G1 最后一位异或,即可得到扩频码。相位选择器选择的位置共有 37 种,每个卫星或地面站均不相同。

G1 和 G2 的具体原理如下所示:

image-20220524173918234 image-20220524173924815

他们都利用的是有限域中的运算。其中,

  • G1 为 1 + x 3 + x 10 1+x^3+x^{10} 1+x3+x10
  • G2 为 1 + x 2 + x 3 + x 6 + x 8 + x 9 + x 10 1+x^2+x^3+x^6+x^8+x^9+x^{10} 1+x2+x3+x6+x8+x9+x10

根据文档,G2 寄存器设置有初始值和时延。具体的值如下所示:

image-20220524174506382

不过,初始值和时延不是必须的。在没有时延的情况下,如果将初始值全部置 1,最终的结果相同。

MATLAB 仿真代码如下:

function g = C_A_Code(num)taps = [2 ,6 ; 3 ,7 ; 4 ,8 ; 5 ,9 ; 1 ,9 ;2 ,10; 1 ,8 ; 2 ,9 ; 3 ,10; 2 ,3 ;3 ,4 ; 5 ,6 ; 6 ,7 ; 7 ,8 ; 8 ,9 ;9 ,10; 1 ,4 ; 2 ,5 ; 3 ,6 ; 4 ,7 ;5 ,8 ; 6 ,9 ; 1 ,3 ; 4 ,6 ; 5 ,7 ;6 ,8 ; 7 ,9 ; 8 ,10; 1 ,6 ; 2 ,7 ;3 ,8 ; 4 ,9 ; 5 ,10; 4 ,10; 1 ,7 ;2 ,8 ; 4 ,10];g2s = [1, 1, 0, 0, 1, 0, 0, 0, 0, 0; % 14401, 1, 1, 0, 0, 1, 0, 0, 0, 0; % 16201, 1, 1, 1, 0, 0, 1, 0, 0, 0; % 17101, 1, 1, 1, 1, 0, 0, 1, 0, 0; % 17441, 0, 0, 1, 0, 1, 1, 0, 1, 1; % 11331, 1, 0, 0, 1, 0, 1, 1, 0, 1; % 14551, 0, 0, 1, 0, 1, 1, 0, 0, 1; % 11311, 1, 0, 0, 1, 0, 1, 1, 0, 0; % 14541, 1, 1, 0, 0, 1, 0, 1, 1, 0; % 16261, 1, 0, 1, 0, 0, 0, 1, 0, 0; % 15041, 1, 1, 0, 1, 0, 0, 0, 1, 0; % 16421, 1, 1, 1, 1, 0, 1, 0, 0, 0; % 17501, 1, 1, 1, 1, 1, 0, 1, 0, 0; % 17641, 1, 1, 1, 1, 1, 1, 0, 1, 0; % 17721, 1, 1, 1, 1, 1, 1, 1, 0, 1; % 17751, 1, 1, 1, 1, 1, 1, 1, 1, 0; % 17761, 0, 0, 1, 1, 0, 1, 1, 1, 0; % 11561, 1, 0, 0, 1, 1, 0, 1, 1, 1; % 14671, 1, 1, 0, 0, 1, 1, 0, 1, 1; % 16331, 1, 1, 1, 0, 0, 1, 1, 0, 1; % 17151, 1, 1, 1, 1, 0, 0, 1, 1, 0; % 17461, 1, 1, 1, 1, 1, 0, 0, 1, 1; % 17631, 0, 0, 0, 1, 1, 0, 0, 1, 1; % 10631, 1, 1, 1, 0, 0, 0, 1, 1, 0; % 17061, 1, 1, 1, 1, 0, 0, 0, 1, 1; % 17431, 1, 1, 1, 1, 1, 0, 0, 0, 1; % 17611, 1, 1, 1, 1, 1, 1, 0, 0, 0; % 17701, 1, 1, 1, 1, 1, 1, 1, 0, 0; % 17741, 0, 0, 1, 0, 1, 0, 1, 1, 1; % 11271, 1, 0, 0, 1, 0, 1, 0, 1, 1; % 14531, 1, 1, 0, 0, 1, 0, 1, 0, 1; % 16251, 1, 1, 1, 0, 0, 1, 0, 1, 0; % 17121, 1, 1, 1, 1, 0, 0, 1, 0, 1; % 17451, 1, 1, 1, 0, 0, 1, 0, 1, 1; % 17131, 0, 0, 1, 0, 1, 1, 1, 0, 0; % 11341, 1, 0, 0, 1, 0, 1, 1, 1, 0; % 14561, 1, 1, 1, 0, 0, 1, 0, 1, 1; % 1713];delay = [5  , 6  , 7  , 8  , 17 , ...18 , 139, 140, 141, 251, ...252, 254, 255, 256, 257, ...258, 469, 470, 471, 472, ...473, 474, 509, 512, 513, ...514, 515, 516, 859, 860, ...861, 862, 863, 950, 947, ...948, 950];n = 10; % size of LFSRL = 2^n - 1; % number of chips in a codeg1_sel = [0 0 1 0 0 0 0 0 0 1]; % G1 generatorg1 = ones(1, n); % G1 vectorg2_sel = [0 1 1 0 0 1 0 1 1 1]; % G2 generatorg2 = g2s(num, :); % G2 vectortap = taps(num, :);for i = 1 : (delay(num) - 1)g2 = [mod(sum(g2 .* g2_sel), 2), g2(1:n - 1)];endfor i = 1 : Lg(i) = mod(g1(n) + mod(sum(g2(tap)), 2), 2);g1 = [mod(sum(g1 .* g1_sel), 2), g1(1 : n - 1)];g2 = [mod(sum(g2 .* g2_sel), 2), g2(1 : n - 1)];end

利用程序,我们可以生成第一个和第二个 C/A 码:

当然,C/A 码具体的值不是我们所关心的。我们需要关心的是它的相关性。

左图为第 1 个 C/A code 自相关,右图为第 1 和第 2 个 C/A code 互相关。它们的明显区别在于:自相关有着非常突出的峰值,而互相关则没有。因此,我们可以通过识别峰值来找到正确的 C/A 码。

我们将第 1 个 C/A code 做相移(即,将尾部的一部分移动到头部),再与原来的 C/A 码做互相关,得到下图:

通过对比可以发现,尽管相移后仍然有明显的峰值,但峰值处的相关值降低了。我们做出了峰值与相移大小的关系图:

由图可以看出,它是一个完美的等腰三角形。在没有相移的情况下,相关值最大。

GPS 信号接收

接收机信号处理分为 4 个步骤,如下所示:

image-20220524182221824

其中,跟踪分为载波环(用于解调)和码环(用于解扩)。这里,我们只讨论与主题有关的码环。

根据上文得到的结论,在解扩时,我们尝试使用不同的 C/A 码解扩,如果看到明显的峰值,则表明选对了 C/A 码。选择正确的 C/A 码后,需要使用峰值与相移大小的关系来使得相位对齐。具体做法如下图所示:

image-20220524182913117

假设当前随意选取的相位为 P,其与最大值对应的相位差为 δ c p \delta_{cp} δcp。我们将其向前移动 d 个相位到点 E,再向后移动 d 个相位到点 L。根据等腰三角形的性质可以得出,如果 E 和 L 的值相等,则 P 点在最大值,如下图所示。

image-20220524183313551

而如果 E 和 L 不等,则需要进行调整,向左或向右偏移。然而,由于噪声等因素的存在,实际情况并不是完美的三角形(如下图所示),故无法直接计算出需要偏移的量,只能一点点尝试。

image-20220524183734467

具体的流程如下所示:

image-20220524183805587

右下角的环路滤波器接收计算出的偏移量,并生成实际的偏移量。具体的,计算方法为
δ c p ^ ( n ) = ( 1 − α ) δ c p ^ ( n − 1 ) + α δ c p ( n ) \hat{\delta_{cp}}(n)=(1-\alpha)\hat{\delta_{cp}}(n-1)+\alpha\delta_{cp}(n) δcp^(n)=(1α)δcp^(n1)+αδcp(n)
其中, δ c p ^ ( n ) \hat{\delta_{cp}}(n) δcp^(n) 为实际采用的偏移量, α \alpha α 为滤波系数,通常取 0.05。

经过滤波器后,C/A 码晶体振荡器根据偏移量生成 C/A 码,并通过移位寄存器生成上文提到的 E 和 L。E 和 L 分别与原信号的 I 路和 Q 路相乘,并计算 1 ms 内的相关值,分别得到 I E , I L , Q E , Q L I_E,I_L,Q_E,Q_L IE,IL,QE,QL。然后根据
E = I E 2 + Q E 2 L = I L 2 + Q L 2 E=\sqrt{ {I_E}^2+{Q_E}^2}\\ L=\sqrt{ {I_L}^2+{Q_L}^2} E=IE2+QE2 L=IL2+QL2
得到幅值。

当然,前面的步骤是相干的。我们也可以使用非相干的办法,这在低信噪比的情况下表现会更好。

再计算出幅值后,进入鉴别器,计算期望的相位调整值 δ c p \delta_{cp} δcp。具体的计算方法有三种:

  • 幅值法
    δ c p = 1 2 E − L E + L \delta_{cp}=\frac{1}{2}\frac{E-L}{E+L} δcp=21E+LEL

  • 功率法
    δ c p = 1 2 E 2 − L 2 E 2 + L 2 \delta_{cp}=\frac{1}{2}\frac{E^2-L^2}{E^2+L^2} δcp=21E2+L2E2L2

  • 点积功率法
    δ c p = 1 2 E − L P \delta_{cp}=\frac{1}{2}\frac{E-L}{P} δcp=21PEL

我们分别作出了这三种方法的图像:

可以看到,三条线共有三个交点。如果当前在最左侧的交点左侧,则说明 E、P、L 三点均在等腰三角形的左侧,无法继续计算;最右侧交点的右侧同理。

同时,我们可以看到幅值法是线性的——这是非常好的特性。因此,幅值法也是用得最多的方法。


http://www.ppmy.cn/news/300640.html

相关文章

解决安卓手机(小米手机实测有效)移动网络无信号以及快速恢复的方法

现象: 行动到某个区域时突然没网(微信支付无法使用、 健康宝无法加载、公交卡二维码无法展现等等) 解决方案: 1. 可以先尝试把手机打开“飞行模式”, 几秒种后再关闭“飞行模式”。 看下手机网络是否已恢复。 2. …

GPS原始信号数据解析

GPS 上电后,每隔一定的时间就会返回一定格式的数据,数据格式为: $信息类型,x,x,x,x,x,x,x,x,x,x,x&#xff0…

LimeSDR mini实现GPS信号接收

LimeSDR mini实现GPS信号接收 作者微信公众号:小卫星 操作系统: Ubuntu18.04 LTS 0、起因 LimeSDRmini既然包含了GPS频段(L1 1575.42MHz),那就应该能接收GPS信号并定位,但是纵观网络,讲SDR模拟…

GPS卫星的导航电文和卫星信号

基本内容:导航电文的定义、内容;码、比特、随机码、伪随机码的概念;C/A码、P码的产生、数字指标。 重点:导航电文的定义、内容;伪随机码的概念;C/A码、P码的产生、数字指标。 难点:伪随机码的的…

GPS载频信号简述(L1、L2、L3、L5)

L1:1575.421.023MHzL2:1227.601.023MHz L3:用途和频率暂未公开。资料显示其用于发现核爆炸或其他高能量红外辐射事件的核爆炸侦察系统(NDS)平台提供通讯联系。L5:1176.451.023MHz(2009年测试,2010年正式播发) 单频接收机只能接收L1载波信号&a…

GPS信号概况

传统的GPS信号是指位于L1波段上的民用C/A码信号(简称L1 C/A信号)、位于L1上的军用P(Y)码信号[简称L1 P(Y)信号]和L2上的P(Y)信号[简称L2 P(Y)信号]。在GPS现代化计划的实施过程中,新发射升空的GPS卫星首先在L2波段上增加播发称为L2C的第二个民…

俄罗斯城市的GPS信号受到干扰

©网络研究院 每天,数十亿人使用GPS卫星系统在世界各地寻找自己的路,但GPS信号很脆弱。干扰和欺骗攻击会使GPS连接完全瘫痪,或者使某些东西出现在错误的位置,从而导致中断和安全问题。 问问俄罗斯就知道了。新的数据分析显示…

用HackRF One模拟GPS信号

上次说到HackRF One模拟遥控钥匙开灯关灯,实际上HackRF One几乎可以模拟我们能见到的各种射频遥控物品。不错,就如你想的那样——你家车库的遥控门、单位气派的遥控门,还有你心爱的汽车遥控钥匙——统统可以用电脑来控制,而且还很…