大话卫星导航中的信号处理系列文章——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后续发展是这些新信号逐渐取代原来的旧信号,不过这个过程将相当漫长。
后面我们介绍最典型的L1C/A信号的构成。
L1C/A信号的构成
L1C/A信号由三部分组成。
1、载波
2、伪随机码,这里称为C/A码
3、电文,数据码
载波就是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和运算输出。
M序列的使用一般都是提供一个多项式,通过抽头控制;
G1和G2的初始相位设置为全1。根据GPS ICD中 PRN对应的抽头的描述可以得到以下matlab程序来生成1-32组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信号处理的第一步。