91 lines
3.4 KiB
Matlab
91 lines
3.4 KiB
Matlab
function CAcode = generateCAcode(PRN)
|
|
% generateCAcode.m generates one of the 32 GPS satellite C/A codes.
|
|
%
|
|
% CAcode = generateCAcode(PRN)
|
|
%
|
|
% Inputs:
|
|
% PRN - PRN number of the sequence.
|
|
%
|
|
% Outputs:
|
|
% CAcode - a vector containing the desired C/A code sequence
|
|
% (chips).
|
|
|
|
%--------------------------------------------------------------------------
|
|
% SoftGNSS v3.0
|
|
%
|
|
% Copyright (C) Darius Plausinaitis
|
|
% Written by Darius Plausinaitis
|
|
% Based on Dennis M. Akos, Peter Rinder and Nicolaj Bertelsen
|
|
%--------------------------------------------------------------------------
|
|
%This program is free software; you can redistribute it and/or
|
|
%modify it under the terms of the GNU General Public License
|
|
%as published by the Free Software Foundation; either version 2
|
|
%of the License, or (at your option) any later version.
|
|
%
|
|
%This program is distributed in the hope that it will be useful,
|
|
%but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
%GNU General Public License for more details.
|
|
%
|
|
%You should have received a copy of the GNU General Public License
|
|
%along with this program; if not, write to the Free Software
|
|
%Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
%USA.
|
|
%--------------------------------------------------------------------------
|
|
|
|
%CVS record:
|
|
%$Id: generateCAcode.m,v 1.1.2.5 2006/08/14 11:38:22 dpl Exp $
|
|
|
|
%--- Make the code shift array. The shift depends on the PRN number -------
|
|
% The g2s vector holds the appropriate shift of the g2 code to generate
|
|
% the C/A code (ex. for SV#19 - use a G2 shift of g2s(19) = 471)
|
|
g2s = [ 5, 6, 7, 8, 17, 18, 139, 140, 141, 251, ...
|
|
252, 254, 255, 256, 257, 258, 469, 470, 471, 472, ...
|
|
473, 474, 509, 512, 513, 514, 515, 516, 859, 860, ...
|
|
861, 862 ... end of shifts for GPS satellites
|
|
... Shifts for the ground GPS transmitter are not included
|
|
... Shifts for EGNOS and WAAS satellites (true_PRN = PRN + 87)
|
|
145, 175, 52, 21, 237, 235, 886, 657, ...
|
|
634, 762, 355, 1012, 176, 603, 130, 359, 595, 68, ...
|
|
386];
|
|
|
|
%--- Pick right shift for the given PRN number ----------------------------
|
|
g2shift = g2s(PRN);
|
|
|
|
%--- Generate G1 code -----------------------------------------------------
|
|
|
|
%--- Initialize g1 output to speed up the function ---
|
|
g1 = zeros(1, 1023);
|
|
%--- Load shift register ---
|
|
reg = -1*ones(1, 10);
|
|
|
|
%--- Generate all G1 signal chips based on the G1 feedback polynomial -----
|
|
for i=1:1023
|
|
g1(i) = reg(10);
|
|
saveBit = reg(3)*reg(10);
|
|
reg(2:10) = reg(1:9);
|
|
reg(1) = saveBit;
|
|
end
|
|
|
|
%--- Generate G2 code -----------------------------------------------------
|
|
|
|
%--- Initialize g2 output to speed up the function ---
|
|
g2 = zeros(1, 1023);
|
|
%--- Load shift register ---
|
|
reg = -1*ones(1, 10);
|
|
|
|
%--- Generate all G2 signal chips based on the G2 feedback polynomial -----
|
|
for i=1:1023
|
|
g2(i) = reg(10);
|
|
saveBit = reg(2)*reg(3)*reg(6)*reg(8)*reg(9)*reg(10);
|
|
reg(2:10) = reg(1:9);
|
|
reg(1) = saveBit;
|
|
end
|
|
|
|
%--- Shift G2 code --------------------------------------------------------
|
|
%The idea: g2 = concatenate[ g2_right_part, g2_left_part ];
|
|
g2 = [g2(1023-g2shift+1 : 1023), g2(1 : 1023-g2shift)];
|
|
|
|
%--- Form single sample C/A code by multiplying G1 and G2 -----------------
|
|
CAcode = -(g1 .* g2);
|