gnss-js 0.1.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +171 -5
  3. package/dist/analysis.cjs +1488 -0
  4. package/dist/analysis.d.cts +211 -0
  5. package/dist/analysis.d.ts +211 -0
  6. package/dist/analysis.js +14 -0
  7. package/dist/antex.cjs +239 -0
  8. package/dist/antex.d.cts +77 -0
  9. package/dist/antex.d.ts +77 -0
  10. package/dist/antex.js +8 -0
  11. package/dist/chunk-37QNKGTC.js +65 -0
  12. package/dist/chunk-4YN353Q7.js +440 -0
  13. package/dist/chunk-5CMSYIYM.js +214 -0
  14. package/dist/chunk-5S5MONFK.js +0 -0
  15. package/dist/chunk-6FAL6P4G.js +12 -0
  16. package/dist/chunk-7NOFXKET.js +433 -0
  17. package/dist/chunk-BJHTBYNG.js +154 -0
  18. package/dist/chunk-HBLU2EJ4.js +802 -0
  19. package/dist/chunk-HKN3PUGN.js +800 -0
  20. package/dist/chunk-LEEU5OIO.js +75 -0
  21. package/dist/chunk-LWNTWBHB.js +268 -0
  22. package/dist/chunk-MIIM4LDY.js +239 -0
  23. package/dist/chunk-SO3POWWR.js +502 -0
  24. package/dist/chunk-W4YMQKWH.js +622 -0
  25. package/dist/chunk-WP2JFDLA.js +1475 -0
  26. package/dist/chunk-YDMYO3YK.js +220 -0
  27. package/dist/constants.cjs +423 -0
  28. package/dist/constants.d.cts +14 -0
  29. package/dist/constants.d.ts +14 -0
  30. package/dist/constants.js +103 -0
  31. package/dist/coordinates.cjs +337 -0
  32. package/dist/coordinates.d.cts +81 -0
  33. package/dist/coordinates.d.ts +81 -0
  34. package/dist/coordinates.js +39 -0
  35. package/dist/ecef-CF0uAysr.d.cts +40 -0
  36. package/dist/ecef-CF0uAysr.d.ts +40 -0
  37. package/dist/ephemeris-C10stHhM.d.cts +114 -0
  38. package/dist/ephemeris-C10stHhM.d.ts +114 -0
  39. package/dist/gnss-BT6ulR17.d.cts +56 -0
  40. package/dist/gnss-C-tgoYNa.d.ts +56 -0
  41. package/dist/index.cjs +5940 -78
  42. package/dist/index.d.cts +17 -96
  43. package/dist/index.d.ts +17 -96
  44. package/dist/index.js +352 -415
  45. package/dist/nav-BAI1a9vK.d.cts +108 -0
  46. package/dist/nav-BAI1a9vK.d.ts +108 -0
  47. package/dist/nmea.cjs +247 -0
  48. package/dist/nmea.d.cts +37 -0
  49. package/dist/nmea.d.ts +37 -0
  50. package/dist/nmea.js +12 -0
  51. package/dist/ntrip.cjs +180 -0
  52. package/dist/ntrip.d.cts +98 -0
  53. package/dist/ntrip.d.ts +98 -0
  54. package/dist/ntrip.js +10 -0
  55. package/dist/orbit.cjs +511 -0
  56. package/dist/orbit.d.cts +117 -0
  57. package/dist/orbit.d.ts +117 -0
  58. package/dist/orbit.js +29 -0
  59. package/dist/parser-JPjjFgeP.d.cts +73 -0
  60. package/dist/parser-JPjjFgeP.d.ts +73 -0
  61. package/dist/rinex.cjs +1469 -0
  62. package/dist/rinex.d.cts +116 -0
  63. package/dist/rinex.d.ts +116 -0
  64. package/dist/rinex.js +37 -0
  65. package/dist/rtcm3.cjs +1512 -0
  66. package/dist/rtcm3.d.cts +143 -0
  67. package/dist/rtcm3.d.ts +143 -0
  68. package/dist/rtcm3.js +31 -0
  69. package/dist/signals.cjs +858 -0
  70. package/dist/signals.d.cts +93 -0
  71. package/dist/signals.d.ts +93 -0
  72. package/dist/signals.js +70 -0
  73. package/dist/time-DnI1VpE8.d.cts +33 -0
  74. package/dist/time-DnI1VpE8.d.ts +33 -0
  75. package/dist/time.cjs +585 -0
  76. package/dist/time.d.cts +307 -0
  77. package/dist/time.d.ts +307 -0
  78. package/dist/time.js +154 -0
  79. package/package.json +112 -14
  80. package/.prettierrc +0 -5
  81. package/jest.config.ts +0 -9
  82. package/test/functions.test.ts +0 -63
  83. package/test/gnss-scales.test.ts +0 -95
  84. package/test/julian.test.ts +0 -145
  85. package/test/rinex.test.ts +0 -11
  86. package/test/test.ts +0 -10
  87. package/test/utc.test.ts +0 -25
@@ -0,0 +1,800 @@
1
+ // src/signals/definitions.ts
2
+ var FREQ_GPS_L1 = 1575.42;
3
+ var FREQ_GPS_L2 = 1227.6;
4
+ var FREQ_GPS_L5 = 1176.45;
5
+ var FREQ_GLO_L1 = 1602;
6
+ var FREQ_GLO_L2 = 1246;
7
+ var DELTA_GLO_L1 = 0.5625;
8
+ var DELTA_GLO_L2 = 0.4375;
9
+ var FREQ_GLO_L1OC = 1600.995;
10
+ var FREQ_GLO_L2OC = 1248.06;
11
+ var FREQ_GLO_L3OC = 1202.025;
12
+ var FREQ_GAL_E1 = 1575.42;
13
+ var FREQ_GAL_E5 = 1191.795;
14
+ var FREQ_GAL_E5a = 1176.45;
15
+ var FREQ_GAL_E5b = 1207.14;
16
+ var FREQ_GAL_E6 = 1278.75;
17
+ var FREQ_BDS_B1I = 1561.098;
18
+ var FREQ_BDS_B2I = 1207.14;
19
+ var FREQ_BDS_B3I = 1268.52;
20
+ var FREQ_BDS_B1A = 1575.42;
21
+ var FREQ_BDS_B1C = 1575.42;
22
+ var FREQ_BDS_B3A = 1268.52;
23
+ var FREQ_QZS_L1 = 1575.42;
24
+ var FREQ_QZS_L2 = 1227.6;
25
+ var FREQ_QZS_L5 = 1176.45;
26
+ var FREQ_QZS_L6 = 1278.75;
27
+ var FREQ_NAVIC_L5 = 1176.45;
28
+ var GPS_COLOR = "#4ade80";
29
+ var GPS_M_COLOR = "#ef4444";
30
+ var GPS_P_COLOR = "#dbc51f";
31
+ var GPS_CA_COLOR = "#06b6d4";
32
+ var GLO_P_COLOR = "#ef4444";
33
+ var GLO_CA_COLOR = "#22c55e";
34
+ var GLO_OC_COLOR = "#22c55e";
35
+ var GLO_SC_COLOR = "#ef4444";
36
+ var GAL_OS_COLOR = "#22c55e";
37
+ var GAL_PRS_COLOR = "#ef4444";
38
+ var GAL_E5_COLOR = "#3399ff";
39
+ var GAL_E5_Q_COLOR = "#2879c9";
40
+ var BDS2_I_COLOR = "#22c55e";
41
+ var BDS2_Q_COLOR = "#ef4444";
42
+ var BDS3_AUTH_COLOR = "#ef4444";
43
+ var BDS3_OS_COLOR = "#22c55e";
44
+ var BDS3_E5_COLOR = "#3399ff";
45
+ var BDS3_E5_Q_COLOR = "#2879c9";
46
+ var QZS_COLOR = "#22c55e";
47
+ var QZS_S_COLOR = "#3399ff";
48
+ var QZS_Q_COLOR = "#2d8124";
49
+ var QZS_SQ_COLOR = "#2879c9";
50
+ var NAVIC_SPS_COLOR = "#22c55e";
51
+ var NAVIC_RS_COLOR = "#ef4444";
52
+ var CONSTELLATIONS = [
53
+ {
54
+ key: "GPS",
55
+ label: "GPS",
56
+ color: GPS_COLOR,
57
+ signals: [
58
+ // L1 — I channel: P(Y), M-code, L1Cd (data), L1Cp (pilot)
59
+ {
60
+ constellation: "GPS",
61
+ label: "L1 P(Y)",
62
+ centerMHz: FREQ_GPS_L1,
63
+ modulation: "BPSK",
64
+ params: [10],
65
+ halfSpanChips: 20,
66
+ color: GPS_P_COLOR,
67
+ direction: "up"
68
+ },
69
+ {
70
+ constellation: "GPS",
71
+ label: "L1M",
72
+ centerMHz: FREQ_GPS_L1,
73
+ modulation: "BOCs",
74
+ params: [10, 5],
75
+ halfSpanChips: 20,
76
+ color: GPS_M_COLOR,
77
+ direction: "up"
78
+ },
79
+ {
80
+ constellation: "GPS",
81
+ label: "L1Cd",
82
+ centerMHz: FREQ_GPS_L1,
83
+ modulation: "BOCs",
84
+ params: [1, 1],
85
+ halfSpanChips: 20,
86
+ color: GPS_COLOR,
87
+ direction: "up"
88
+ },
89
+ // L1 — Q channel: C/A; L1Cp shown down for visual separation
90
+ {
91
+ constellation: "GPS",
92
+ label: "L1Cp",
93
+ centerMHz: FREQ_GPS_L1,
94
+ modulation: "composite",
95
+ params: [],
96
+ halfSpanChips: 20,
97
+ color: GPS_COLOR,
98
+ direction: "down",
99
+ composite: {
100
+ weights: [Math.sqrt(29 / 33), Math.sqrt(4 / 33)],
101
+ modulations: ["BOCs", "BOCs"],
102
+ paramSets: [
103
+ [1, 1],
104
+ [6, 1]
105
+ ]
106
+ }
107
+ },
108
+ {
109
+ constellation: "GPS",
110
+ label: "L1 C/A",
111
+ centerMHz: FREQ_GPS_L1,
112
+ modulation: "BPSK",
113
+ params: [1],
114
+ halfSpanChips: 20,
115
+ color: GPS_CA_COLOR,
116
+ direction: "down"
117
+ },
118
+ // L2 — I channel: P(Y)
119
+ {
120
+ constellation: "GPS",
121
+ label: "L2 P(Y)",
122
+ centerMHz: FREQ_GPS_L2,
123
+ modulation: "BPSK",
124
+ params: [10],
125
+ halfSpanChips: 20,
126
+ color: GPS_P_COLOR,
127
+ direction: "up"
128
+ },
129
+ {
130
+ constellation: "GPS",
131
+ label: "L2M",
132
+ centerMHz: FREQ_GPS_L2,
133
+ modulation: "BOCs",
134
+ params: [10, 5],
135
+ halfSpanChips: 20,
136
+ color: GPS_M_COLOR,
137
+ direction: "down"
138
+ },
139
+ // L2 — Q channel: L2C
140
+ {
141
+ constellation: "GPS",
142
+ label: "L2C",
143
+ centerMHz: FREQ_GPS_L2,
144
+ modulation: "BPSK",
145
+ params: [1],
146
+ halfSpanChips: 20,
147
+ color: GPS_COLOR,
148
+ direction: "down"
149
+ },
150
+ // L5 — up (I) and down (Q)
151
+ {
152
+ constellation: "GPS",
153
+ label: "L5-I",
154
+ centerMHz: FREQ_GPS_L5,
155
+ modulation: "BPSK",
156
+ params: [10],
157
+ halfSpanChips: 20,
158
+ color: GPS_COLOR,
159
+ direction: "up"
160
+ },
161
+ {
162
+ constellation: "GPS",
163
+ label: "L5-Q",
164
+ centerMHz: FREQ_GPS_L5,
165
+ modulation: "BPSK",
166
+ params: [10],
167
+ halfSpanChips: 20,
168
+ color: QZS_Q_COLOR,
169
+ direction: "down"
170
+ }
171
+ ]
172
+ },
173
+ {
174
+ key: "GLO_FDMA",
175
+ label: "GLO FDMA",
176
+ color: "#f87171",
177
+ signals: [
178
+ // L1 P (up) and C/A (down)
179
+ ...Array.from({ length: 15 }, (_, i) => i - 7).map(
180
+ (k) => ({
181
+ constellation: "GLO_FDMA",
182
+ label: `L1P k=${k}`,
183
+ centerMHz: FREQ_GLO_L1 + k * DELTA_GLO_L1,
184
+ modulation: "BPSK",
185
+ params: [5.11],
186
+ halfSpanChips: 5.11,
187
+ color: GLO_P_COLOR,
188
+ direction: "up"
189
+ })
190
+ ),
191
+ ...Array.from({ length: 15 }, (_, i) => i - 7).map(
192
+ (k) => ({
193
+ constellation: "GLO_FDMA",
194
+ label: `L1 C/A k=${k}`,
195
+ centerMHz: FREQ_GLO_L1 + k * DELTA_GLO_L1,
196
+ modulation: "BPSK",
197
+ params: [0.511],
198
+ halfSpanChips: 0.511,
199
+ color: GLO_CA_COLOR,
200
+ direction: "down"
201
+ })
202
+ ),
203
+ // L2 P (up) and C/A (down)
204
+ ...Array.from({ length: 15 }, (_, i) => i - 7).map(
205
+ (k) => ({
206
+ constellation: "GLO_FDMA",
207
+ label: `L2P k=${k}`,
208
+ centerMHz: FREQ_GLO_L2 + k * DELTA_GLO_L2,
209
+ modulation: "BPSK",
210
+ params: [5.11],
211
+ halfSpanChips: 5.11,
212
+ color: GLO_P_COLOR,
213
+ direction: "up"
214
+ })
215
+ ),
216
+ ...Array.from({ length: 15 }, (_, i) => i - 7).map(
217
+ (k) => ({
218
+ constellation: "GLO_FDMA",
219
+ label: `L2 C/A k=${k}`,
220
+ centerMHz: FREQ_GLO_L2 + k * DELTA_GLO_L2,
221
+ modulation: "BPSK",
222
+ params: [0.511],
223
+ halfSpanChips: 0.511,
224
+ color: GLO_CA_COLOR,
225
+ direction: "down"
226
+ })
227
+ )
228
+ ]
229
+ },
230
+ {
231
+ key: "GLO_CDMA",
232
+ label: "GLO CDMA",
233
+ color: "#f87171",
234
+ signals: [
235
+ // L1OC (up), L1SC (down)
236
+ {
237
+ constellation: "GLO_CDMA",
238
+ label: "L1OC",
239
+ centerMHz: FREQ_GLO_L1OC,
240
+ modulation: "BOCs",
241
+ params: [1, 1],
242
+ halfSpanChips: 20,
243
+ color: GLO_OC_COLOR,
244
+ direction: "up"
245
+ },
246
+ {
247
+ constellation: "GLO_CDMA",
248
+ label: "L1SC",
249
+ centerMHz: FREQ_GLO_L1OC,
250
+ modulation: "BOCs",
251
+ params: [5, 2.5],
252
+ halfSpanChips: 20,
253
+ color: GLO_SC_COLOR,
254
+ direction: "down"
255
+ },
256
+ // L2OC (up), L2SC (down)
257
+ {
258
+ constellation: "GLO_CDMA",
259
+ label: "L2OC",
260
+ centerMHz: FREQ_GLO_L2OC,
261
+ modulation: "BOCs",
262
+ params: [1, 1],
263
+ halfSpanChips: 20,
264
+ color: GLO_OC_COLOR,
265
+ direction: "up"
266
+ },
267
+ {
268
+ constellation: "GLO_CDMA",
269
+ label: "L2SC",
270
+ centerMHz: FREQ_GLO_L2OC,
271
+ modulation: "BOCs",
272
+ params: [5, 2.5],
273
+ halfSpanChips: 20,
274
+ color: GLO_SC_COLOR,
275
+ direction: "down"
276
+ },
277
+ // L3 I (up), Q (down)
278
+ {
279
+ constellation: "GLO_CDMA",
280
+ label: "L3-I",
281
+ centerMHz: FREQ_GLO_L3OC,
282
+ modulation: "BPSK",
283
+ params: [10],
284
+ halfSpanChips: 20,
285
+ color: GLO_OC_COLOR,
286
+ direction: "up"
287
+ },
288
+ {
289
+ constellation: "GLO_CDMA",
290
+ label: "L3-Q",
291
+ centerMHz: FREQ_GLO_L3OC,
292
+ modulation: "BPSK",
293
+ params: [10],
294
+ halfSpanChips: 20,
295
+ color: QZS_Q_COLOR,
296
+ direction: "down"
297
+ }
298
+ ]
299
+ },
300
+ {
301
+ key: "GAL",
302
+ label: "Galileo",
303
+ color: "#60a5fa",
304
+ signals: [
305
+ // E1 OS (up — CBOC), E1 PRS (down)
306
+ {
307
+ constellation: "GAL",
308
+ label: "E1B/E1C",
309
+ centerMHz: FREQ_GAL_E1,
310
+ modulation: "composite",
311
+ params: [],
312
+ halfSpanChips: 20,
313
+ color: GAL_OS_COLOR,
314
+ direction: "up",
315
+ composite: {
316
+ weights: [Math.sqrt(10 / 11), Math.sqrt(1 / 11)],
317
+ modulations: ["BOCs", "BOCs"],
318
+ paramSets: [
319
+ [1, 1],
320
+ [6, 1]
321
+ ]
322
+ }
323
+ },
324
+ {
325
+ constellation: "GAL",
326
+ label: "E1A",
327
+ centerMHz: FREQ_GAL_E1,
328
+ modulation: "BOCc",
329
+ params: [15, 2.5],
330
+ halfSpanChips: 20,
331
+ color: GAL_PRS_COLOR,
332
+ direction: "down"
333
+ },
334
+ // E6 OS (up), E6 PRS (down)
335
+ {
336
+ constellation: "GAL",
337
+ label: "E6B/E6C",
338
+ centerMHz: FREQ_GAL_E6,
339
+ modulation: "BPSK",
340
+ params: [5],
341
+ halfSpanChips: 20,
342
+ color: GAL_OS_COLOR,
343
+ direction: "up"
344
+ },
345
+ {
346
+ constellation: "GAL",
347
+ label: "E6A",
348
+ centerMHz: FREQ_GAL_E6,
349
+ modulation: "BOCc",
350
+ params: [10, 5],
351
+ halfSpanChips: 20,
352
+ color: GAL_PRS_COLOR,
353
+ direction: "down"
354
+ },
355
+ // E5 AltBOC — I (up), Q (down)
356
+ {
357
+ constellation: "GAL",
358
+ label: "E5a-I / E5b-I",
359
+ centerMHz: FREQ_GAL_E5,
360
+ modulation: "AltBOC",
361
+ params: [15, 10],
362
+ halfSpanChips: 35,
363
+ color: GAL_E5_COLOR,
364
+ direction: "up"
365
+ },
366
+ {
367
+ constellation: "GAL",
368
+ label: "E5a-Q / E5b-Q",
369
+ centerMHz: FREQ_GAL_E5,
370
+ modulation: "AltBOC",
371
+ params: [15, 10],
372
+ halfSpanChips: 35,
373
+ color: GAL_E5_Q_COLOR,
374
+ direction: "down"
375
+ }
376
+ ]
377
+ },
378
+ {
379
+ key: "BDS2",
380
+ label: "BeiDou-2",
381
+ color: "#fbbf24",
382
+ signals: [
383
+ // B1 I (up), Q (down)
384
+ {
385
+ constellation: "BDS2",
386
+ label: "B1I",
387
+ centerMHz: FREQ_BDS_B1I,
388
+ modulation: "BPSK",
389
+ params: [2],
390
+ halfSpanChips: 20,
391
+ color: BDS2_I_COLOR,
392
+ direction: "up"
393
+ },
394
+ {
395
+ constellation: "BDS2",
396
+ label: "B1Q",
397
+ centerMHz: FREQ_BDS_B1I,
398
+ modulation: "BPSK",
399
+ params: [2],
400
+ halfSpanChips: 20,
401
+ color: BDS2_Q_COLOR,
402
+ direction: "down"
403
+ },
404
+ // B3 I (up), Q (down)
405
+ {
406
+ constellation: "BDS2",
407
+ label: "B3I",
408
+ centerMHz: FREQ_BDS_B3I,
409
+ modulation: "BPSK",
410
+ params: [10],
411
+ halfSpanChips: 20,
412
+ color: BDS2_I_COLOR,
413
+ direction: "up"
414
+ },
415
+ {
416
+ constellation: "BDS2",
417
+ label: "B3Q",
418
+ centerMHz: FREQ_BDS_B3I,
419
+ modulation: "BPSK",
420
+ params: [10],
421
+ halfSpanChips: 20,
422
+ color: BDS2_Q_COLOR,
423
+ direction: "down"
424
+ },
425
+ // B2 I (up), Q (down)
426
+ {
427
+ constellation: "BDS2",
428
+ label: "B2I",
429
+ centerMHz: FREQ_BDS_B2I,
430
+ modulation: "BPSK",
431
+ params: [2],
432
+ halfSpanChips: 20,
433
+ color: BDS2_I_COLOR,
434
+ direction: "up"
435
+ },
436
+ {
437
+ constellation: "BDS2",
438
+ label: "B2Q",
439
+ centerMHz: FREQ_BDS_B2I,
440
+ modulation: "BPSK",
441
+ params: [10],
442
+ halfSpanChips: 20,
443
+ color: BDS2_Q_COLOR,
444
+ direction: "down"
445
+ }
446
+ ]
447
+ },
448
+ {
449
+ key: "BDS3",
450
+ label: "BeiDou-3",
451
+ color: "#fbbf24",
452
+ signals: [
453
+ // B1A (up + down, same modulation)
454
+ {
455
+ constellation: "BDS3",
456
+ label: "B1A",
457
+ centerMHz: FREQ_BDS_B1A,
458
+ modulation: "BOCs",
459
+ params: [14, 2],
460
+ halfSpanChips: 20,
461
+ color: BDS3_AUTH_COLOR,
462
+ direction: "up"
463
+ },
464
+ {
465
+ constellation: "BDS3",
466
+ label: "B1A",
467
+ centerMHz: FREQ_BDS_B1A,
468
+ modulation: "BOCs",
469
+ params: [14, 2],
470
+ halfSpanChips: 20,
471
+ color: BDS3_AUTH_COLOR,
472
+ direction: "down"
473
+ },
474
+ // B1C data (up), pilot (down)
475
+ {
476
+ constellation: "BDS3",
477
+ label: "B1Cd",
478
+ centerMHz: FREQ_BDS_B1C,
479
+ modulation: "BOCs",
480
+ params: [1, 1],
481
+ halfSpanChips: 20,
482
+ color: BDS3_OS_COLOR,
483
+ direction: "up"
484
+ },
485
+ {
486
+ constellation: "BDS3",
487
+ label: "B1Cp",
488
+ centerMHz: FREQ_BDS_B1C,
489
+ modulation: "composite",
490
+ params: [],
491
+ halfSpanChips: 20,
492
+ color: BDS3_OS_COLOR,
493
+ direction: "down",
494
+ composite: {
495
+ weights: [Math.sqrt(29 / 33), Math.sqrt(4 / 33)],
496
+ modulations: ["BOCs", "BOCs"],
497
+ paramSets: [
498
+ [1, 1],
499
+ [6, 1]
500
+ ]
501
+ }
502
+ },
503
+ // B3A (up only)
504
+ {
505
+ constellation: "BDS3",
506
+ label: "B3A",
507
+ centerMHz: FREQ_BDS_B3A,
508
+ modulation: "BOCs",
509
+ params: [15, 2.5],
510
+ halfSpanChips: 20,
511
+ color: BDS3_AUTH_COLOR,
512
+ direction: "up"
513
+ },
514
+ // B2a/B2b AltBOC — I (up), Q (down)
515
+ {
516
+ constellation: "BDS3",
517
+ label: "B2a-I / B2b-I",
518
+ centerMHz: FREQ_GAL_E5,
519
+ modulation: "AltBOC",
520
+ params: [15, 10],
521
+ halfSpanChips: 35,
522
+ color: BDS3_E5_COLOR,
523
+ direction: "up"
524
+ },
525
+ {
526
+ constellation: "BDS3",
527
+ label: "B2a-Q / B2b-Q",
528
+ centerMHz: FREQ_GAL_E5,
529
+ modulation: "AltBOC",
530
+ params: [15, 10],
531
+ halfSpanChips: 35,
532
+ color: BDS3_E5_Q_COLOR,
533
+ direction: "down"
534
+ }
535
+ ]
536
+ },
537
+ {
538
+ key: "QZSS",
539
+ label: "QZSS",
540
+ color: "#a78bfa",
541
+ signals: [
542
+ // L1 — I: L1Cd, L1Cp, L1S; Q: L1C/A
543
+ {
544
+ constellation: "QZSS",
545
+ label: "L1Cd",
546
+ centerMHz: FREQ_QZS_L1,
547
+ modulation: "BOCs",
548
+ params: [1, 1],
549
+ halfSpanChips: 20,
550
+ color: QZS_COLOR,
551
+ direction: "up"
552
+ },
553
+ {
554
+ constellation: "QZSS",
555
+ label: "L1Cp",
556
+ centerMHz: FREQ_QZS_L1,
557
+ modulation: "composite",
558
+ params: [],
559
+ halfSpanChips: 20,
560
+ color: "#06b6d4",
561
+ direction: "up",
562
+ composite: {
563
+ weights: [Math.sqrt(29 / 33), Math.sqrt(4 / 33)],
564
+ modulations: ["BOCs", "BOCs"],
565
+ paramSets: [
566
+ [1, 1],
567
+ [6, 1]
568
+ ]
569
+ }
570
+ },
571
+ {
572
+ constellation: "QZSS",
573
+ label: "L1S",
574
+ centerMHz: FREQ_QZS_L1,
575
+ modulation: "BPSK",
576
+ params: [1],
577
+ halfSpanChips: 20,
578
+ color: QZS_S_COLOR,
579
+ direction: "up"
580
+ },
581
+ {
582
+ constellation: "QZSS",
583
+ label: "L1 C/A",
584
+ centerMHz: FREQ_QZS_L1,
585
+ modulation: "BPSK",
586
+ params: [1],
587
+ halfSpanChips: 20,
588
+ color: QZS_COLOR,
589
+ direction: "down"
590
+ },
591
+ // L2C (up only)
592
+ {
593
+ constellation: "QZSS",
594
+ label: "L2C",
595
+ centerMHz: FREQ_QZS_L2,
596
+ modulation: "BPSK",
597
+ params: [1],
598
+ halfSpanChips: 20,
599
+ color: QZS_COLOR,
600
+ direction: "down"
601
+ },
602
+ // L5 — I (up), Q (down)
603
+ {
604
+ constellation: "QZSS",
605
+ label: "L5-I",
606
+ centerMHz: FREQ_QZS_L5,
607
+ modulation: "BPSK",
608
+ params: [10],
609
+ halfSpanChips: 20,
610
+ color: QZS_COLOR,
611
+ direction: "up"
612
+ },
613
+ {
614
+ constellation: "QZSS",
615
+ label: "L5-Q",
616
+ centerMHz: FREQ_QZS_L5,
617
+ modulation: "BPSK",
618
+ params: [10],
619
+ halfSpanChips: 20,
620
+ color: QZS_Q_COLOR,
621
+ direction: "down"
622
+ },
623
+ // L5S — I (up), Q (down) — slightly lower power
624
+ {
625
+ constellation: "QZSS",
626
+ label: "L5S-I",
627
+ centerMHz: FREQ_QZS_L5,
628
+ modulation: "BPSK",
629
+ params: [10],
630
+ halfSpanChips: 20,
631
+ color: QZS_S_COLOR,
632
+ direction: "up"
633
+ },
634
+ {
635
+ constellation: "QZSS",
636
+ label: "L5S-Q",
637
+ centerMHz: FREQ_QZS_L5,
638
+ modulation: "BPSK",
639
+ params: [10],
640
+ halfSpanChips: 20,
641
+ color: QZS_SQ_COLOR,
642
+ direction: "down"
643
+ },
644
+ // L6 (up only)
645
+ {
646
+ constellation: "QZSS",
647
+ label: "L6",
648
+ centerMHz: FREQ_QZS_L6,
649
+ modulation: "BPSK",
650
+ params: [5],
651
+ halfSpanChips: 20,
652
+ color: QZS_COLOR,
653
+ direction: "up"
654
+ }
655
+ ]
656
+ },
657
+ {
658
+ key: "NavIC",
659
+ label: "NavIC",
660
+ color: "#fb923c",
661
+ signals: [
662
+ // L5 SPS (up), RS (down)
663
+ {
664
+ constellation: "NavIC",
665
+ label: "L5 SPS",
666
+ centerMHz: FREQ_NAVIC_L5,
667
+ modulation: "BPSK",
668
+ params: [1],
669
+ halfSpanChips: 20,
670
+ color: NAVIC_SPS_COLOR,
671
+ direction: "up"
672
+ },
673
+ {
674
+ constellation: "NavIC",
675
+ label: "L5 RS",
676
+ centerMHz: FREQ_NAVIC_L5,
677
+ modulation: "BOCs",
678
+ params: [5, 2],
679
+ halfSpanChips: 20,
680
+ color: NAVIC_RS_COLOR,
681
+ direction: "down"
682
+ }
683
+ ]
684
+ }
685
+ ];
686
+ var BAND_PRESETS = [
687
+ { label: "Full L-Band", minMHz: 1150, maxMHz: 1630 },
688
+ { label: "Upper L-Band", minMHz: 1530, maxMHz: 1630 },
689
+ { label: "Lower L-Band", minMHz: 1150, maxMHz: 1310 },
690
+ { label: "L1 / E1", minMHz: 1555, maxMHz: 1605 },
691
+ { label: "L6 / E6", minMHz: 1255, maxMHz: 1305 },
692
+ { label: "L5 / E5", minMHz: 1155, maxMHz: 1220 }
693
+ ];
694
+
695
+ // src/signals/psd.ts
696
+ function sinc(x) {
697
+ if (x === 0) return 1;
698
+ const px = Math.PI * x;
699
+ return Math.sin(px) / px;
700
+ }
701
+ function phiBPSK(f, f0, n) {
702
+ return 1 / (f0 * n) * sinc(f / (f0 * n)) ** 2;
703
+ }
704
+ function phiBOCs(f, f0, m, n) {
705
+ if (f === 0) return 0;
706
+ const ratio = 2 * m / n;
707
+ if (ratio % 2 === 0) {
708
+ const boccVal = phiBOCc(f, f0, m, n);
709
+ const tanArg = Math.PI * f / (4 * f0 * m);
710
+ const tanVal = Math.tan(tanArg);
711
+ if (tanVal === 0) return 0;
712
+ return boccVal / tanVal ** 2;
713
+ }
714
+ const cosVal = Math.cos(Math.PI * f / (n * f0));
715
+ const sinVal = Math.sin(Math.PI * f / (2 * m * f0));
716
+ const cosDiv = Math.cos(Math.PI * f / (2 * m * f0));
717
+ if (cosDiv === 0) return 0;
718
+ return f0 * n * (cosVal * sinVal / (Math.PI * f * cosDiv)) ** 2;
719
+ }
720
+ function phiBOCc(f, f0, m, n) {
721
+ if (f === 0) return 0;
722
+ const ratio = 2 * m / n;
723
+ if (ratio % 2 === 0) {
724
+ const sincVal = sinc(f / (f0 * n));
725
+ const sinArg = Math.PI * f / (4 * f0 * m);
726
+ const cosArg = Math.PI * f / (2 * f0 * m);
727
+ const cosVal = Math.cos(cosArg);
728
+ if (cosVal === 0) return 0;
729
+ return 4 / (f0 * n) * sincVal ** 2 * (Math.sin(sinArg) ** 2 / cosVal) ** 2;
730
+ }
731
+ const cosNum = Math.cos(Math.PI * f / (n * f0));
732
+ const sinNum = Math.sin(Math.PI * f / (4 * m * f0));
733
+ const cosDen = Math.cos(Math.PI * f / (2 * m * f0));
734
+ if (cosDen === 0) return 0;
735
+ return n * f0 * (2 * cosNum * sinNum / (Math.PI * f * cosDen)) ** 2;
736
+ }
737
+ function phiAltBOC(f, f0, m, n) {
738
+ if (f === 0) return 0;
739
+ const cosDen = Math.cos(Math.PI * f / (2 * f0 * m));
740
+ if (Math.abs(cosDen) < 1e-15) return 0;
741
+ const cosConst = Math.cos(Math.PI / (f0 * m));
742
+ const cosHalf = Math.cos(Math.PI * f / (2 * f0 * m));
743
+ const cosQuarter = Math.cos(Math.PI * f / (4 * f0 * m));
744
+ const inner = cosConst ** 2 - cosHalf - 2 * cosHalf * cosQuarter + 2;
745
+ if (m % 2 === 1) {
746
+ const cosN = Math.cos(Math.PI * f / (f0 * n));
747
+ return 4 * f0 * n / (Math.PI * f) ** 2 * cosN ** 2 / cosDen ** 2 * inner;
748
+ }
749
+ const sinN = Math.sin(Math.PI * f / (f0 * n));
750
+ return 4 * f0 * n / (Math.PI * f) ** 2 * sinN ** 2 / cosDen ** 2 * inner;
751
+ }
752
+ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, floorDb = -60) {
753
+ const HZ_IN_MHZ = 1e6;
754
+ const halfSpanMHz = halfSpanChips * f0 / HZ_IN_MHZ;
755
+ const freqsMHz = new Float64Array(numPoints);
756
+ const psdDb = new Float64Array(numPoints);
757
+ for (let i = 0; i < numPoints; i++) {
758
+ const fMHz = -halfSpanMHz + 2 * halfSpanMHz * i / (numPoints - 1);
759
+ freqsMHz[i] = fMHz + centerMHz;
760
+ const val = psdFn(fMHz * HZ_IN_MHZ);
761
+ psdDb[i] = val > 0 ? 10 * Math.log10(val) : floorDb;
762
+ }
763
+ return { freqsMHz, psdDb };
764
+ }
765
+
766
+ export {
767
+ FREQ_GPS_L1,
768
+ FREQ_GPS_L2,
769
+ FREQ_GPS_L5,
770
+ FREQ_GLO_L1,
771
+ FREQ_GLO_L2,
772
+ DELTA_GLO_L1,
773
+ DELTA_GLO_L2,
774
+ FREQ_GLO_L1OC,
775
+ FREQ_GLO_L2OC,
776
+ FREQ_GLO_L3OC,
777
+ FREQ_GAL_E1,
778
+ FREQ_GAL_E5,
779
+ FREQ_GAL_E5a,
780
+ FREQ_GAL_E5b,
781
+ FREQ_GAL_E6,
782
+ FREQ_BDS_B1I,
783
+ FREQ_BDS_B2I,
784
+ FREQ_BDS_B3I,
785
+ FREQ_BDS_B1A,
786
+ FREQ_BDS_B1C,
787
+ FREQ_BDS_B3A,
788
+ FREQ_QZS_L1,
789
+ FREQ_QZS_L2,
790
+ FREQ_QZS_L5,
791
+ FREQ_QZS_L6,
792
+ FREQ_NAVIC_L5,
793
+ CONSTELLATIONS,
794
+ BAND_PRESETS,
795
+ phiBPSK,
796
+ phiBOCs,
797
+ phiBOCc,
798
+ phiAltBOC,
799
+ computePsdDb
800
+ };