北斗B1I测距码特性及程序生成

1 测距码特性

测距码就是伪随机噪声( pseudo random noise,PRN)码,也称作伪码,常作为扩频系统的扩频码,工程上常用一系列0或1组成的二进制序列码,按照一定的编码规则来产生伪噪声码。伪码具有确定性、周期性以及良好的自相关性,大体被分为三类:m序列、组合码和非线性码,北斗伪卫星信号的Ⅰ支路测距码是一种由m序列构成的组合码。

北斗伪卫星系统中,Ⅰ支路使用的测距码是Gold 码,由两个11级的m序列G1、G2,通过模二和,并截短一个码片后产生。北斗伪卫星系统中Gold码的速率为2.046Mcps,长度为2046,伪码周期为1ms,即1个伪码周期包含2046个码片。两个移位寄存器的G1,G2的生成多项式为:

          G1(X) = 1+X+X^{7}+X^{8}+X^{9}+X^{10}+X^{11}

          G2(X) = 1+X+X^{2}+X^{3}+X^{4}+X^{5}+X^{8}+X^{9}+X^{11}

G1 和 G2 的初始相位为:
       G1 序列初始相位:01010101010;
       G2 序列初始相位:01010101010。

码发生器如图下:

通过对产生 G2 序列的移位寄存器不同抽头的模二加可以实现G2 序列相位的不同偏移,与 G1 序列模二加后可生成不同卫星的测距码。G2 序列相位分配如表:

2 matlab程序生成




function codes = GoldGenerator(No,num)

codeLen = 2046;  	% ???????
% ?????????????, ???0??
polynomial1 = [1 0 0 0 0 0 1 1 1 1 1];	% [1 7 8 9 10 11]     ???е?????????????????????????????
polynomial2 = [1 1 1 1 1 0 0 1 1 0 1];	% [1 2 3 4 5 8 9 11]

% ????????????????
%rand('twister', sum(100*clock));
%randn('state', sum(100*clock));

% ????????????λ?????
sd1 = [0 1 0 1 0 1 0 1 0 1 0];	% ???????λ?????1
sd2 = [0 1 0 1 0 1 0 1 0 1 0];	% ???????λ?????2

% ????α??1
pn1 = zeros(1, codeLen);
for i=1:codeLen
	pn1(i) = sd1(11);
	% ???????GOLD?
	newGold = mod((sum(polynomial1 & sd1)), 2);  %???1????????????????????????1
	% ??λ
	sd1(2:11) = sd1(1:10);
	sd1(1) = newGold;
end

% ????α??2
if No==30
pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(6),sd2(10));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==1
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(3));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end  
elseif No==2
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(4));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==3
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(5));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==4
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(6));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==5
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(8));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==6
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(9));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==7
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(10));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==8
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(1),sd2(11));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==9
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(2),sd2(7));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
    elseif No==10
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(3),sd2(4));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==11
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(5),sd2(3));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
elseif No==12
      pn2 = zeros(1, codeLen);
for i=1:codeLen
    pn2(i) = xor(sd2(6),sd2(3));
	% ???????GOLD?
	newGold = mod((sum(polynomial2 & sd2)), 2);
	% ??λ
	sd2(2:11) = sd2(1:10);
	sd2(1) = newGold;
end
    else
%         error('The wrong satellite number!')
    pn2 = zeros(1, codeLen);
end


% ???GOLD??

codes1 = xor(pn1,pn2);
nf = ceil(num/codeLen);
for frame=1:nf
codes((1:codeLen)+((frame-1)*codeLen))=codes1(1:codeLen);
end
codes=double(codes(1:num));


% for i=1:num
%     if codes(i)==1
%        codes(i)=-1;
%     else
%         codes(i)=1;
%     end
% end

猜你喜欢

转载自blog.csdn.net/qq_40893012/article/details/108853371