GPS 粗略采集 PRN 代码

信息处理 信号分析 互相关 bpsk 模板匹配
2022-02-06 19:11:01

消费者是否可以使用 32 颗 GPS 卫星中每颗的实际 1023 位序列?我找到了IS GPS 200,但它没有列出整个序列。经验证的序列是否可以在线下载?

我正在尝试验证我的 python CA PRN 生成器。另外,最后一个脚注(**** 这里使用的两次敲击编码器只是一个示例实现,它生成一组有限的有效 C/A 代码。)是什么意思?它对哪些代码有效?

在此处输入图像描述

1个回答

我有一个 PRN 生成器,我已经使用该地址的 Mathworks Exchange 站点上可用的实时捕获信号进行了验证,并且同样在 Octave 中运行(更新:我还在下面的代码块中粘贴了它的核心):

https://www.mathworks.com/matlabcentral/fileexchange/14670-gps-ca-code-generator

两个抽头编码器在该规范的图表中给出,并复制在下图中:

GPS C/A 代码生成器

他们所说的“双抽头编码器”的意思是在图中选择和添加 G2 生成器的两个输出,这只是生成序列的一种方式(一种非常方便的方式)。我所做的另一种方法是使用一个 LFSR 实现生成器。在这种情况下,您只需对两个生成多项式的系数进行卷积。这会产生一个长度为 20 的移位寄存器和非最大长度序列(因为它显然可以被分解),并且将生成 1023 个不同的序列,每个序列长度为 1023,具体取决于您如何播种。(因此,如果您使用感兴趣的 PRN 中的任何 20 个连续芯片更改 20 个元素的状态,它将继续运行该 SV 的代码)。所以当他们提到它只会产生有限的黄金代码选择,9!=42组合——如果我做对了,那么我高度怀疑选择使用 1023 个不同代码中的哪一个是基于使用这个 2-tap 生成器的假设。所示的两次抽头生成器不会为使用的这些多项式生成所有可能的黄金代码,但它确实会生成所有 GPS C/A 代码。

这是因为黄金代码(即 GPS C/A 代码)是通过在 GF(2) 中添加两个最大长度序列(基本上是对输出进行 x 或运算)形成的。这样做与使用一个生成器可以完成的操作相同,其中多项式相乘,然后通过对多项式的系数进行卷积来相乘。

仅使用一个长 LFSR 的优势是创建一个灵活的代码生成器,该代码生成器能够创建最大长度为的序列,包括所有 GPS C/A 代码和许多其他复合代码。2201

黄金代码的有趣之处在于,如果您将其中一个发生器相对于另一个延迟 1 个码片,结果将是一个全新的 1023 长度序列。因此,由于有 1023 个可能的延迟,因此可以生成总共 1023 个可能的序列,每个序列长 1023 个。

关于一般最大长度序列的另一个有趣点是,如果您将 GF(2) 序列添加到其自身的延迟版本中,它将以完全不同的延迟创建完全相同的序列!因此,您可以通过用于选择卫星的“双击编码器”看到黄金代码生成器中发生的情况;在我给出的图中,我们选择点击 2 和 6 导致 SV1(它应该与您未发布的表格的第一部分匹配)。您的表格显示了 G2 编码器对于每两个抽头选择的等效延迟。

由于 MathExchange 站点需要登录,因此这里是我的代码副本,其中删除了前端错误捕获(为简洁起见):

function g=cacode(sv,fs)
% function G=CACODE(SV,FS) 
% Generates 1023 length C/A Codes for GPS PRNs 1-37
%
% 
% g: nx1023 matrix- with each PRN in each row with symbols 1 and 0
% sv: a row or column vector of the SV's to be generated
%    valid entries are 1 to 37
% fs: optional number of samples per chip (defaults to 1), fractional samples allowed, must be 1 or greater.
%
% For multiple samples per chip, function is a zero order hold. 
%
%
% For example to generate the C/A codes for PRN 6 and PRN 12 use:
% g=cacode([6 12]),
% and to generate the C/A codes for PRN 6 and PRN 12 at 5 MHz use
% g=cacode([6 12],5/1.023)
% 
%
% Dan Boschen 12-30-2007
% boschen@loglin.com


% table of C/A Code Tap Selection (sets delay for G2 generator)
tap=[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];

% G1 LFSR: x^10+x^3+1
s=[0 0 1 0 0 0 0 0 0 1];
n=length(s);
g1=ones(1,n);   %initialization vector for G1
L=2^n-1;

% G2 LFSR: x^10+x^9+x^8+x^6+x^3+x^2+1
t=[0 1 1 0 0 1 0 1 1 1];
q=ones(1,n);    %initialization vector for G2

% generate C/A Code sequences:
tap_sel=tap(sv,:);
for inc=1:L
    g2(:,inc)=mod(sum(q(tap_sel),2),2);
    g(:,inc)=mod(g1(n)+g2(:,inc),2);
   g1=[mod(sum(g1.*s),2) g1(1:n-1)];
   q=[mod(sum(q.*t),2) q(1:n-1)];
end

%upsample to desired rate
if fs~=1
    %fractional upsampling with zero order hold
    index=0;
    for cnt = 1/fs:1/fs:L
        index=index+1;
        if ceil(cnt) > L   %traps a floating point error in index
            gfs(:,index)=g(:,L);
        else
            gfs(:,index)=g(:,ceil(cnt));
        end
    end 
    g=gfs;
end