本文所涉文献资料均为开源免费, 参考文献、声明链接等均写在文末。
1.C/A码简要介绍
GPS卫星信号包括载波信号 、测距码和数据码.其 中的测码粗码即 C/A码 (CoarseAcquisitionCode)除 了作为粗测码外 ,还由于其具有码长短,易于捕获的特点而作为GPS卫星信号的捕获码 ,因此C/A码是 GPS信号捕获以及接收机实现的基础。[1]
GPS系统中使用了两种伪随机码 ,一种是时钟速率 为 10.23MHz用于精密测距的精确军用码 ,简称P码 。另一种是时钟速率为 1.023MHz用于分址 、搜捕卫星信号的粗捕获民用码 ,简称为 c/A 码。c/A码(Coarse/Acquisition)是用于粗测和捕获的伪随机码。它是 m 序列的优选对组合码形成的Gold码 (简称 G 码 )。[2]
2.C/A码发生器原理
C/A码是由两个移位寄存器产生的10阶M序列(自己查,不赘述)经抽头选择后,模2和的结果,(其中G2需要根据卫星编号PRN进行抽头选择模2和,而G1只进行抽头选择),码长为2^10 -1。这两个10阶M序列分别为
G1:X^10 +X^3 +1
G2:X^10 +X^9 + X^8 + X^6 + X^3 + X^2 +1
抽头选择,即为抽选M序列对应阶数的系数。模2和即为异或。
3. 算法思路
3.1先对两个10位寄存器进行初始化
reg [9:0] G1_REG=10'b11_1111_1111 //verilog
G1_REG = ones(1,10);(Matlab)
3.2生成G码G1和G2
verilog
G1_REG<={G1_REG[8:0], G1_REG[9]^ G1_REG[2]};
先将G1非0阶非0系数进行异或,然后移位,最后将异或结果作为G1_REG[0]
Matlab
temp = xor(G1_REG(3),G1_REG(10));
G1_REG(1,2:10)=G1_REG(1,1:9);
G1_REG(1)=temp
3.3抽头选择
G2需要根据卫星编号prn,进行对应抽头(m,n)
verilog
G1_R<= G1_REG[9];
G2_R<=G2_REG[m-1]^G2_REG[n-1];
matlab
G1_R=G1_REG(10);
G2_R=xor(G2_REG(m),G2_REG(n));
3.5 G1与G2异或生成C/A码
注意:c/a码实际上就是不断循环上述过程产生的数列,在第一步异或结果放在寄存器的哪一位都行,只是代码有略微区别。
verilog
CA_CODE <=G1_R^G2_R;
Matlab
CA_CODE = mod(G1_R+G2_R,2)
4.具体代码
verilog CA_GENRATOR.v
module CA_GENRATOR(
input [5:0] PRN,
input CLK_10P23M,
input SYS_RST,
output CA_CODE
);
reg [9:0] G1_REG = 10'h3FF;
reg [9:0] G2_REG = 10'h3FF;
reg [3:0] m;
reg [3:0] n;
always @(posedge CLK_10P23M) begin
if (SYS_RST) begin
m <= 0;
n <= 0;
end else begin
case (PRN)
1 : begin m <= 2; n <=6; end
2 : begin m <= 3; n <=7; end
//文件在内网,这些代码平板手打太费劲,具体看matlab里prn和n m的对应关系
32 : begin m <= 4; n <=9; end
default : begin m<=0; n <=0; end
endcase
end
end
reg G1_R;
reg G1_temp = 0;
reg G2_R;
reg G2_temp = 0;
always @( posedge CLK_10P23M ) begin
if (SYS_RST) begin
G1_REG <= 10'h3FF;
G1_R <= 0;
end
else if (m>0) begin
G1_R <= G1_REG[9];
G1_REG <= {G1_REG[8:0],G1_REG[2]^G1_REG[9]};
end
end
always @( posedge CLK_10P23M ) begin
if (SYS_RST) begin
G2_REG <= 10'h3FF;
G2_R <= 0;
end
else if (m>0) begin
G2_R <= G2_REG[m-1]^G2_REG[n-1];
G2_REG <= {G2_REG[8:0],G2_REG[1]^ G2_REG[2]^ G2_REG[5]^ G2_REG[7]^ G2_REG[8]}^ G2_REG[9];
end
end
always @( posedge CLK_10P23M ) begin
if (SYS_RST) begin
CA_CODE <= 0;
end else
CA_CODE <= G2_R^ G1_R;
end
endmodule
文末声明
本文仅作免费分享用途,转载只需声明来源,且转载内容不得用于盈利。否则,啊米诺斯。
笔者以后会不定时更新自己学习的经验,均非盈利分享。如有谬误,欢迎各位批评指正。
学习交流:todaytyp@gmail.com;站内私信;v:同csdnid
matlab 代码参考
matlab 代码
2024.1.16
原matlab代码的链接404了,我搜了一下csdn上其他代码,都有点复杂。自己写一个吧。
整理一下思路
1.全一矩阵对应G码公式异或移位。用全一1X10矩阵对应G码非零阶项,然后把对应上的数全异或作为矩阵左移后的第0位;
2.抽头。对上一步生成的矩阵进行抽头,G1没要求直接抽最高位,G2抽取卫星要求的对应位异或;
3.抽头结果异或。
regG1 = ones(1,10);
regG2 = ones(1,10);
prn = 10;
switch prn
case 1
m = 2; n = 6;
case 2
m = 3; n = 7;
case 3
m = 4; n = 8;
case 4
m = 5; n = 9;
case 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
m = 2; n = 7;
case 31
m = 3; n = 8;
case 32
m = 4; n = 9;
end
for i = 1:1023
reg1(i) = regG1(10);
temp = xor(regG1(3),regG1(10));
regG1(1,2:10) = regG1(1,1:9);
regG1(1) = temp;
end
for i = 1:1023
reg2(i) = xor(regG2(m),regG2(n));
temp1 = xor(xor(regG2(2),regG2(3)),regG2(6));
temp2 = xor(xor(regG2(8),regG2(9)),regG2(10));
tempg = xor(temp1,temp2);
regG2(1,2:10) = regG2(1,1:9);
regG2(1) = tempg;
end
CACODE = mod(reg1+reg2,2);
I = find(CACODE == 0);
CACODE(I)= -1;
参考文献
[1] E11iottDKapla.GPS原理 与应用 [M].邱致 和 ,王万 义译.北京 :电子工业 出版社 ,2002.52-59..
[2] 张贤达 ,保铮.通讯信号处理[M3.北京 :国防工业 出版社 ,2000