GNSS-SDR  0.0.19
An Open Source GNSS Software Defined Receiver
GPS_L1_CA.h
Go to the documentation of this file.
1 /*!
2  * \file GPS_L1_CA.h
3  * \brief Defines system parameters for GPS L1 C/A signal and NAV data
4  * \author Javier Arribas, 2011. jarribas(at)cttc.es
5  *
6  * -----------------------------------------------------------------------------
7  *
8  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
9  * This file is part of GNSS-SDR.
10  *
11  * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
12  * SPDX-License-Identifier: GPL-3.0-or-later
13  *
14  * -----------------------------------------------------------------------------
15  */
16 
17 
18 #ifndef GNSS_SDR_GPS_L1_CA_H
19 #define GNSS_SDR_GPS_L1_CA_H
20 
21 #include "MATH_CONSTANTS.h"
22 #include "gnss_frequencies.h"
23 #include <cstdint>
24 #include <utility> // std::pair
25 #include <vector>
26 
27 /** \addtogroup Core
28  * \{ */
29 /** \addtogroup System_Parameters
30  * \{ */
31 
32 
33 // carrier and code frequencies
34 constexpr double GPS_L1_FREQ_HZ = FREQ1; //!< L1 [Hz]
35 constexpr double GPS_L1_CA_CODE_RATE_CPS = 1.023e6; //!< GPS L1 C/A code rate [chips/s]
36 constexpr double GPS_L1_CA_CODE_LENGTH_CHIPS = 1023.0; //!< GPS L1 C/A code length [chips]
37 constexpr double GPS_L1_CA_CODE_PERIOD_S = 0.001; //!< GPS L1 C/A code period [seconds]
38 constexpr double GPS_L1_CA_CHIP_PERIOD_S = 9.7752e-07; //!< GPS L1 C/A chip period [seconds]
39 constexpr uint32_t GPS_L1_CA_CODE_PERIOD_MS = 1U; //!< GPS L1 C/A code period [ms]
40 constexpr uint32_t GPS_L1_CA_BIT_PERIOD_MS = 20U; //!< GPS L1 C/A bit period [ms]
41 
42 /*!
43  * \brief Maximum Time-Of-Arrival (TOA) difference between satellites for a receiver operated on Earth surface is 20 ms
44  *
45  * According to the GPS orbit model described in [1] Pag. 32.
46  * It should be taken into account to set the buffer size for the PRN start timestamp in the pseudoranges block.
47  * [1] J. Bao-Yen Tsui, Fundamentals of Global Positioning System Receivers. A Software Approach, John Wiley & Sons,
48  * Inc., Hoboken, NJ, 2nd edition, 2005.
49  */
50 constexpr double MAX_TOA_DELAY_MS = 20.0;
51 
52 // optimum parameters
53 constexpr uint32_t GPS_L1_CA_OPT_ACQ_FS_SPS = 2000000; //!< Sampling frequency that maximizes the acquisition SNR while using a non-multiple of chip rate
54 
55 // OBSERVABLE HISTORY DEEP FOR INTERPOLATION
56 constexpr int32_t GPS_L1_CA_HISTORY_DEEP = 100;
57 
58 // NAVIGATION MESSAGE DEMODULATION AND DECODING
59 constexpr double GPS_CA_PREAMBLE_DURATION_S = 0.160;
60 constexpr int32_t GPS_CA_PREAMBLE_LENGTH_BITS = 8;
61 constexpr int32_t GPS_CA_PREAMBLE_LENGTH_SYMBOLS = 160;
62 constexpr int32_t GPS_CA_PREAMBLE_DURATION_MS = 160;
63 constexpr int32_t GPS_CA_TELEMETRY_RATE_BITS_SECOND = 50; //!< NAV message bit rate [bits/s]
64 constexpr int32_t GPS_CA_TELEMETRY_SYMBOLS_PER_BIT = 20;
65 constexpr int32_t GPS_CA_TELEMETRY_RATE_SYMBOLS_SECOND = GPS_CA_TELEMETRY_RATE_BITS_SECOND * GPS_CA_TELEMETRY_SYMBOLS_PER_BIT; //!< NAV message bit rate [symbols/s]
66 constexpr int32_t GPS_WORD_LENGTH = 4; //!< CRC + GPS WORD (-2 -1 0 ... 29) Bits = 4 bytes
67 constexpr int32_t GPS_SUBFRAME_LENGTH = 40; //!< GPS_WORD_LENGTH x 10 = 40 bytes
68 constexpr int32_t GPS_SUBFRAME_BITS = 300; //!< Number of bits per subframe in the NAV message [bits]
69 constexpr int32_t GPS_SUBFRAME_SECONDS = 6; //!< Subframe duration [seconds]
70 constexpr int32_t GPS_SUBFRAME_MS = 6000; //!< Subframe duration [seconds]
71 constexpr int32_t GPS_WORD_BITS = 30; //!< Number of bits per word in the NAV message [bits]
72 constexpr char GPS_CA_PREAMBLE[9] = "10001011";
73 constexpr char GPS_CA_PREAMBLE_SYMBOLS_STR[161] = "1111111111111111111100000000000000000000000000000000000000000000000000000000000011111111111111111111000000000000000000001111111111111111111111111111111111111111";
74 
75 // GPS NAVIGATION MESSAGE STRUCTURE
76 // NAVIGATION MESSAGE FIELDS POSITIONS (from IS-GPS-200M Appendix II)
77 
78 // SUBFRAME 1-5 (TLM and HOW)
79 
80 const std::vector<std::pair<int32_t, int32_t>> TOW({{31, 17}});
81 const std::vector<std::pair<int32_t, int32_t>> INTEGRITY_STATUS_FLAG({{23, 1}});
82 const std::vector<std::pair<int32_t, int32_t>> ALERT_FLAG({{48, 1}});
83 const std::vector<std::pair<int32_t, int32_t>> ANTI_SPOOFING_FLAG({{49, 1}});
84 const std::vector<std::pair<int32_t, int32_t>> SUBFRAME_ID({{50, 3}});
85 
86 // SUBFRAME 1
87 const std::vector<std::pair<int32_t, int32_t>> GPS_WEEK({{61, 10}});
88 const std::vector<std::pair<int32_t, int32_t>> CA_OR_P_ON_L2({{71, 2}}); //*
89 const std::vector<std::pair<int32_t, int32_t>> SV_ACCURACY({{73, 4}});
90 const std::vector<std::pair<int32_t, int32_t>> SV_HEALTH({{77, 6}});
91 const std::vector<std::pair<int32_t, int32_t>> L2_P_DATA_FLAG({{91, 1}});
92 const std::vector<std::pair<int32_t, int32_t>> T_GD({{197, 8}});
93 constexpr double T_GD_LSB = TWO_N31;
94 const std::vector<std::pair<int32_t, int32_t>> IODC({{83, 2}, {211, 8}});
95 const std::vector<std::pair<int32_t, int32_t>> T_OC({{219, 16}});
96 constexpr int32_t T_OC_LSB = static_cast<int32_t>(TWO_P4);
97 const std::vector<std::pair<int32_t, int32_t>> A_F2({{241, 8}});
98 constexpr double A_F2_LSB = TWO_N55;
99 const std::vector<std::pair<int32_t, int32_t>> A_F1({{249, 16}});
100 constexpr double A_F1_LSB = TWO_N43;
101 const std::vector<std::pair<int32_t, int32_t>> A_F0({{271, 22}});
102 constexpr double A_F0_LSB = TWO_N31;
103 
104 // SUBFRAME 2
105 const std::vector<std::pair<int32_t, int32_t>> IODE_SF2({{61, 8}});
106 const std::vector<std::pair<int32_t, int32_t>> C_RS({{69, 16}});
107 constexpr double C_RS_LSB = TWO_N5;
108 const std::vector<std::pair<int32_t, int32_t>> DELTA_N({{91, 16}});
109 constexpr double DELTA_N_LSB = PI_TWO_N43;
110 const std::vector<std::pair<int32_t, int32_t>> M_0({{107, 8}, {121, 24}});
111 constexpr double M_0_LSB = PI_TWO_N31;
112 const std::vector<std::pair<int32_t, int32_t>> C_UC({{151, 16}});
113 constexpr double C_UC_LSB = TWO_N29;
114 const std::vector<std::pair<int32_t, int32_t>> ECCENTRICITY({{167, 8}, {181, 24}});
115 constexpr double ECCENTRICITY_LSB = TWO_N33;
116 const std::vector<std::pair<int32_t, int32_t>> C_US({{211, 16}});
117 constexpr double C_US_LSB = TWO_N29;
118 const std::vector<std::pair<int32_t, int32_t>> SQRT_A({{227, 8}, {241, 24}});
119 constexpr double SQRT_A_LSB = TWO_N19;
120 const std::vector<std::pair<int32_t, int32_t>> T_OE({{271, 16}});
121 constexpr int32_t T_OE_LSB = static_cast<int32_t>(TWO_P4);
122 const std::vector<std::pair<int32_t, int32_t>> FIT_INTERVAL_FLAG({{271, 1}});
123 const std::vector<std::pair<int32_t, int32_t>> AODO({{272, 5}});
124 constexpr int32_t AODO_LSB = 900;
125 
126 // SUBFRAME 3
127 const std::vector<std::pair<int32_t, int32_t>> C_IC({{61, 16}});
128 constexpr double C_IC_LSB = TWO_N29;
129 const std::vector<std::pair<int32_t, int32_t>> OMEGA_0({{77, 8}, {91, 24}});
130 constexpr double OMEGA_0_LSB = PI_TWO_N31;
131 const std::vector<std::pair<int32_t, int32_t>> C_IS({{121, 16}});
132 constexpr double C_IS_LSB = TWO_N29;
133 const std::vector<std::pair<int32_t, int32_t>> I_0({{137, 8}, {151, 24}});
134 constexpr double I_0_LSB = PI_TWO_N31;
135 const std::vector<std::pair<int32_t, int32_t>> C_RC({{181, 16}});
136 constexpr double C_RC_LSB = TWO_N5;
137 const std::vector<std::pair<int32_t, int32_t>> OMEGA({{197, 8}, {211, 24}});
138 constexpr double OMEGA_LSB = PI_TWO_N31;
139 const std::vector<std::pair<int32_t, int32_t>> OMEGA_DOT({{241, 24}});
140 constexpr double OMEGA_DOT_LSB = PI_TWO_N43;
141 const std::vector<std::pair<int32_t, int32_t>> IODE_SF3({{271, 8}});
142 const std::vector<std::pair<int32_t, int32_t>> I_DOT({{279, 14}});
143 constexpr double I_DOT_LSB = PI_TWO_N43;
144 
145 // SUBFRAME 4-5
146 const std::vector<std::pair<int32_t, int32_t>> SV_DATA_ID({{61, 2}});
147 const std::vector<std::pair<int32_t, int32_t>> SV_PAGE({{63, 6}});
148 
149 // SUBFRAME 4
150 //! \todo read all pages of subframe 4
151 // Page 18 - Ionospheric and UTC data
152 const std::vector<std::pair<int32_t, int32_t>> ALPHA_0({{69, 8}});
153 constexpr double ALPHA_0_LSB = TWO_N30;
154 const std::vector<std::pair<int32_t, int32_t>> ALPHA_1({{77, 8}});
155 constexpr double ALPHA_1_LSB = TWO_N27;
156 const std::vector<std::pair<int32_t, int32_t>> ALPHA_2({{91, 8}});
157 constexpr double ALPHA_2_LSB = TWO_N24;
158 const std::vector<std::pair<int32_t, int32_t>> ALPHA_3({{99, 8}});
159 constexpr double ALPHA_3_LSB = TWO_N24;
160 const std::vector<std::pair<int32_t, int32_t>> BETA_0({{107, 8}});
161 constexpr double BETA_0_LSB = TWO_P11;
162 const std::vector<std::pair<int32_t, int32_t>> BETA_1({{121, 8}});
163 constexpr double BETA_1_LSB = TWO_P14;
164 const std::vector<std::pair<int32_t, int32_t>> BETA_2({{129, 8}});
165 constexpr double BETA_2_LSB = TWO_P16;
166 const std::vector<std::pair<int32_t, int32_t>> BETA_3({{137, 8}});
167 constexpr double BETA_3_LSB = TWO_P16;
168 const std::vector<std::pair<int32_t, int32_t>> A_1({{151, 24}});
169 constexpr double A_1_LSB = TWO_N50;
170 const std::vector<std::pair<int32_t, int32_t>> A_0({{181, 24}, {211, 8}});
171 constexpr double A_0_LSB = TWO_N30;
172 const std::vector<std::pair<int32_t, int32_t>> T_OT({{219, 8}});
173 constexpr double T_OT_LSB = TWO_P12;
174 const std::vector<std::pair<int32_t, int32_t>> WN_T({{227, 8}});
175 constexpr double WN_T_LSB = 1;
176 const std::vector<std::pair<int32_t, int32_t>> DELTAT_LS({{241, 8}});
177 constexpr double DELTAT_LS_LSB = 1;
178 const std::vector<std::pair<int32_t, int32_t>> WN_LSF({{249, 8}});
179 constexpr double WN_LSF_LSB = 1;
180 const std::vector<std::pair<int32_t, int32_t>> DN({{257, 8}});
181 constexpr double DN_LSB = 1;
182 const std::vector<std::pair<int32_t, int32_t>> DELTAT_LSF({{271, 8}});
183 constexpr double DELTAT_LSF_LSB = 1;
184 
185 // Page 25 - Antispoofing, SV config and SV health (PRN 25 -32)
186 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV25({{229, 6}});
187 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV26({{241, 6}});
188 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV27({{247, 6}});
189 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV28({{253, 6}});
190 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV29({{259, 6}});
191 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV30({{271, 6}});
192 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV31({{277, 6}});
193 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV32({{283, 6}});
194 
195 
196 // SUBFRAME 5
197 //! \todo read all pages of subframe 5
198 
199 // page 25 - Health (PRN 1 - 24)
200 const std::vector<std::pair<int32_t, int32_t>> T_OA({{69, 8}});
201 constexpr int32_t T_OA_LSB = TWO_P12;
202 const std::vector<std::pair<int32_t, int32_t>> WN_A({{77, 8}});
203 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV1({{91, 6}});
204 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV2({{97, 6}});
205 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV3({{103, 6}});
206 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV4({{109, 6}});
207 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV5({{121, 6}});
208 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV6({{127, 6}});
209 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV7({{133, 6}});
210 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV8({{139, 6}});
211 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV9({{151, 6}});
212 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV10({{157, 6}});
213 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV11({{163, 6}});
214 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV12({{169, 6}});
215 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV13({{181, 6}});
216 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV14({{187, 6}});
217 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV15({{193, 6}});
218 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV16({{199, 6}});
219 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV17({{211, 6}});
220 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV18({{217, 6}});
221 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV19({{223, 6}});
222 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV20({{229, 6}});
223 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV21({{241, 6}});
224 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV22({{247, 6}});
225 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV23({{253, 6}});
226 const std::vector<std::pair<int32_t, int32_t>> HEALTH_SV24({{259, 6}});
227 
228 
229 /** \} */
230 /** \} */
231 #endif // GNSS_SDR_GPS_L1_CA_H
constexpr double TWO_N31
2^-31
constexpr double FREQ1
L1/E1 frequency (Hz)
constexpr double GPS_L1_CA_CODE_PERIOD_S
GPS L1 C/A code period [seconds].
Definition: GPS_L1_CA.h:37
constexpr double GPS_L1_CA_CODE_RATE_CPS
GPS L1 C/A code rate [chips/s].
Definition: GPS_L1_CA.h:35
const std::vector< std::pair< int32_t, int32_t > > ALPHA_0({{69, 8}})
constexpr double TWO_N43
2^-43
constexpr double TWO_N5
2^-5
constexpr int32_t GPS_SUBFRAME_BITS
Number of bits per subframe in the NAV message [bits].
Definition: GPS_L1_CA.h:68
constexpr double TWO_N50
2^-50
constexpr double GPS_L1_FREQ_HZ
L1 [Hz].
Definition: GPS_L1_CA.h:34
constexpr double TWO_N33
2^-33
constexpr double TWO_P12
2^12
constexpr double TWO_P4
2^4
constexpr double MAX_TOA_DELAY_MS
Maximum Time-Of-Arrival (TOA) difference between satellites for a receiver operated on Earth surface ...
Definition: GPS_L1_CA.h:50
constexpr int32_t GPS_SUBFRAME_LENGTH
GPS_WORD_LENGTH x 10 = 40 bytes.
Definition: GPS_L1_CA.h:67
constexpr double PI_TWO_N43
Pi*2^-43.
constexpr double TWO_P14
2^14
constexpr double PI_TWO_N31
Pi*2^-31.
Defines useful mathematical constants and their scaled versions.
constexpr int32_t GPS_SUBFRAME_MS
Subframe duration [seconds].
Definition: GPS_L1_CA.h:70
const std::vector< std::pair< int32_t, int32_t > > T_OA({{69, 8}})
constexpr double GPS_L1_CA_CODE_LENGTH_CHIPS
GPS L1 C/A code length [chips].
Definition: GPS_L1_CA.h:36
constexpr double TWO_N30
2^-30
constexpr int32_t GPS_CA_TELEMETRY_RATE_SYMBOLS_SECOND
NAV message bit rate [symbols/s].
Definition: GPS_L1_CA.h:65
constexpr uint32_t GPS_L1_CA_OPT_ACQ_FS_SPS
Sampling frequency that maximizes the acquisition SNR while using a non-multiple of chip rate...
Definition: GPS_L1_CA.h:53
constexpr double TWO_P16
2^16
GNSS Frequencies.
constexpr double TWO_N29
2^-29
constexpr double TWO_N24
2^-24
constexpr double TWO_P11
2^11
constexpr uint32_t GPS_L1_CA_CODE_PERIOD_MS
GPS L1 C/A code period [ms].
Definition: GPS_L1_CA.h:39
constexpr double TWO_N19
2^-19
constexpr int32_t GPS_WORD_LENGTH
CRC + GPS WORD (-2 -1 0 ... 29) Bits = 4 bytes.
Definition: GPS_L1_CA.h:66
constexpr int32_t GPS_CA_TELEMETRY_RATE_BITS_SECOND
NAV message bit rate [bits/s].
Definition: GPS_L1_CA.h:63
constexpr uint32_t GPS_L1_CA_BIT_PERIOD_MS
GPS L1 C/A bit period [ms].
Definition: GPS_L1_CA.h:40
constexpr int32_t GPS_WORD_BITS
Number of bits per word in the NAV message [bits].
Definition: GPS_L1_CA.h:71
constexpr double GPS_L1_CA_CHIP_PERIOD_S
GPS L1 C/A chip period [seconds].
Definition: GPS_L1_CA.h:38
constexpr double TWO_N27
2^-27
constexpr double TWO_N55
2^-55
constexpr int32_t GPS_SUBFRAME_SECONDS
Subframe duration [seconds].
Definition: GPS_L1_CA.h:69