MRTKLIB 0.7.14
Modernized GNSS Positioning Library
Loading...
Searching...
No Matches
mrtk_obs.h
Go to the documentation of this file.
1/*------------------------------------------------------------------------------
2 * mrtk_obs.h : observation data type definitions and functions
3 *
4 * Copyright (C) 2026 H.SHIONO (MRTKLIB Project)
5 * Copyright (C) 2023-2025 Cabinet Office, Japan
6 * Copyright (C) 2024-2025 Lighthouse Technology & Consulting Co. Ltd.
7 * Copyright (C) 2023-2025 Japan Aerospace Exploration Agency
8 * Copyright (C) 2023-2025 TOSHIBA ELECTRONIC TECHNOLOGIES CORPORATION
9 * Copyright (C) 2015- Mitsubishi Electric Corp.
10 * Copyright (C) 2014 Geospatial Information Authority of Japan
11 * Copyright (C) 2014 T.SUZUKI
12 * Copyright (C) 2007-2023 T.TAKASU
13 *
14 * SPDX-License-Identifier: BSD-2-Clause
15 *----------------------------------------------------------------------------*/
16/**
17 * @file mrtk_obs.h
18 * @brief MRTKLIB Observation Module — Observation data types and utility
19 * functions.
20 *
21 * This header provides the fundamental GNSS observation data types
22 * (obsd_t, obs_t, snrmask_t) and observation utility functions extracted
23 * from rtklib.h/rtkcmn.c with zero algorithmic changes.
24 *
25 * @note Functions declared here are implemented in mrtk_obs.c.
26 */
27#ifndef MRTK_OBS_H
28#define MRTK_OBS_H
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
35#include "mrtklib/mrtk_time.h"
36
37/*============================================================================
38 * Observation Data Types
39 *===========================================================================*/
40
41/**
42 * @brief Observation data record.
43 */
44typedef struct {
45 gtime_t time; /* receiver sampling time (GPST) */
46 uint8_t sat, rcv; /* satellite/receiver number */
47 uint16_t SNR[NFREQ + NEXOBS]; /* signal strength (0.001 dBHz) */
48 uint8_t LLI[NFREQ + NEXOBS]; /* loss of lock indicator */
49 uint8_t code[NFREQ + NEXOBS]; /* code indicator (CODE_???) */
50 double L[NFREQ + NEXOBS]; /* observation data carrier-phase (cycle) */
51 double P[NFREQ + NEXOBS]; /* observation data pseudorange (m) */
52 float D[NFREQ + NEXOBS]; /* observation data doppler frequency (Hz) */
53 int facility; /* L6 facility ID (for dual-channel VRS) */
54} obsd_t;
55
56/**
57 * @brief Observation data collection.
58 */
59typedef struct {
60 int n, nmax; /* number of obervation data/allocated */
61 obsd_t* data; /* observation data records */
62} obs_t;
63
64/**
65 * @brief SNR mask type.
66 */
67typedef struct {
68 int ena[2]; /* enable flag {rover,base} */
69 double mask[NFREQ][9]; /* mask (dBHz) at 5,10,...85 deg */
70} snrmask_t;
71
72/*============================================================================
73 * Observation Code Functions
74 *===========================================================================*/
75
76/**
77 * @brief Convert obs code type string to obs code.
78 * @param[in] obs Obs code string ("1C","1P","1Y",...)
79 * @return Obs code (CODE_???)
80 */
81uint8_t obs2code(const char* obs);
82
83/**
84 * @brief Convert obs code to obs code string.
85 * @param[in] code Obs code (CODE_???)
86 * @return Obs code string ("1C","1P",...)
87 */
88char* code2obs(uint8_t code);
89
90/**
91 * @brief Extract frequency number from obs code.
92 * @param[in] code Obs code (CODE_???)
93 * @return Frequency number (1,2,5,...) (0: error)
94 */
95int code2freq_num(uint8_t code);
96
97/**
98 * @brief Convert system and obs code to frequency index (obsdef-based).
99 * @param[in] sys Satellite system (SYS_???)
100 * @param[in] code Obs code (CODE_???)
101 * @return Frequency index (-1: error)
102 */
103int code2freq_idx(int sys, uint8_t code);
104
105/**
106 * @brief Convert system and obs code to carrier frequency.
107 * @param[in] sys Satellite system (SYS_???)
108 * @param[in] code Obs code (CODE_???)
109 * @param[in] fcn Frequency channel number for GLONASS
110 * @return Carrier frequency (Hz) (0.0: error)
111 */
112double code2freq(int sys, uint8_t code, int fcn);
113
114/**
115 * @brief Get code priority for multiple codes in a frequency.
116 * @param[in] sys System (SYS_???)
117 * @param[in] code Obs code (CODE_???)
118 * @param[in] opt Code options (NULL:no option)
119 * @return Priority (15:highest-1:lowest, 0:error)
120 */
121int getcodepri(int sys, uint8_t code, const char* opt);
122
123/*============================================================================
124 * Observation Utility Functions
125 *===========================================================================*/
126
127/**
128 * @brief Sort observation data by time, receiver, and satellite.
129 * @param[in,out] obs Observation data to sort
130 * @return Number of epochs
131 */
132int sortobs(obs_t* obs);
133
134/**
135 * @brief Replace signal type in observation data.
136 * @param[in,out] obs Observation data record
137 * @param[in] idx Frequency index
138 * @param[in] f Frequency character
139 * @param[in,out] c Signal code string
140 */
141void signal_replace(obsd_t* obs, int idx, char f, char* c);
142
143/**
144 * @brief Screen data by time range and interval.
145 * @param[in] time Time to check (GPST)
146 * @param[in] ts Start time (GPST) (ts.time==0: no start limit)
147 * @param[in] te End time (GPST) (te.time==0: no end limit)
148 * @param[in] tint Time interval (s) (0.0: no interval limit)
149 * @return 1:on, 0:off
150 */
151int screent(gtime_t time, gtime_t ts, gtime_t te, double tint);
152
153/**
154 * @brief Test SNR mask.
155 * @param[in] base Rover or base-station (0:rover, 1:base station)
156 * @param[in] idx Frequency index (0:L1, 1:L2, 2:L3,...)
157 * @param[in] el Elevation angle (rad)
158 * @param[in] snr C/N0 (dBHz)
159 * @param[in] mask SNR mask
160 * @return Status (1:masked, 0:unmasked)
161 */
162int testsnr(int base, int idx, double el, double snr, const snrmask_t* mask);
163
164/**
165 * @brief Test elevation mask.
166 * @param[in] azel Azimuth/elevation angle {az,el} (rad)
167 * @param[in] elmask Elevation mask vector (360 x 1) (0.1 deg)
168 * @return Status (1:masked, 0:unmasked)
169 */
170int testelmask(const double* azel, const int16_t* elmask);
171
172/**
173 * @brief Free observation data memory.
174 * @param[in,out] obs Observation data
175 */
176void freeobs(obs_t* obs);
177
178/*============================================================================
179 * Signal Configuration Types
180 *===========================================================================*/
181
182/**
183 * @brief Signal specification: physical band + optional preferred code.
184 */
185typedef struct {
186 mrtk_band_t band; /* physical frequency band */
187 uint8_t preferred_code; /* preferred obs code (CODE_???, 0=auto) */
189
190/**
191 * @brief Per-constellation signal configuration.
192 */
193#define MRTK_MAXSIG_PER_SYS 7 /* max signals per constellation */
194#define MRTK_NSYS 7 /* number of constellations */
195
196typedef struct {
197 int nsig; /* number of configured signals */
198 mrtk_signal_t sig[MRTK_MAXSIG_PER_SYS]; /* configured signals */
200
201/*============================================================================
202 * Structured Signal Priority
203 *===========================================================================*/
204
205/** @brief Maximum number of codes in a priority list. */
206#define MRTK_MAX_SIG_PRIORITY 15
207
208/**
209 * @brief Signal priority entry: band + priority-ordered code list.
210 *
211 * codes[] lists observation codes in descending priority order.
212 * Remaining slots are zero-terminated (0 = no more codes).
213 */
214typedef struct {
215 mrtk_band_t band; /* physical frequency band */
216 uint8_t codes[MRTK_MAX_SIG_PRIORITY]; /* CODE_* in priority order, 0=end */
218
219/**
220 * @brief Convert RINEX frequency digit to physical band for a given system.
221 * @param[in] sys Satellite system (SYS_???)
222 * @param[in] rinex_freq_id RINEX frequency digit (1,2,3,4,5,6,7,8,9)
223 * @return Physical band (MRTK_BAND_UNKNOWN on error)
224 */
225mrtk_band_t mrtk_rinex_freq_to_band(int sys, int rinex_freq_id);
226
227/**
228 * @brief Get priority-ordered code list for a (system, band) pair.
229 * @param[in] sys Satellite system (SYS_???)
230 * @param[in] band Physical frequency band
231 * @return Pointer to priority-ordered code array (MRTK_MAX_SIG_PRIORITY elements),
232 * or NULL if no match
233 */
234const uint8_t* mrtk_get_signal_priority(int sys, mrtk_band_t band);
235
236/**
237 * @brief Toggle the claslib-compatible QZSS L1 signal priority (C>S>L>X>Z).
238 *
239 * Enable only for CLAS processing; upstream claslib and MADOCALIB disagree on
240 * the QZSS L1 order, so the claslib order must not affect other engines.
241 * @param[in] on 1: claslib order, 0: MRTK default order
242 */
244
245/**
246 * @brief Convert physical band to base carrier frequency (Hz).
247 * @param[in] band Physical frequency band
248 * @return Base carrier frequency (Hz), 0.0 on error.
249 * For GLONASS G1/G2, returns the base frequency without FDMA offset.
250 */
251double mrtk_band2freq_hz(mrtk_band_t band);
252
253/**
254 * @brief Convert physical band back to RINEX frequency number for a given system.
255 * @param[in] sys Satellite system (SYS_???)
256 * @param[in] band Physical frequency band
257 * @return RINEX frequency number (1,2,5,...) or 0 on error
258 */
259int mrtk_band_to_freq_num(int sys, mrtk_band_t band);
260
261/**
262 * @brief Parse a RINEX3-style signal string (e.g., "G1C") into components.
263 * @param[in] str Signal string (3 chars: {sys}{freq}{attr})
264 * @param[out] sys Satellite system (SYS_???)
265 * @param[out] band Physical frequency band
266 * @param[out] code Observation code (CODE_???)
267 * @return 0: success, -1: error
268 */
269int mrtk_parse_signal_str(const char* str, int* sys, mrtk_band_t* band, uint8_t* code);
270
271/**
272 * @brief Build per-constellation signal config from a signal string array.
273 * @param[in] sigs Array of signal strings (e.g., "G1C", "E5Q")
274 * @param[in] nsig Number of signal strings
275 * @param[out] cfg Per-constellation signal config array [MRTK_NSYS]
276 * @param[out] nf Derived number of frequencies (max signals per constellation)
277 * @return 0: success, -1: error
278 */
279int mrtk_sigcfg_from_signals(const char** sigs, int nsig, mrtk_sigcfg_t* cfg, int* nf);
280
281/**
282 * @brief Apply signal config to obsdef tables (bridge to existing system).
283 * @param[in] cfg Per-constellation signal config array [MRTK_NSYS]
284 * @return 0: success, -1: error
285 */
287
288/** @brief mrtk_sigcfg_freq_idx() sentinel: this constellation has no sigcfg
289 * entry, so the caller should fall back to its default (-R/-G/...)
290 * option logic. Distinct from -1 (drop) and from valid slot indices. */
291#define MRTK_SIGCFG_NOOPINION (-2)
292
293/**
294 * @brief Resolve the observation slot for a decoded (sys, code) from sigcfg.
295 *
296 * #189: lets `[positioning].signals` (sigcfg) drive raw-decoder code selection,
297 * so e.g. GLONASS L2C/A can be placed in the iono-free 2nd frequency without the
298 * legacy `-RL2C` receiver option. obsdef is band-level (cannot distinguish L2C
299 * from L2P); sigcfg carries the per-band preferred code, which this consults.
300 *
301 * @param[in] sys Satellite system (SYS_???)
302 * @param[in] code Observation code (CODE_???) just decoded
303 * @param[in] cfg Per-constellation signal config array [MRTK_NSYS]
304 * @param[in] nex Number of extra observation slots available (NEXOBS)
305 * @return main slot 0..NFREQ-1 (code selected for its band); -1 to drop (code
306 * not selected, or its band not configured for this system);
307 * MRTK_SIGCFG_NOOPINION if this system has no sigcfg entry.
308 */
309int mrtk_sigcfg_freq_idx(int sys, uint8_t code, const mrtk_sigcfg_t* cfg, int nex);
310
311#ifdef __cplusplus
312}
313#endif
314
315#endif /* MRTK_OBS_H */
MRTKLIB Foundation — Common types, standard includes, and system constants (MAXSAT,...
mrtk_band_t
const uint8_t * mrtk_get_signal_priority(int sys, mrtk_band_t band)
Get priority-ordered code list for a (system, band) pair.
Definition mrtk_obs.c:914
int sortobs(obs_t *obs)
Sort observation data by time, receiver, and satellite.
Definition mrtk_obs.c:350
void mrtk_use_claslib_qzs_l1_priority(int on)
Toggle the claslib-compatible QZSS L1 signal priority (C>S>L>X>Z).
Definition mrtk_obs.c:906
int getcodepri(int sys, uint8_t code, const char *opt)
Get code priority for multiple codes in a frequency.
Definition mrtk_obs.c:276
int code2freq_num(uint8_t code)
Extract frequency number from obs code.
Definition mrtk_obs.c:201
int mrtk_sigcfg_from_signals(const char **sigs, int nsig, mrtk_sigcfg_t *cfg, int *nf)
Build per-constellation signal config from a signal string array.
Definition mrtk_obs.c:1128
int mrtk_parse_signal_str(const char *str, int *sys, mrtk_band_t *band, uint8_t *code)
Parse a RINEX3-style signal string (e.g., "G1C") into components.
Definition mrtk_obs.c:1039
int mrtk_sigcfg_freq_idx(int sys, uint8_t code, const mrtk_sigcfg_t *cfg, int nex)
Resolve the observation slot for a decoded (sys, code) from sigcfg.
Definition mrtk_obs.c:1224
double code2freq(int sys, uint8_t code, int fcn)
Convert system and obs code to carrier frequency.
Definition mrtk_obs.c:236
uint8_t obs2code(const char *obs)
Convert obs code type string to obs code.
Definition mrtk_obs.c:173
int mrtk_band_to_freq_num(int sys, mrtk_band_t band)
Convert physical band back to RINEX frequency number for a given system.
Definition mrtk_obs.c:938
#define MRTK_MAXSIG_PER_SYS
Per-constellation signal configuration.
Definition mrtk_obs.h:193
char * code2obs(uint8_t code)
Convert obs code to obs code string.
Definition mrtk_obs.c:190
int testelmask(const double *azel, const int16_t *elmask)
Test elevation mask.
Definition mrtk_obs.c:160
double mrtk_band2freq_hz(mrtk_band_t band)
Convert physical band to base carrier frequency (Hz).
Definition mrtk_obs.c:766
#define MRTK_MAX_SIG_PRIORITY
Maximum number of codes in a priority list.
Definition mrtk_obs.h:206
void freeobs(obs_t *obs)
Free observation data memory.
Definition mrtk_obs.c:433
void signal_replace(obsd_t *obs, int idx, char f, char *c)
Replace signal type in observation data.
Definition mrtk_obs.c:388
int code2freq_idx(int sys, uint8_t code)
Convert system and obs code to frequency index (obsdef-based).
Definition mrtk_obs.c:225
int testsnr(int base, int idx, double el, double snr, const snrmask_t *mask)
Test SNR mask.
Definition mrtk_obs.c:132
int mrtk_sigcfg_to_obsdef(const mrtk_sigcfg_t *cfg)
Apply signal config to obsdef tables (bridge to existing system).
Definition mrtk_obs.c:1187
int screent(gtime_t time, gtime_t ts, gtime_t te, double tint)
Screen data by time range and interval.
Definition mrtk_obs.c:424
mrtk_band_t mrtk_rinex_freq_to_band(int sys, int rinex_freq_id)
Convert RINEX frequency digit to physical band for a given system.
Definition mrtk_obs.c:806
MRTKLIB Time Module — GNSS time types and conversion functions.
GNSS time representation.
Definition mrtk_time.h:49
Signal priority entry: band + priority-ordered code list.
Definition mrtk_obs.h:214
uint8_t codes[15]
Definition mrtk_obs.h:216
mrtk_band_t band
Definition mrtk_obs.h:215
mrtk_signal_t sig[7]
Definition mrtk_obs.h:198
Signal specification: physical band + optional preferred code.
Definition mrtk_obs.h:185
uint8_t preferred_code
Definition mrtk_obs.h:187
mrtk_band_t band
Definition mrtk_obs.h:186
Observation data collection.
Definition mrtk_obs.h:59
obsd_t * data
Definition mrtk_obs.h:61
int nmax
Definition mrtk_obs.h:60
int n
Definition mrtk_obs.h:60
Observation data record.
Definition mrtk_obs.h:44
float D[5+5]
Definition mrtk_obs.h:52
gtime_t time
Definition mrtk_obs.h:45
uint8_t sat
Definition mrtk_obs.h:46
uint8_t LLI[5+5]
Definition mrtk_obs.h:48
double L[5+5]
Definition mrtk_obs.h:50
uint8_t rcv
Definition mrtk_obs.h:46
double P[5+5]
Definition mrtk_obs.h:51
uint16_t SNR[5+5]
Definition mrtk_obs.h:47
uint8_t code[5+5]
Definition mrtk_obs.h:49
int facility
Definition mrtk_obs.h:53
SNR mask type.
Definition mrtk_obs.h:67
int ena[2]
Definition mrtk_obs.h:68
double mask[5][9]
Definition mrtk_obs.h:69