C/A码的应用背景

20世纪50年代哈尔维奇理论上证明了要克服多径和窄带干扰,信道中传输的信号形式应该具有白噪声统计特性,在这样的理论指导下可以人为复现的伪随机码应运而生。伪随机码的应用是扩频通信系统中的核心之一,将数字通信系统中的基带信息与伪随机码进行异或后可以扩展基带信号的带宽从而提高通信系统的抗干扰能力。此外由于不同的伪随机码之间互相关函数值往往较低,因此不同的扩频通信系统可以通过采用不同的伪随机码来实现码分多址从而提高通信频带的利用率。同时伪随机码还具有尖锐的自相关函数,通过测量接收到的伪码与本地伪码之间互相关函数的峰值,可以得到伪码在传输过程中造成的时延,这使得伪随机码也可以应用于距离测量等测控领域。C/A码是GPS全球导航系统中所采用的一种伪随机码,其码片速率为1.023MHz,码长1023,码周期为1ms,C/A码的应用是GPS民用导航的基础。

C/A的产生

C/A码的产生框图如下所示:
CA码产生框图
CA码由两组10位的移位寄存器产生,其中上下两方的移位寄存器相当于产生了两组m序列G1和G2,通过对下方的寄存器进行不同的相位选择可以产生不同的C/A码序列,上下两组移位寄存器的初始状态均为全1。每当时钟脉冲到来,上下两组移位寄存器按照对应的抽头进行模2加然后将模2加后的结果暂存,上下两组寄存器再进行移位再将暂存后的结果送入1号寄存器,此时输出端即可输出一位对应的C/A码,随着时钟脉冲的不断到来,即可连续不断地输出C/A码序列。

C/A码地特性

C/A码与一般的伪随机码一样具有良好的自相关特性与互相关特性,MATLAB仿真后可得到C/A码的自相关函数以及不同C/A码的互相关函数如下图所示:
C/A码的自相关函数与互相关函数

同时可得C/A码的功率谱密度如下图所示:
C/A码的功率谱密度
由图可得,C/A码波形的主瓣带宽约为2.046MHz,基带信号与C/A码异或后可以将频谱扩展到2.046MHz,从而提高系统抗噪声性能。

整个MATLAB仿真代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
clc;clear;close all;
f_clk=1.023e6; %寄存器时钟脉冲频率即码片速率
fs=f_clk*10; %系统仿真采样率设定
t=[0:(1/fs):((10e-3)-1/fs)]; %系统仿真时间设定(100ms)
N=1023; %CA码周期
tags = [[2 6];[3 7];[4 8];[5 9];[1 9];[2 6];[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]]; %G2码相位选择
[wave_CA_1,code_CA_1]=CA_generation(tags(6,:),f_clk,t);
[wave_CA_2,code_CA_2]=CA_generation(tags(12,:),f_clk,t);

x_cor=-2*N+1:1:2*N-1;
m_1=cor_cir(code_CA_1,code_CA_1,length(x_cor))/length(code_CA_1);
m_12=cor_cir(code_CA_1,code_CA_2,length(x_cor))/length(code_CA_1);
figure();
subplot(2,1,1);
plot(x_cor,m_1);
ylim([-0.2,1.2]);
title('CA码自相关函数');
xlabel('延迟码片数');
ylabel('自相关函数值');
subplot(2,1,2);
plot(x_cor,m_12);
ylim([-0.2,1.2]);
title('CA码互相关函数');
xlabel('延迟码片数');
ylabel('自相关函数值');
[psd_CA,w_CA]=pwelch(wave_CA_1,[],[],[],fs,'centered','psd');
figure();
plot(w_CA/1e6,10*log10(psd_CA));
title('CA码功率谱密度');
xlabel("频率/MHz");
ylabel("幅度/dB");

%% CA码生成函数
function [wave,code]=CA_generation(phase_tag,F_CLK,T)
reg_G1=-ones(1,10); %-1代表1,1代表0
reg_G2=-ones(1,10);
index_code=0;
t_chip=1/F_CLK;
wave=zeros(1,length(T));
code=zeros(1,length(T)*F_CLK*(T(2)-T(1)));
for i0=1:length(T)
if (T(i0)>=T(1)+index_code*t_chip)
sum_G1=reg_G1(3)*reg_G1(10);
reg_G1(2:10)=reg_G1(1:9);
reg_G1(1)=sum_G1;
sum_G2=reg_G2(2)*reg_G2(3)*reg_G2(6)*reg_G2(8)*reg_G2(9)*reg_G2(10);
reg_G2(2:10)=reg_G2(1:9);
reg_G2(1)=sum_G2;
index_code=index_code+1;
code(index_code)=reg_G1(10)*reg_G2(phase_tag(1))*reg_G2(phase_tag(2));
end
wave(i0)=code(index_code);
end
end

%% 圆相关函数
function [seq_cor]=cor_cir(code_in1,code_in2,cor_n)
seq_cor=zeros(1,cor_n);
for i1=1:length(seq_cor)
for i2=1:length(code_in1)
f=mod(i2+i1,length(code_in1));
if (f==0)
f=length(code_in1);
end
seq_cor(i1)=seq_cor(i1)+code_in1(i2)*code_in2(f);
end
end
end