大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成

大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成

GPS信号

目前GPS信号一共有三个频点L1/L2/L3。
其中传统GPS信号就是 L1C/A和L1P和L2P 双频,
L1C/A和L1P是正交的,L2只有L2P而没有民用信号
L1C/L2C/L5C都是GPS现代化后新增的信号,L1M/L2M是新增的军用信号。GPS后续发展是这些新信号逐渐取代原来的旧信号,不过这个过程将相当漫长。
大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成
后面我们介绍最典型的L1C/A信号的构成。

L1C/A信号的构成

L1C/A信号由三部分组成。
1、载波
2、伪随机码,这里称为C/A码
3、电文,数据码
大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成
载波就是L1频率为1575.42MHz的载波信号,将伪码和数据调制到载波上发射出去。
C/A码是长度为1023个码片的伪随机序列,其设计具有良好的自相关和互相关特性,即自相关函数幅值大大高于互相关函数幅值。这个特性被用来识别不同的伪随机序列。C/A码自然也具有这个良好的特性。因此不同的卫星可以用不同的C/A码来区分。
电文,数据码包含周内秒,星历,历书等内容,用于定位解算。

C/A码信号的生成

C/A码的生成是我们进行接收处理的第一步,首先我们需要根据其定义用程序描述出来

根据GPS ICD描述,CA码发射发生器使用2个M序列构成,分别被称为G1序列和G2序列。每个卫星测距码信号使用的唯一C/A码序列就是通过将G1序列和一定抽头选择后的G2序列模2和(modulo-2 sum,其实就是异或运算(^,xor()),就是二进制加法)产生的。

每个M序列寄存器都是10Bit,则根据M序列性质,G1序列和G2序列的周期都是2^10-1=1023。两个序列模2和运算得到的Gold码周期也是1023,也就是书上到处说的1023个码片(CA Chip)。

由于Gold码周期是1023个码片,所以在1.023MHz时钟驱动下,一个周期信号长度(1023个码片)为1ms,即每隔1ms产生一个周期的全部1023个码片,每个码片持续时间长度为1ms/1023 ≈1us.

如下图是2个线性移位寄存器组,每个寄存器组是10bit,上本部分产生G1序列,下半部分产生G2序列,受GPS时钟控制。CA码时钟是1.023MHz。

输出的C/A码是G1的最后一级寄存器内容和G2抽头选择寄存器输出,进行模2和运算输出。
大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成
M序列的使用一般都是提供一个多项式,通过抽头控制;

大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成
G1和G2的初始相位设置为全1。根据GPS ICD中 PRN对应的抽头的描述可以得到以下matlab程序来生成1-32组C/A码
大话卫星导航中的信号处理系列文章——GPS信号以及C/A码生成

function [caCode] = prn_GPS_L1CA_Gen(prn);

%10阶的移位寄存器G1和G2
%G1,G2寄存器初始化
regG1 = 1 * ones(1,10);
regG2 = 1 * ones(1,10);

%获取卫星PRN号码
snum = prn;

%确定CA码的抽头选择
switch snum
     case 1             %1号星
        m = 2; n = 6;
     case 2             %2号星
        m = 3; n = 7;  
     case 3             %3号星
        m = 4; n = 8;
     case 4             %4号星
        m = 5; n = 9;
     case 5             %5号星
        m = 1; n = 9;
     case 6
        m = 2; n = 10;
     case 7
        m = 1; n = 8;
     case 8
        m = 2; n = 9;
     case 9
        m = 3; n = 10;
     case 10
        m = 2; n = 3;
     case 11
        m = 3; n = 4;  
     case 12
        m = 5; n = 6;
     case 13
        m = 6; n = 7;
     case 14
        m = 7; n = 8;
     case 15
        m = 8; n = 9;
     case 16
        m = 9; n = 10;
     case 17
        m = 1; n = 4;
     case 18
        m = 2; n = 5;
     case 19
        m = 3; n = 6;
     case 20
        m = 4; n = 7;  
     case 21
        m = 5; n = 8;
     case 22
        m = 6; n = 9;
     case 23
        m = 1; n = 3;
     case 24
        m = 4; n = 6;
     case 25
        m = 5; n = 7;
     case 26
        m = 6; n = 8;
     case 27
        m = 7; n = 9;
     case 28
        m = 8; n = 10;
     case 29
        m = 1; n = 6;  
     case 30            %30号星
        m = 2; n = 7;
     case 31            %31号星
        m = 3; n = 8;
     case 32            %32号星
        m = 4; n = 9;
end


%reg1存储移位寄存器regG1的1023点输出
for i= 1:1023
    reg1(i) = regG1(10);                %G1输出存储到reg1
    temp = xor(regG1(3),regG1(10));     %移位寄存器G1的反馈
    regG1(1,2:10) = regG1(1,1:9);       %G1移位
    regG1(1) = temp;                    %反馈
end

%reg2存储移位寄存器regG2的1023点输出
for i= 1:1023
    reg2(i) = xor(regG2(m),regG2(n));                %G2输出存储到reg2 
    temp1 = xor(xor(regG2(2),regG2(3)), regG2(6));   %移位寄存器G2的反馈
    temp2 = xor(xor(regG2(8),regG2(9)), regG2(10));  
    temp = xor(temp1,temp2);
    regG2(1,2:10) = regG2(1,1:9);                    %G2移位
    regG2(1) = temp;                    %反馈
end


caCode = mod(reg1 + reg2 , 2);

I = find(caCode == 0);
caCode(I) = -1;

以上我们完成了GPS C/A码生成,走出了GPS信号处理的第一步。

上一篇:BUUCTF 大帝的密码武器


下一篇:在python中怎么用转义字符输出汉字