@mearman/doppler 0.0.0 → 1.0.0
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.
- package/README.md +98 -0
- package/dist/browser/entry.d.ts +105 -0
- package/dist/browser/entry.js +276 -0
- package/dist/browser/mic-capture.worklet.d.ts +1 -0
- package/dist/browser/mic-capture.worklet.js +35 -0
- package/dist/index-TOQF-n8K.d.ts +1577 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/mic-capture-protocol-CfYodiRN.js +4 -0
- package/dist/node/entry.d.ts +128 -0
- package/dist/node/entry.js +478 -0
- package/dist/src-C4UucgwP.js +2807 -0
- package/dist/time-DWqWWgPL.js +4 -0
- package/dist-cli/doppler.mjs +3085 -0
- package/package.json +103 -2
|
@@ -0,0 +1,1577 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Geodetic 3D coordinate on or above the WGS84 reference ellipsoid.
|
|
4
|
+
*/
|
|
5
|
+
declare const GeoPoint3DSchema: z.ZodObject<{
|
|
6
|
+
lat: z.ZodNumber;
|
|
7
|
+
lon: z.ZodNumber;
|
|
8
|
+
altMeters: z.ZodNumber;
|
|
9
|
+
}, z.core.$strip> & {
|
|
10
|
+
readonly is: (value: unknown) => value is {
|
|
11
|
+
lat: number;
|
|
12
|
+
lon: number;
|
|
13
|
+
altMeters: number;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
type GeoPoint3D = z.infer<typeof GeoPoint3DSchema>;
|
|
17
|
+
/**
|
|
18
|
+
* 3D Cartesian vector in Earth-Centered, Earth-Fixed (ECEF) or local East-North-Up (ENU) coordinates.
|
|
19
|
+
*/
|
|
20
|
+
declare const Vector3DSchema: z.ZodObject<{
|
|
21
|
+
x: z.ZodNumber;
|
|
22
|
+
y: z.ZodNumber;
|
|
23
|
+
z: z.ZodNumber;
|
|
24
|
+
}, z.core.$strip> & {
|
|
25
|
+
readonly is: (value: unknown) => value is {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
z: number;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
type Vector3D = z.infer<typeof Vector3DSchema>;
|
|
32
|
+
/**
|
|
33
|
+
* Aircraft propulsion category used to filter acoustic candidates.
|
|
34
|
+
*/
|
|
35
|
+
declare const AircraftCategorySchema: z.ZodEnum<{
|
|
36
|
+
unknown: "unknown";
|
|
37
|
+
piston: "piston";
|
|
38
|
+
turboprop: "turboprop";
|
|
39
|
+
helicopter: "helicopter";
|
|
40
|
+
jet: "jet";
|
|
41
|
+
}> & {
|
|
42
|
+
readonly is: (value: unknown) => value is "unknown" | "piston" | "turboprop" | "helicopter" | "jet";
|
|
43
|
+
};
|
|
44
|
+
type AircraftCategory = z.infer<typeof AircraftCategorySchema>;
|
|
45
|
+
/**
|
|
46
|
+
* Raw 1 Hz ADS-B state vector prior to 4D Ramer-Douglas-Peucker simplification.
|
|
47
|
+
*/
|
|
48
|
+
declare const AdsbPingSchema: z.ZodObject<{
|
|
49
|
+
epochSec: z.ZodNumber;
|
|
50
|
+
lat: z.ZodNumber;
|
|
51
|
+
lon: z.ZodNumber;
|
|
52
|
+
altMeters: z.ZodNumber;
|
|
53
|
+
}, z.core.$strip> & {
|
|
54
|
+
readonly is: (value: unknown) => value is {
|
|
55
|
+
epochSec: number;
|
|
56
|
+
lat: number;
|
|
57
|
+
lon: number;
|
|
58
|
+
altMeters: number;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
type AdsbPing = z.infer<typeof AdsbPingSchema>;
|
|
62
|
+
/**
|
|
63
|
+
* Piecewise-linear 4D aircraft trajectory segment produced by Ramer-Douglas-Peucker compression.
|
|
64
|
+
*/
|
|
65
|
+
declare const LinearFlightSegmentSchema: z.ZodObject<{
|
|
66
|
+
id: z.ZodString;
|
|
67
|
+
flightId: z.ZodString;
|
|
68
|
+
icao24: z.ZodString;
|
|
69
|
+
typeCode: z.ZodString;
|
|
70
|
+
category: z.ZodEnum<{
|
|
71
|
+
unknown: "unknown";
|
|
72
|
+
piston: "piston";
|
|
73
|
+
turboprop: "turboprop";
|
|
74
|
+
helicopter: "helicopter";
|
|
75
|
+
jet: "jet";
|
|
76
|
+
}> & {
|
|
77
|
+
readonly is: (value: unknown) => value is "unknown" | "piston" | "turboprop" | "helicopter" | "jet";
|
|
78
|
+
};
|
|
79
|
+
dateIso: z.ZodString;
|
|
80
|
+
startEpochSec: z.ZodNumber;
|
|
81
|
+
endEpochSec: z.ZodNumber;
|
|
82
|
+
startGeo: z.ZodObject<{
|
|
83
|
+
lat: z.ZodNumber;
|
|
84
|
+
lon: z.ZodNumber;
|
|
85
|
+
altMeters: z.ZodNumber;
|
|
86
|
+
}, z.core.$strip> & {
|
|
87
|
+
readonly is: (value: unknown) => value is {
|
|
88
|
+
lat: number;
|
|
89
|
+
lon: number;
|
|
90
|
+
altMeters: number;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
endGeo: z.ZodObject<{
|
|
94
|
+
lat: z.ZodNumber;
|
|
95
|
+
lon: z.ZodNumber;
|
|
96
|
+
altMeters: z.ZodNumber;
|
|
97
|
+
}, z.core.$strip> & {
|
|
98
|
+
readonly is: (value: unknown) => value is {
|
|
99
|
+
lat: number;
|
|
100
|
+
lon: number;
|
|
101
|
+
altMeters: number;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
groundspeedMps: z.ZodNumber;
|
|
105
|
+
h3Cell: z.ZodString;
|
|
106
|
+
}, z.core.$strip> & {
|
|
107
|
+
readonly is: (value: unknown) => value is {
|
|
108
|
+
id: string;
|
|
109
|
+
flightId: string;
|
|
110
|
+
icao24: string;
|
|
111
|
+
typeCode: string;
|
|
112
|
+
category: "unknown" | "piston" | "turboprop" | "helicopter" | "jet";
|
|
113
|
+
dateIso: string;
|
|
114
|
+
startEpochSec: number;
|
|
115
|
+
endEpochSec: number;
|
|
116
|
+
startGeo: {
|
|
117
|
+
lat: number;
|
|
118
|
+
lon: number;
|
|
119
|
+
altMeters: number;
|
|
120
|
+
};
|
|
121
|
+
endGeo: {
|
|
122
|
+
lat: number;
|
|
123
|
+
lon: number;
|
|
124
|
+
altMeters: number;
|
|
125
|
+
};
|
|
126
|
+
groundspeedMps: number;
|
|
127
|
+
h3Cell: string;
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
type LinearFlightSegment = z.infer<typeof LinearFlightSegmentSchema>;
|
|
131
|
+
/**
|
|
132
|
+
* Single time-frequency point along an extracted spectrogram Doppler ridge.
|
|
133
|
+
*/
|
|
134
|
+
declare const DopplerRidgePointSchema: z.ZodObject<{
|
|
135
|
+
timeSec: z.ZodNumber;
|
|
136
|
+
freqHz: z.ZodNumber;
|
|
137
|
+
snrDb: z.ZodNumber;
|
|
138
|
+
}, z.core.$strip> & {
|
|
139
|
+
readonly is: (value: unknown) => value is {
|
|
140
|
+
timeSec: number;
|
|
141
|
+
freqHz: number;
|
|
142
|
+
snrDb: number;
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
type DopplerRidgePoint = z.infer<typeof DopplerRidgePointSchema>;
|
|
146
|
+
/**
|
|
147
|
+
* Closed-form kinematic parameters extracted algebraically from a single Doppler S-curve.
|
|
148
|
+
*/
|
|
149
|
+
declare const AsymptoticKinematicsSchema: z.ZodObject<{
|
|
150
|
+
asymptoticHighHz: z.ZodNumber;
|
|
151
|
+
asymptoticLowHz: z.ZodNumber;
|
|
152
|
+
baseFreqHz: z.ZodNumber;
|
|
153
|
+
inflectionSlopeHzPerSec: z.ZodNumber;
|
|
154
|
+
inferredSpeedMps: z.ZodNumber;
|
|
155
|
+
inferredSlantMeters: z.ZodNumber;
|
|
156
|
+
speedStdMps: z.ZodNumber;
|
|
157
|
+
slantStdMeters: z.ZodNumber;
|
|
158
|
+
}, z.core.$strip> & {
|
|
159
|
+
readonly is: (value: unknown) => value is {
|
|
160
|
+
asymptoticHighHz: number;
|
|
161
|
+
asymptoticLowHz: number;
|
|
162
|
+
baseFreqHz: number;
|
|
163
|
+
inflectionSlopeHzPerSec: number;
|
|
164
|
+
inferredSpeedMps: number;
|
|
165
|
+
inferredSlantMeters: number;
|
|
166
|
+
speedStdMps: number;
|
|
167
|
+
slantStdMeters: number;
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
type AsymptoticKinematics = z.infer<typeof AsymptoticKinematicsSchema>;
|
|
171
|
+
/**
|
|
172
|
+
* Complete acoustic observation of an aircraft flyover extracted from an audio stream or file.
|
|
173
|
+
*/
|
|
174
|
+
declare const DopplerObservationSchema: z.ZodObject<{
|
|
175
|
+
id: z.ZodString;
|
|
176
|
+
episodeId: z.ZodString;
|
|
177
|
+
cpaTimeSec: z.ZodNumber;
|
|
178
|
+
kinematics: z.ZodObject<{
|
|
179
|
+
asymptoticHighHz: z.ZodNumber;
|
|
180
|
+
asymptoticLowHz: z.ZodNumber;
|
|
181
|
+
baseFreqHz: z.ZodNumber;
|
|
182
|
+
inflectionSlopeHzPerSec: z.ZodNumber;
|
|
183
|
+
inferredSpeedMps: z.ZodNumber;
|
|
184
|
+
inferredSlantMeters: z.ZodNumber;
|
|
185
|
+
speedStdMps: z.ZodNumber;
|
|
186
|
+
slantStdMeters: z.ZodNumber;
|
|
187
|
+
}, z.core.$strip> & {
|
|
188
|
+
readonly is: (value: unknown) => value is {
|
|
189
|
+
asymptoticHighHz: number;
|
|
190
|
+
asymptoticLowHz: number;
|
|
191
|
+
baseFreqHz: number;
|
|
192
|
+
inflectionSlopeHzPerSec: number;
|
|
193
|
+
inferredSpeedMps: number;
|
|
194
|
+
inferredSlantMeters: number;
|
|
195
|
+
speedStdMps: number;
|
|
196
|
+
slantStdMeters: number;
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
snrDb: z.ZodNumber;
|
|
200
|
+
harmonicCount: z.ZodNumber;
|
|
201
|
+
ridgePoints: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
202
|
+
timeSec: z.ZodNumber;
|
|
203
|
+
freqHz: z.ZodNumber;
|
|
204
|
+
snrDb: z.ZodNumber;
|
|
205
|
+
}, z.core.$strip> & {
|
|
206
|
+
readonly is: (value: unknown) => value is {
|
|
207
|
+
timeSec: number;
|
|
208
|
+
freqHz: number;
|
|
209
|
+
snrDb: number;
|
|
210
|
+
};
|
|
211
|
+
}>>;
|
|
212
|
+
}, z.core.$strip> & {
|
|
213
|
+
readonly is: (value: unknown) => value is {
|
|
214
|
+
id: string;
|
|
215
|
+
episodeId: string;
|
|
216
|
+
cpaTimeSec: number;
|
|
217
|
+
kinematics: {
|
|
218
|
+
asymptoticHighHz: number;
|
|
219
|
+
asymptoticLowHz: number;
|
|
220
|
+
baseFreqHz: number;
|
|
221
|
+
inflectionSlopeHzPerSec: number;
|
|
222
|
+
inferredSpeedMps: number;
|
|
223
|
+
inferredSlantMeters: number;
|
|
224
|
+
speedStdMps: number;
|
|
225
|
+
slantStdMeters: number;
|
|
226
|
+
};
|
|
227
|
+
snrDb: number;
|
|
228
|
+
harmonicCount: number;
|
|
229
|
+
ridgePoints: readonly {
|
|
230
|
+
timeSec: number;
|
|
231
|
+
freqHz: number;
|
|
232
|
+
snrDb: number;
|
|
233
|
+
}[];
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
type DopplerObservation = z.infer<typeof DopplerObservationSchema>;
|
|
237
|
+
/**
|
|
238
|
+
* Quantized Shazam-style constellation hash entry linking two flyovers at a shared H3 cell.
|
|
239
|
+
*/
|
|
240
|
+
declare const ConstellationEntrySchema: z.ZodObject<{
|
|
241
|
+
hashKey: z.ZodString;
|
|
242
|
+
dateIso: z.ZodString;
|
|
243
|
+
h3Cell: z.ZodString;
|
|
244
|
+
centerLat: z.ZodNumber;
|
|
245
|
+
centerLon: z.ZodNumber;
|
|
246
|
+
segmentIdA: z.ZodString;
|
|
247
|
+
segmentIdB: z.ZodString;
|
|
248
|
+
speedAMps: z.ZodNumber;
|
|
249
|
+
speedBMps: z.ZodNumber;
|
|
250
|
+
cpaDelayedEpochSecA: z.ZodNumber;
|
|
251
|
+
cpaDelayedEpochSecB: z.ZodNumber;
|
|
252
|
+
deltaSec: z.ZodNumber;
|
|
253
|
+
}, z.core.$strip> & {
|
|
254
|
+
readonly is: (value: unknown) => value is {
|
|
255
|
+
hashKey: string;
|
|
256
|
+
dateIso: string;
|
|
257
|
+
h3Cell: string;
|
|
258
|
+
centerLat: number;
|
|
259
|
+
centerLon: number;
|
|
260
|
+
segmentIdA: string;
|
|
261
|
+
segmentIdB: string;
|
|
262
|
+
speedAMps: number;
|
|
263
|
+
speedBMps: number;
|
|
264
|
+
cpaDelayedEpochSecA: number;
|
|
265
|
+
cpaDelayedEpochSecB: number;
|
|
266
|
+
deltaSec: number;
|
|
267
|
+
};
|
|
268
|
+
};
|
|
269
|
+
type ConstellationEntry = z.infer<typeof ConstellationEntrySchema>;
|
|
270
|
+
/**
|
|
271
|
+
* Time interval within a listening episode where ambient noise was below the silence-gating threshold.
|
|
272
|
+
*/
|
|
273
|
+
declare const QuietIntervalSchema: z.ZodObject<{
|
|
274
|
+
startSec: z.ZodNumber;
|
|
275
|
+
endSec: z.ZodNumber;
|
|
276
|
+
medianNoiseFloorDb: z.ZodNumber;
|
|
277
|
+
}, z.core.$strip> & {
|
|
278
|
+
readonly is: (value: unknown) => value is {
|
|
279
|
+
startSec: number;
|
|
280
|
+
endSec: number;
|
|
281
|
+
medianNoiseFloorDb: number;
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
type QuietInterval = z.infer<typeof QuietIntervalSchema>;
|
|
285
|
+
/**
|
|
286
|
+
* Continuous listening window within a multi-episode pause/resume geolocation session.
|
|
287
|
+
*/
|
|
288
|
+
declare const ListeningEpisodeSchema: z.ZodObject<{
|
|
289
|
+
id: z.ZodString;
|
|
290
|
+
startedAtSec: z.ZodNumber;
|
|
291
|
+
endedAtSec: z.ZodNumber;
|
|
292
|
+
status: z.ZodEnum<{
|
|
293
|
+
active: "active";
|
|
294
|
+
paused: "paused";
|
|
295
|
+
completed: "completed";
|
|
296
|
+
}>;
|
|
297
|
+
currentNoiseFloorDb: z.ZodNumber;
|
|
298
|
+
noisePolluted: z.ZodBoolean;
|
|
299
|
+
quietIntervals: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
300
|
+
startSec: z.ZodNumber;
|
|
301
|
+
endSec: z.ZodNumber;
|
|
302
|
+
medianNoiseFloorDb: z.ZodNumber;
|
|
303
|
+
}, z.core.$strip> & {
|
|
304
|
+
readonly is: (value: unknown) => value is {
|
|
305
|
+
startSec: number;
|
|
306
|
+
endSec: number;
|
|
307
|
+
medianNoiseFloorDb: number;
|
|
308
|
+
};
|
|
309
|
+
}>>;
|
|
310
|
+
}, z.core.$strip> & {
|
|
311
|
+
readonly is: (value: unknown) => value is {
|
|
312
|
+
id: string;
|
|
313
|
+
startedAtSec: number;
|
|
314
|
+
endedAtSec: number;
|
|
315
|
+
status: "active" | "paused" | "completed";
|
|
316
|
+
currentNoiseFloorDb: number;
|
|
317
|
+
noisePolluted: boolean;
|
|
318
|
+
quietIntervals: readonly {
|
|
319
|
+
startSec: number;
|
|
320
|
+
endSec: number;
|
|
321
|
+
medianNoiseFloorDb: number;
|
|
322
|
+
}[];
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
type ListeningEpisode = z.infer<typeof ListeningEpisodeSchema>;
|
|
326
|
+
/**
|
|
327
|
+
* Passive Electrical Network Frequency (ENF) side-channel signature (50 Hz vs 60 Hz power grid).
|
|
328
|
+
*/
|
|
329
|
+
declare const EnfSignatureSchema: z.ZodObject<{
|
|
330
|
+
detected: z.ZodBoolean;
|
|
331
|
+
nominalHz: z.ZodEnum<{
|
|
332
|
+
unknown: "unknown";
|
|
333
|
+
50: "50";
|
|
334
|
+
60: "60";
|
|
335
|
+
}>;
|
|
336
|
+
measuredFreqHz: z.ZodNumber;
|
|
337
|
+
snrDb: z.ZodNumber;
|
|
338
|
+
regionHint: z.ZodString;
|
|
339
|
+
}, z.core.$strip> & {
|
|
340
|
+
readonly is: (value: unknown) => value is {
|
|
341
|
+
detected: boolean;
|
|
342
|
+
nominalHz: "unknown" | "50" | "60";
|
|
343
|
+
measuredFreqHz: number;
|
|
344
|
+
snrDb: number;
|
|
345
|
+
regionHint: string;
|
|
346
|
+
};
|
|
347
|
+
};
|
|
348
|
+
type EnfSignature = z.infer<typeof EnfSignatureSchema>;
|
|
349
|
+
/**
|
|
350
|
+
* Optional user or side-channel constraints over Space, Date, Time of Day, and Power Grid.
|
|
351
|
+
*/
|
|
352
|
+
declare const SearchConstraintsSchema: z.ZodObject<{
|
|
353
|
+
minLat: z.ZodOptional<z.ZodNumber>;
|
|
354
|
+
maxLat: z.ZodOptional<z.ZodNumber>;
|
|
355
|
+
minLon: z.ZodOptional<z.ZodNumber>;
|
|
356
|
+
maxLon: z.ZodOptional<z.ZodNumber>;
|
|
357
|
+
dateFromIso: z.ZodOptional<z.ZodString>;
|
|
358
|
+
dateToIso: z.ZodOptional<z.ZodString>;
|
|
359
|
+
utcHourStart: z.ZodOptional<z.ZodNumber>;
|
|
360
|
+
utcHourEnd: z.ZodOptional<z.ZodNumber>;
|
|
361
|
+
enfNominalHz: z.ZodOptional<z.ZodEnum<{
|
|
362
|
+
50: "50";
|
|
363
|
+
60: "60";
|
|
364
|
+
}>>;
|
|
365
|
+
}, z.core.$strip> & {
|
|
366
|
+
readonly is: (value: unknown) => value is {
|
|
367
|
+
minLat?: number | undefined;
|
|
368
|
+
maxLat?: number | undefined;
|
|
369
|
+
minLon?: number | undefined;
|
|
370
|
+
maxLon?: number | undefined;
|
|
371
|
+
dateFromIso?: string | undefined;
|
|
372
|
+
dateToIso?: string | undefined;
|
|
373
|
+
utcHourStart?: number | undefined;
|
|
374
|
+
utcHourEnd?: number | undefined;
|
|
375
|
+
enfNominalHz?: "50" | "60" | undefined;
|
|
376
|
+
};
|
|
377
|
+
};
|
|
378
|
+
type SearchConstraints = z.infer<typeof SearchConstraintsSchema>;
|
|
379
|
+
/**
|
|
380
|
+
* A flyover observation attributed to a flight segment under a location hypothesis. Matches are keyed by observation id, never by position, because an observation that fits no segment is absent from a hypothesis and would shift every later index.
|
|
381
|
+
*/
|
|
382
|
+
declare const HypothesisMatchSchema: z.ZodObject<{
|
|
383
|
+
observationId: z.ZodString;
|
|
384
|
+
segmentId: z.ZodString;
|
|
385
|
+
}, z.core.$strip> & {
|
|
386
|
+
readonly is: (value: unknown) => value is {
|
|
387
|
+
observationId: string;
|
|
388
|
+
segmentId: string;
|
|
389
|
+
};
|
|
390
|
+
};
|
|
391
|
+
type HypothesisMatch = z.infer<typeof HypothesisMatchSchema>;
|
|
392
|
+
/**
|
|
393
|
+
* Candidate observer location hypothesis with cumulative Bayesian log-posterior and 95% confidence ellipse.
|
|
394
|
+
*/
|
|
395
|
+
declare const LocationHypothesisSchema: z.ZodObject<{
|
|
396
|
+
id: z.ZodString;
|
|
397
|
+
h3Cell: z.ZodString;
|
|
398
|
+
dateIso: z.ZodString;
|
|
399
|
+
lat: z.ZodNumber;
|
|
400
|
+
lon: z.ZodNumber;
|
|
401
|
+
altMeters: z.ZodNumber;
|
|
402
|
+
estimatedStartEpochSec: z.ZodNumber;
|
|
403
|
+
logPosterior: z.ZodNumber;
|
|
404
|
+
probability: z.ZodNumber;
|
|
405
|
+
rmsFreqResidualHz: z.ZodNumber;
|
|
406
|
+
fisherInfo: z.ZodReadonly<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
407
|
+
ellipseSemiMajorMeters: z.ZodNumber;
|
|
408
|
+
ellipseSemiMinorMeters: z.ZodNumber;
|
|
409
|
+
ellipseBearingDeg: z.ZodNumber;
|
|
410
|
+
matches: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
411
|
+
observationId: z.ZodString;
|
|
412
|
+
segmentId: z.ZodString;
|
|
413
|
+
}, z.core.$strip> & {
|
|
414
|
+
readonly is: (value: unknown) => value is {
|
|
415
|
+
observationId: string;
|
|
416
|
+
segmentId: string;
|
|
417
|
+
};
|
|
418
|
+
}>>;
|
|
419
|
+
}, z.core.$strip> & {
|
|
420
|
+
readonly is: (value: unknown) => value is {
|
|
421
|
+
id: string;
|
|
422
|
+
h3Cell: string;
|
|
423
|
+
dateIso: string;
|
|
424
|
+
lat: number;
|
|
425
|
+
lon: number;
|
|
426
|
+
altMeters: number;
|
|
427
|
+
estimatedStartEpochSec: number;
|
|
428
|
+
logPosterior: number;
|
|
429
|
+
probability: number;
|
|
430
|
+
rmsFreqResidualHz: number;
|
|
431
|
+
fisherInfo: readonly [number, number, number, number];
|
|
432
|
+
ellipseSemiMajorMeters: number;
|
|
433
|
+
ellipseSemiMinorMeters: number;
|
|
434
|
+
ellipseBearingDeg: number;
|
|
435
|
+
matches: readonly {
|
|
436
|
+
observationId: string;
|
|
437
|
+
segmentId: string;
|
|
438
|
+
}[];
|
|
439
|
+
};
|
|
440
|
+
};
|
|
441
|
+
type LocationHypothesis = z.infer<typeof LocationHypothesisSchema>;
|
|
442
|
+
/**
|
|
443
|
+
* Persistent, serializable geolocation session supporting continuous and episodic pause/resume refinement.
|
|
444
|
+
*/
|
|
445
|
+
declare const LocationSessionSchema: z.ZodObject<{
|
|
446
|
+
id: z.ZodString;
|
|
447
|
+
createdAtEpochSec: z.ZodNumber;
|
|
448
|
+
updatedAtEpochSec: z.ZodNumber;
|
|
449
|
+
ambientTempCelsius: z.ZodNumber;
|
|
450
|
+
constraints: z.ZodObject<{
|
|
451
|
+
minLat: z.ZodOptional<z.ZodNumber>;
|
|
452
|
+
maxLat: z.ZodOptional<z.ZodNumber>;
|
|
453
|
+
minLon: z.ZodOptional<z.ZodNumber>;
|
|
454
|
+
maxLon: z.ZodOptional<z.ZodNumber>;
|
|
455
|
+
dateFromIso: z.ZodOptional<z.ZodString>;
|
|
456
|
+
dateToIso: z.ZodOptional<z.ZodString>;
|
|
457
|
+
utcHourStart: z.ZodOptional<z.ZodNumber>;
|
|
458
|
+
utcHourEnd: z.ZodOptional<z.ZodNumber>;
|
|
459
|
+
enfNominalHz: z.ZodOptional<z.ZodEnum<{
|
|
460
|
+
50: "50";
|
|
461
|
+
60: "60";
|
|
462
|
+
}>>;
|
|
463
|
+
}, z.core.$strip> & {
|
|
464
|
+
readonly is: (value: unknown) => value is {
|
|
465
|
+
minLat?: number | undefined;
|
|
466
|
+
maxLat?: number | undefined;
|
|
467
|
+
minLon?: number | undefined;
|
|
468
|
+
maxLon?: number | undefined;
|
|
469
|
+
dateFromIso?: string | undefined;
|
|
470
|
+
dateToIso?: string | undefined;
|
|
471
|
+
utcHourStart?: number | undefined;
|
|
472
|
+
utcHourEnd?: number | undefined;
|
|
473
|
+
enfNominalHz?: "50" | "60" | undefined;
|
|
474
|
+
};
|
|
475
|
+
};
|
|
476
|
+
enfSignature: z.ZodObject<{
|
|
477
|
+
detected: z.ZodBoolean;
|
|
478
|
+
nominalHz: z.ZodEnum<{
|
|
479
|
+
unknown: "unknown";
|
|
480
|
+
50: "50";
|
|
481
|
+
60: "60";
|
|
482
|
+
}>;
|
|
483
|
+
measuredFreqHz: z.ZodNumber;
|
|
484
|
+
snrDb: z.ZodNumber;
|
|
485
|
+
regionHint: z.ZodString;
|
|
486
|
+
}, z.core.$strip> & {
|
|
487
|
+
readonly is: (value: unknown) => value is {
|
|
488
|
+
detected: boolean;
|
|
489
|
+
nominalHz: "unknown" | "50" | "60";
|
|
490
|
+
measuredFreqHz: number;
|
|
491
|
+
snrDb: number;
|
|
492
|
+
regionHint: string;
|
|
493
|
+
};
|
|
494
|
+
};
|
|
495
|
+
episodes: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
496
|
+
id: z.ZodString;
|
|
497
|
+
startedAtSec: z.ZodNumber;
|
|
498
|
+
endedAtSec: z.ZodNumber;
|
|
499
|
+
status: z.ZodEnum<{
|
|
500
|
+
active: "active";
|
|
501
|
+
paused: "paused";
|
|
502
|
+
completed: "completed";
|
|
503
|
+
}>;
|
|
504
|
+
currentNoiseFloorDb: z.ZodNumber;
|
|
505
|
+
noisePolluted: z.ZodBoolean;
|
|
506
|
+
quietIntervals: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
507
|
+
startSec: z.ZodNumber;
|
|
508
|
+
endSec: z.ZodNumber;
|
|
509
|
+
medianNoiseFloorDb: z.ZodNumber;
|
|
510
|
+
}, z.core.$strip> & {
|
|
511
|
+
readonly is: (value: unknown) => value is {
|
|
512
|
+
startSec: number;
|
|
513
|
+
endSec: number;
|
|
514
|
+
medianNoiseFloorDb: number;
|
|
515
|
+
};
|
|
516
|
+
}>>;
|
|
517
|
+
}, z.core.$strip> & {
|
|
518
|
+
readonly is: (value: unknown) => value is {
|
|
519
|
+
id: string;
|
|
520
|
+
startedAtSec: number;
|
|
521
|
+
endedAtSec: number;
|
|
522
|
+
status: "active" | "paused" | "completed";
|
|
523
|
+
currentNoiseFloorDb: number;
|
|
524
|
+
noisePolluted: boolean;
|
|
525
|
+
quietIntervals: readonly {
|
|
526
|
+
startSec: number;
|
|
527
|
+
endSec: number;
|
|
528
|
+
medianNoiseFloorDb: number;
|
|
529
|
+
}[];
|
|
530
|
+
};
|
|
531
|
+
}>>;
|
|
532
|
+
observations: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
533
|
+
id: z.ZodString;
|
|
534
|
+
episodeId: z.ZodString;
|
|
535
|
+
cpaTimeSec: z.ZodNumber;
|
|
536
|
+
kinematics: z.ZodObject<{
|
|
537
|
+
asymptoticHighHz: z.ZodNumber;
|
|
538
|
+
asymptoticLowHz: z.ZodNumber;
|
|
539
|
+
baseFreqHz: z.ZodNumber;
|
|
540
|
+
inflectionSlopeHzPerSec: z.ZodNumber;
|
|
541
|
+
inferredSpeedMps: z.ZodNumber;
|
|
542
|
+
inferredSlantMeters: z.ZodNumber;
|
|
543
|
+
speedStdMps: z.ZodNumber;
|
|
544
|
+
slantStdMeters: z.ZodNumber;
|
|
545
|
+
}, z.core.$strip> & {
|
|
546
|
+
readonly is: (value: unknown) => value is {
|
|
547
|
+
asymptoticHighHz: number;
|
|
548
|
+
asymptoticLowHz: number;
|
|
549
|
+
baseFreqHz: number;
|
|
550
|
+
inflectionSlopeHzPerSec: number;
|
|
551
|
+
inferredSpeedMps: number;
|
|
552
|
+
inferredSlantMeters: number;
|
|
553
|
+
speedStdMps: number;
|
|
554
|
+
slantStdMeters: number;
|
|
555
|
+
};
|
|
556
|
+
};
|
|
557
|
+
snrDb: z.ZodNumber;
|
|
558
|
+
harmonicCount: z.ZodNumber;
|
|
559
|
+
ridgePoints: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
560
|
+
timeSec: z.ZodNumber;
|
|
561
|
+
freqHz: z.ZodNumber;
|
|
562
|
+
snrDb: z.ZodNumber;
|
|
563
|
+
}, z.core.$strip> & {
|
|
564
|
+
readonly is: (value: unknown) => value is {
|
|
565
|
+
timeSec: number;
|
|
566
|
+
freqHz: number;
|
|
567
|
+
snrDb: number;
|
|
568
|
+
};
|
|
569
|
+
}>>;
|
|
570
|
+
}, z.core.$strip> & {
|
|
571
|
+
readonly is: (value: unknown) => value is {
|
|
572
|
+
id: string;
|
|
573
|
+
episodeId: string;
|
|
574
|
+
cpaTimeSec: number;
|
|
575
|
+
kinematics: {
|
|
576
|
+
asymptoticHighHz: number;
|
|
577
|
+
asymptoticLowHz: number;
|
|
578
|
+
baseFreqHz: number;
|
|
579
|
+
inflectionSlopeHzPerSec: number;
|
|
580
|
+
inferredSpeedMps: number;
|
|
581
|
+
inferredSlantMeters: number;
|
|
582
|
+
speedStdMps: number;
|
|
583
|
+
slantStdMeters: number;
|
|
584
|
+
};
|
|
585
|
+
snrDb: number;
|
|
586
|
+
harmonicCount: number;
|
|
587
|
+
ridgePoints: readonly {
|
|
588
|
+
timeSec: number;
|
|
589
|
+
freqHz: number;
|
|
590
|
+
snrDb: number;
|
|
591
|
+
}[];
|
|
592
|
+
};
|
|
593
|
+
}>>;
|
|
594
|
+
hypotheses: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
595
|
+
id: z.ZodString;
|
|
596
|
+
h3Cell: z.ZodString;
|
|
597
|
+
dateIso: z.ZodString;
|
|
598
|
+
lat: z.ZodNumber;
|
|
599
|
+
lon: z.ZodNumber;
|
|
600
|
+
altMeters: z.ZodNumber;
|
|
601
|
+
estimatedStartEpochSec: z.ZodNumber;
|
|
602
|
+
logPosterior: z.ZodNumber;
|
|
603
|
+
probability: z.ZodNumber;
|
|
604
|
+
rmsFreqResidualHz: z.ZodNumber;
|
|
605
|
+
fisherInfo: z.ZodReadonly<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
606
|
+
ellipseSemiMajorMeters: z.ZodNumber;
|
|
607
|
+
ellipseSemiMinorMeters: z.ZodNumber;
|
|
608
|
+
ellipseBearingDeg: z.ZodNumber;
|
|
609
|
+
matches: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
610
|
+
observationId: z.ZodString;
|
|
611
|
+
segmentId: z.ZodString;
|
|
612
|
+
}, z.core.$strip> & {
|
|
613
|
+
readonly is: (value: unknown) => value is {
|
|
614
|
+
observationId: string;
|
|
615
|
+
segmentId: string;
|
|
616
|
+
};
|
|
617
|
+
}>>;
|
|
618
|
+
}, z.core.$strip> & {
|
|
619
|
+
readonly is: (value: unknown) => value is {
|
|
620
|
+
id: string;
|
|
621
|
+
h3Cell: string;
|
|
622
|
+
dateIso: string;
|
|
623
|
+
lat: number;
|
|
624
|
+
lon: number;
|
|
625
|
+
altMeters: number;
|
|
626
|
+
estimatedStartEpochSec: number;
|
|
627
|
+
logPosterior: number;
|
|
628
|
+
probability: number;
|
|
629
|
+
rmsFreqResidualHz: number;
|
|
630
|
+
fisherInfo: readonly [number, number, number, number];
|
|
631
|
+
ellipseSemiMajorMeters: number;
|
|
632
|
+
ellipseSemiMinorMeters: number;
|
|
633
|
+
ellipseBearingDeg: number;
|
|
634
|
+
matches: readonly {
|
|
635
|
+
observationId: string;
|
|
636
|
+
segmentId: string;
|
|
637
|
+
}[];
|
|
638
|
+
};
|
|
639
|
+
}>>;
|
|
640
|
+
}, z.core.$strip> & {
|
|
641
|
+
readonly is: (value: unknown) => value is {
|
|
642
|
+
id: string;
|
|
643
|
+
createdAtEpochSec: number;
|
|
644
|
+
updatedAtEpochSec: number;
|
|
645
|
+
ambientTempCelsius: number;
|
|
646
|
+
constraints: {
|
|
647
|
+
minLat?: number | undefined;
|
|
648
|
+
maxLat?: number | undefined;
|
|
649
|
+
minLon?: number | undefined;
|
|
650
|
+
maxLon?: number | undefined;
|
|
651
|
+
dateFromIso?: string | undefined;
|
|
652
|
+
dateToIso?: string | undefined;
|
|
653
|
+
utcHourStart?: number | undefined;
|
|
654
|
+
utcHourEnd?: number | undefined;
|
|
655
|
+
enfNominalHz?: "50" | "60" | undefined;
|
|
656
|
+
};
|
|
657
|
+
enfSignature: {
|
|
658
|
+
detected: boolean;
|
|
659
|
+
nominalHz: "unknown" | "50" | "60";
|
|
660
|
+
measuredFreqHz: number;
|
|
661
|
+
snrDb: number;
|
|
662
|
+
regionHint: string;
|
|
663
|
+
};
|
|
664
|
+
episodes: readonly {
|
|
665
|
+
id: string;
|
|
666
|
+
startedAtSec: number;
|
|
667
|
+
endedAtSec: number;
|
|
668
|
+
status: "active" | "paused" | "completed";
|
|
669
|
+
currentNoiseFloorDb: number;
|
|
670
|
+
noisePolluted: boolean;
|
|
671
|
+
quietIntervals: readonly {
|
|
672
|
+
startSec: number;
|
|
673
|
+
endSec: number;
|
|
674
|
+
medianNoiseFloorDb: number;
|
|
675
|
+
}[];
|
|
676
|
+
}[];
|
|
677
|
+
observations: readonly {
|
|
678
|
+
id: string;
|
|
679
|
+
episodeId: string;
|
|
680
|
+
cpaTimeSec: number;
|
|
681
|
+
kinematics: {
|
|
682
|
+
asymptoticHighHz: number;
|
|
683
|
+
asymptoticLowHz: number;
|
|
684
|
+
baseFreqHz: number;
|
|
685
|
+
inflectionSlopeHzPerSec: number;
|
|
686
|
+
inferredSpeedMps: number;
|
|
687
|
+
inferredSlantMeters: number;
|
|
688
|
+
speedStdMps: number;
|
|
689
|
+
slantStdMeters: number;
|
|
690
|
+
};
|
|
691
|
+
snrDb: number;
|
|
692
|
+
harmonicCount: number;
|
|
693
|
+
ridgePoints: readonly {
|
|
694
|
+
timeSec: number;
|
|
695
|
+
freqHz: number;
|
|
696
|
+
snrDb: number;
|
|
697
|
+
}[];
|
|
698
|
+
}[];
|
|
699
|
+
hypotheses: readonly {
|
|
700
|
+
id: string;
|
|
701
|
+
h3Cell: string;
|
|
702
|
+
dateIso: string;
|
|
703
|
+
lat: number;
|
|
704
|
+
lon: number;
|
|
705
|
+
altMeters: number;
|
|
706
|
+
estimatedStartEpochSec: number;
|
|
707
|
+
logPosterior: number;
|
|
708
|
+
probability: number;
|
|
709
|
+
rmsFreqResidualHz: number;
|
|
710
|
+
fisherInfo: readonly [number, number, number, number];
|
|
711
|
+
ellipseSemiMajorMeters: number;
|
|
712
|
+
ellipseSemiMinorMeters: number;
|
|
713
|
+
ellipseBearingDeg: number;
|
|
714
|
+
matches: readonly {
|
|
715
|
+
observationId: string;
|
|
716
|
+
segmentId: string;
|
|
717
|
+
}[];
|
|
718
|
+
}[];
|
|
719
|
+
};
|
|
720
|
+
};
|
|
721
|
+
type LocationSession = z.infer<typeof LocationSessionSchema>;
|
|
722
|
+
/**
|
|
723
|
+
* Portable dataset bundle containing 4D-RDP trajectory segments, constellation hash index, and elevation tiles.
|
|
724
|
+
*/
|
|
725
|
+
declare const DopplerDatasetSchema: z.ZodObject<{
|
|
726
|
+
version: z.ZodString;
|
|
727
|
+
generatedAtIso: z.ZodString;
|
|
728
|
+
segments: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
729
|
+
id: z.ZodString;
|
|
730
|
+
flightId: z.ZodString;
|
|
731
|
+
icao24: z.ZodString;
|
|
732
|
+
typeCode: z.ZodString;
|
|
733
|
+
category: z.ZodEnum<{
|
|
734
|
+
unknown: "unknown";
|
|
735
|
+
piston: "piston";
|
|
736
|
+
turboprop: "turboprop";
|
|
737
|
+
helicopter: "helicopter";
|
|
738
|
+
jet: "jet";
|
|
739
|
+
}> & {
|
|
740
|
+
readonly is: (value: unknown) => value is "unknown" | "piston" | "turboprop" | "helicopter" | "jet";
|
|
741
|
+
};
|
|
742
|
+
dateIso: z.ZodString;
|
|
743
|
+
startEpochSec: z.ZodNumber;
|
|
744
|
+
endEpochSec: z.ZodNumber;
|
|
745
|
+
startGeo: z.ZodObject<{
|
|
746
|
+
lat: z.ZodNumber;
|
|
747
|
+
lon: z.ZodNumber;
|
|
748
|
+
altMeters: z.ZodNumber;
|
|
749
|
+
}, z.core.$strip> & {
|
|
750
|
+
readonly is: (value: unknown) => value is {
|
|
751
|
+
lat: number;
|
|
752
|
+
lon: number;
|
|
753
|
+
altMeters: number;
|
|
754
|
+
};
|
|
755
|
+
};
|
|
756
|
+
endGeo: z.ZodObject<{
|
|
757
|
+
lat: z.ZodNumber;
|
|
758
|
+
lon: z.ZodNumber;
|
|
759
|
+
altMeters: z.ZodNumber;
|
|
760
|
+
}, z.core.$strip> & {
|
|
761
|
+
readonly is: (value: unknown) => value is {
|
|
762
|
+
lat: number;
|
|
763
|
+
lon: number;
|
|
764
|
+
altMeters: number;
|
|
765
|
+
};
|
|
766
|
+
};
|
|
767
|
+
groundspeedMps: z.ZodNumber;
|
|
768
|
+
h3Cell: z.ZodString;
|
|
769
|
+
}, z.core.$strip> & {
|
|
770
|
+
readonly is: (value: unknown) => value is {
|
|
771
|
+
id: string;
|
|
772
|
+
flightId: string;
|
|
773
|
+
icao24: string;
|
|
774
|
+
typeCode: string;
|
|
775
|
+
category: "unknown" | "piston" | "turboprop" | "helicopter" | "jet";
|
|
776
|
+
dateIso: string;
|
|
777
|
+
startEpochSec: number;
|
|
778
|
+
endEpochSec: number;
|
|
779
|
+
startGeo: {
|
|
780
|
+
lat: number;
|
|
781
|
+
lon: number;
|
|
782
|
+
altMeters: number;
|
|
783
|
+
};
|
|
784
|
+
endGeo: {
|
|
785
|
+
lat: number;
|
|
786
|
+
lon: number;
|
|
787
|
+
altMeters: number;
|
|
788
|
+
};
|
|
789
|
+
groundspeedMps: number;
|
|
790
|
+
h3Cell: string;
|
|
791
|
+
};
|
|
792
|
+
}>>;
|
|
793
|
+
constellations: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
794
|
+
hashKey: z.ZodString;
|
|
795
|
+
dateIso: z.ZodString;
|
|
796
|
+
h3Cell: z.ZodString;
|
|
797
|
+
centerLat: z.ZodNumber;
|
|
798
|
+
centerLon: z.ZodNumber;
|
|
799
|
+
segmentIdA: z.ZodString;
|
|
800
|
+
segmentIdB: z.ZodString;
|
|
801
|
+
speedAMps: z.ZodNumber;
|
|
802
|
+
speedBMps: z.ZodNumber;
|
|
803
|
+
cpaDelayedEpochSecA: z.ZodNumber;
|
|
804
|
+
cpaDelayedEpochSecB: z.ZodNumber;
|
|
805
|
+
deltaSec: z.ZodNumber;
|
|
806
|
+
}, z.core.$strip> & {
|
|
807
|
+
readonly is: (value: unknown) => value is {
|
|
808
|
+
hashKey: string;
|
|
809
|
+
dateIso: string;
|
|
810
|
+
h3Cell: string;
|
|
811
|
+
centerLat: number;
|
|
812
|
+
centerLon: number;
|
|
813
|
+
segmentIdA: string;
|
|
814
|
+
segmentIdB: string;
|
|
815
|
+
speedAMps: number;
|
|
816
|
+
speedBMps: number;
|
|
817
|
+
cpaDelayedEpochSecA: number;
|
|
818
|
+
cpaDelayedEpochSecB: number;
|
|
819
|
+
deltaSec: number;
|
|
820
|
+
};
|
|
821
|
+
}>>;
|
|
822
|
+
elevationGrid: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
823
|
+
lat: z.ZodNumber;
|
|
824
|
+
lon: z.ZodNumber;
|
|
825
|
+
altMeters: z.ZodNumber;
|
|
826
|
+
}, z.core.$strip> & {
|
|
827
|
+
readonly is: (value: unknown) => value is {
|
|
828
|
+
lat: number;
|
|
829
|
+
lon: number;
|
|
830
|
+
altMeters: number;
|
|
831
|
+
};
|
|
832
|
+
}>>;
|
|
833
|
+
}, z.core.$strip> & {
|
|
834
|
+
readonly is: (value: unknown) => value is {
|
|
835
|
+
version: string;
|
|
836
|
+
generatedAtIso: string;
|
|
837
|
+
segments: readonly {
|
|
838
|
+
id: string;
|
|
839
|
+
flightId: string;
|
|
840
|
+
icao24: string;
|
|
841
|
+
typeCode: string;
|
|
842
|
+
category: "unknown" | "piston" | "turboprop" | "helicopter" | "jet";
|
|
843
|
+
dateIso: string;
|
|
844
|
+
startEpochSec: number;
|
|
845
|
+
endEpochSec: number;
|
|
846
|
+
startGeo: {
|
|
847
|
+
lat: number;
|
|
848
|
+
lon: number;
|
|
849
|
+
altMeters: number;
|
|
850
|
+
};
|
|
851
|
+
endGeo: {
|
|
852
|
+
lat: number;
|
|
853
|
+
lon: number;
|
|
854
|
+
altMeters: number;
|
|
855
|
+
};
|
|
856
|
+
groundspeedMps: number;
|
|
857
|
+
h3Cell: string;
|
|
858
|
+
}[];
|
|
859
|
+
constellations: readonly {
|
|
860
|
+
hashKey: string;
|
|
861
|
+
dateIso: string;
|
|
862
|
+
h3Cell: string;
|
|
863
|
+
centerLat: number;
|
|
864
|
+
centerLon: number;
|
|
865
|
+
segmentIdA: string;
|
|
866
|
+
segmentIdB: string;
|
|
867
|
+
speedAMps: number;
|
|
868
|
+
speedBMps: number;
|
|
869
|
+
cpaDelayedEpochSecA: number;
|
|
870
|
+
cpaDelayedEpochSecB: number;
|
|
871
|
+
deltaSec: number;
|
|
872
|
+
}[];
|
|
873
|
+
elevationGrid: readonly {
|
|
874
|
+
lat: number;
|
|
875
|
+
lon: number;
|
|
876
|
+
altMeters: number;
|
|
877
|
+
}[];
|
|
878
|
+
};
|
|
879
|
+
};
|
|
880
|
+
type DopplerDataset = z.infer<typeof DopplerDatasetSchema>;
|
|
881
|
+
/**
|
|
882
|
+
* A Zod schema that also carries the schema-attached type guard `is`.
|
|
883
|
+
*/
|
|
884
|
+
type Guarded<T extends z.ZodType> = T & {
|
|
885
|
+
readonly is: (value: unknown) => value is z.infer<T>;
|
|
886
|
+
};
|
|
887
|
+
/**
|
|
888
|
+
* Attaches a type guard to a Zod schema (the schema-attached guard pattern: validation, inference and narrowing share one definition, so the three cannot drift). The guard is defined on the schema object itself, because a Zod 4 schema keeps its methods on its prototype and its parse state on `_zod`: a spread copy loses the methods, so it could no longer be parsed or nested in another schema.
|
|
889
|
+
* @param schema - The schema to augment.
|
|
890
|
+
* @returns The same schema object, now also carrying `is`.
|
|
891
|
+
* @throws When the schema is non-extensible, so the guard cannot be attached, or when the property was not installed.
|
|
892
|
+
*/
|
|
893
|
+
declare function define<T extends z.ZodType>(schema: T): Guarded<T>;
|
|
894
|
+
/**
|
|
895
|
+
* Reads an own property of a record keyed by strings that come from data. A plain `record[key]` read follows the prototype chain, so a key such as `constructor` would find an inherited function instead of reporting absence.
|
|
896
|
+
* @param record - The record to read.
|
|
897
|
+
* @param key - Any string.
|
|
898
|
+
* @returns The own property's value, or `undefined` when the record has no such own property.
|
|
899
|
+
*/
|
|
900
|
+
declare function getOwn<Value>(record: Readonly<Record<string, Value>>, key: string): Value | undefined;
|
|
901
|
+
/**
|
|
902
|
+
* A record whose every key must satisfy `key`. Zod's own record silently drops an own `__proto__` key (which `JSON.parse` creates as an ordinary property) before the key schema sees it, so this checks the raw input first and rejects such a key loudly instead of losing the value.
|
|
903
|
+
* @param key - The key schema.
|
|
904
|
+
* @param value - The value schema.
|
|
905
|
+
* @returns The record schema.
|
|
906
|
+
*/
|
|
907
|
+
declare function recordOf<Value extends z.ZodType>(key: z.ZodString, value: Value): z.ZodPreprocess<z.ZodRecord<z.ZodString, Value>>;
|
|
908
|
+
/** Half a turn in degrees: the span from the prime meridian to the antimeridian, and the divisor of the degrees-to-radians factor (a half turn is pi radians). */
|
|
909
|
+
declare const HALF_TURN_DEG = 180;
|
|
910
|
+
/** A full turn in degrees, the period of longitude. */
|
|
911
|
+
declare const FULL_TURN_DEG: number;
|
|
912
|
+
/**
|
|
913
|
+
* Converts a geodetic coordinate (latitude, longitude, altitude) to Earth-Centered, Earth-Fixed (ECEF) Cartesian coordinates in meters.
|
|
914
|
+
* @param point - Geodetic coordinate on or above WGS84.
|
|
915
|
+
* @returns ECEF vector in meters.
|
|
916
|
+
*/
|
|
917
|
+
declare function geoToEcef(point: Readonly<GeoPoint3D>): Vector3D;
|
|
918
|
+
/**
|
|
919
|
+
* Converts a global displacement between two geodetic points into local East-North-Up (ENU) meters relative to the origin point.
|
|
920
|
+
* @param origin - Reference observer coordinate.
|
|
921
|
+
* @param target - Target aircraft or ground coordinate.
|
|
922
|
+
* @returns Local tangent-plane ENU vector in meters (x = East, y = North, z = Up).
|
|
923
|
+
*/
|
|
924
|
+
declare function geoToLocalEnu(origin: Readonly<GeoPoint3D>, target: Readonly<GeoPoint3D>): Vector3D;
|
|
925
|
+
/**
|
|
926
|
+
* Projects a local East-North-Up (ENU) offset in meters from a reference geodetic origin back to geodetic coordinates.
|
|
927
|
+
* @param origin - Reference coordinate.
|
|
928
|
+
* @param enuOffset - Offset in local meters (x = East, y = North, z = Up).
|
|
929
|
+
* @returns Resulting geodetic coordinate.
|
|
930
|
+
*/
|
|
931
|
+
declare function localEnuToGeo(origin: Readonly<GeoPoint3D>, enuOffset: Readonly<Vector3D>): GeoPoint3D;
|
|
932
|
+
/** Grid resolution tier that `encodeSpatialCell` uses when the caller does not choose one (about 3.5 km cells). */
|
|
933
|
+
declare const DEFAULT_SPATIAL_RESOLUTION = 6;
|
|
934
|
+
/** Boundary vertices used to approximate an ellipse outline when the caller does not choose a count. */
|
|
935
|
+
declare const DEFAULT_ELLIPSE_SEGMENTS = 72;
|
|
936
|
+
/** A horizontal ellipse on the ground: semi-axes in metres and the compass bearing of the major axis. */
|
|
937
|
+
interface HorizontalEllipse {
|
|
938
|
+
readonly ellipseSemiMajorMeters: number;
|
|
939
|
+
readonly ellipseSemiMinorMeters: number;
|
|
940
|
+
readonly ellipseBearingDeg: number;
|
|
941
|
+
}
|
|
942
|
+
/**
|
|
943
|
+
* Samples the outline of a horizontal confidence ellipse as geodetic points. The axes are metric distances on the local tangent plane, so the outline keeps its true shape at any latitude, where a degree of longitude is shorter than a degree of latitude.
|
|
944
|
+
* @param center - Ellipse centre; every returned point keeps its altitude.
|
|
945
|
+
* @param ellipse - Semi-axes in metres and the compass bearing of the semi-major axis in degrees clockwise from north, as `fisherToConfidenceEllipse95` returns them.
|
|
946
|
+
* @param segments - Number of boundary segments. The returned ring repeats its first point, so it holds `segments + 1` points.
|
|
947
|
+
* @returns Closed ring of boundary points, starting due along the major axis.
|
|
948
|
+
*/
|
|
949
|
+
declare function ellipseOutline(center: Readonly<GeoPoint3D>, ellipse: Readonly<HorizontalEllipse>, segments?: number): readonly GeoPoint3D[];
|
|
950
|
+
/**
|
|
951
|
+
* Computes the 3D Euclidean slant distance in meters between two geodetic coordinates.
|
|
952
|
+
* @param a - First 3D point.
|
|
953
|
+
* @param b - Second 3D point.
|
|
954
|
+
* @returns Slant distance in meters.
|
|
955
|
+
*/
|
|
956
|
+
declare function slantDistanceMeters(a: Readonly<GeoPoint3D>, b: Readonly<GeoPoint3D>): number;
|
|
957
|
+
/**
|
|
958
|
+
* Encodes a latitude/longitude coordinate into a deterministic hierarchical spatial cell identifier at a given resolution step.
|
|
959
|
+
* @param lat - Latitude in degrees.
|
|
960
|
+
* @param lon - Longitude in degrees.
|
|
961
|
+
* @param resolution - Grid resolution tier (4 = ~20km, 6 = ~3.5km, 8 = ~500m).
|
|
962
|
+
* @returns Deterministic cell string identifier.
|
|
963
|
+
*/
|
|
964
|
+
declare function encodeSpatialCell(lat: number, lon: number, resolution?: number): string;
|
|
965
|
+
/**
|
|
966
|
+
* Decodes a spatial cell identifier back to its center latitude and longitude in degrees.
|
|
967
|
+
* @param cellId - Spatial cell identifier produced by `encodeSpatialCell`.
|
|
968
|
+
* @returns Center latitude and longitude in degrees.
|
|
969
|
+
*/
|
|
970
|
+
declare function decodeSpatialCellCenter(cellId: string): {
|
|
971
|
+
readonly lat: number;
|
|
972
|
+
readonly lon: number;
|
|
973
|
+
};
|
|
974
|
+
/**
|
|
975
|
+
* Evaluates terrain elevation at a target coordinate via inverse-distance-weighted interpolation over a DEM grid.
|
|
976
|
+
* @param lat - Target latitude in degrees.
|
|
977
|
+
* @param lon - Target longitude in degrees.
|
|
978
|
+
* @param demGrid - Sparse or regular grid of elevation samples.
|
|
979
|
+
* @returns Interpolated terrain elevation in meters above sea level.
|
|
980
|
+
*/
|
|
981
|
+
declare function interpolateTerrainElevationMeters(lat: number, lon: number, demGrid: readonly GeoPoint3D[]): number;
|
|
982
|
+
/** Speed of sound in dry air at 20 degrees Celsius in m/s, rounded to the nearest metre per second (`sqrt(GAMMA_DRY_AIR * R_DRY_AIR * 293.15)` is about 343.2). The default wherever a caller gives no temperature. */
|
|
983
|
+
declare const DEFAULT_SOUND_SPEED_MPS = 343;
|
|
984
|
+
/**
|
|
985
|
+
* Atmospheric state for acoustic wave propagation.
|
|
986
|
+
*/
|
|
987
|
+
interface AtmosphereState {
|
|
988
|
+
readonly groundTempCelsius: number;
|
|
989
|
+
readonly groundAltitudeMeters: number;
|
|
990
|
+
readonly windEnuMps?: Readonly<Vector3D>;
|
|
991
|
+
}
|
|
992
|
+
/**
|
|
993
|
+
* Computes the local phase speed of sound in meters per second at a given temperature in Celsius.
|
|
994
|
+
* @param tempCelsius - Ambient air temperature in degrees Celsius.
|
|
995
|
+
* @returns Speed of sound in m/s.
|
|
996
|
+
*/
|
|
997
|
+
declare function speedOfSoundAtTempMps(tempCelsius: number): number;
|
|
998
|
+
/**
|
|
999
|
+
* Computes the effective path-integrated speed of sound between an aircraft at altitude and a ground observer, accounting for the tropospheric temperature lapse rate and wind advection along the line of sight.
|
|
1000
|
+
* @param atmosphere - Ground temperature, elevation, and optional wind vector.
|
|
1001
|
+
* @param aircraftAltMeters - Aircraft altitude above sea level in meters.
|
|
1002
|
+
* @param unitPropagationDirEnu - Unit vector pointing from the aircraft to the observer in local ENU coordinates.
|
|
1003
|
+
* @returns Effective acoustic propagation speed in m/s along the ray path.
|
|
1004
|
+
*/
|
|
1005
|
+
declare function effectiveRaySoundSpeedMps(atmosphere: Readonly<AtmosphereState>, aircraftAltMeters: number, unitPropagationDirEnu?: Readonly<Vector3D>): number;
|
|
1006
|
+
/**
|
|
1007
|
+
* Input measurements from a spectrogram Doppler S-curve.
|
|
1008
|
+
*/
|
|
1009
|
+
interface DopplerCurveMeasurement {
|
|
1010
|
+
readonly asymptoticHighHz: number;
|
|
1011
|
+
readonly asymptoticLowHz: number;
|
|
1012
|
+
readonly inflectionSlopeHzPerSec: number;
|
|
1013
|
+
readonly soundSpeedMps?: number;
|
|
1014
|
+
readonly freqMeasurementStdHz?: number;
|
|
1015
|
+
readonly slopeMeasurementRelStd?: number;
|
|
1016
|
+
}
|
|
1017
|
+
/**
|
|
1018
|
+
* Separates aircraft groundspeed `v`, unshifted engine fundamental `f0`, and 3D Closest Point of Approach (CPA) slant distance `d_slant` in O(1) closed-form algebra directly from a Doppler curve's asymptotes and inflection slope.
|
|
1019
|
+
*
|
|
1020
|
+
* Because `f+ / f- = (1 + v/c) / (1 - v/c)`, the unknown engine base pitch `f0` cancels out identically:
|
|
1021
|
+
* - `v = c * (f+ - f-) / (f+ + f-)`
|
|
1022
|
+
* - `f0 = 2 * f+ * f- / (f+ + f-)` (the harmonic mean)
|
|
1023
|
+
* - `d_slant = - (f0 * v^2) / (c * df/dt|_CPA)`
|
|
1024
|
+
* @param measurement - Measured approaching/receding frequencies and inflection slope.
|
|
1025
|
+
* @returns Closed-form kinematic parameters and propagated standard deviations.
|
|
1026
|
+
*/
|
|
1027
|
+
declare function extractAsymptoticKinematics(measurement: Readonly<DopplerCurveMeasurement>): AsymptoticKinematics;
|
|
1028
|
+
/**
|
|
1029
|
+
* Evaluated acoustic state of an aircraft at a specific observer reception timestamp.
|
|
1030
|
+
*/
|
|
1031
|
+
interface RetardedAcousticPoint {
|
|
1032
|
+
readonly obsTimeSec: number;
|
|
1033
|
+
readonly emitTimeSec: number;
|
|
1034
|
+
readonly delaySec: number;
|
|
1035
|
+
readonly slantDistanceMeters: number;
|
|
1036
|
+
readonly radialVelocityMps: number;
|
|
1037
|
+
readonly observedFreqHz: number;
|
|
1038
|
+
}
|
|
1039
|
+
/**
|
|
1040
|
+
* Solves the exact subsonic Liénard-Wiechert retarded-time propagation delay `Δt = t_obs - t_emit` in closed form for a uniform linear trajectory segment.
|
|
1041
|
+
*
|
|
1042
|
+
* Given an aircraft position `r(t_emit) = r(t_obs) - v * Δt`, the acoustic propagation condition
|
|
1043
|
+
* `c^2 * Δt^2 = || r(t_obs) - x_obs - v * Δt ||^2` is a quadratic equation in `Δt`:
|
|
1044
|
+
* `(c^2 - v^2) * Δt^2 + 2 * (Δr · v) * Δt - ||Δr||^2 = 0`
|
|
1045
|
+
* @param deltaPosEnu - Displacement vector `r(t_obs) - x_obs` in local ENU meters at reception time `t_obs`.
|
|
1046
|
+
* @param velocityEnu - Aircraft velocity vector in local ENU meters per second.
|
|
1047
|
+
* @param soundSpeedMps - Local speed of sound in meters per second.
|
|
1048
|
+
* @returns Exact retarded propagation delay `Δt >= 0` in seconds.
|
|
1049
|
+
*/
|
|
1050
|
+
declare function solveRetardedDelaySec(deltaPosEnu: Readonly<{
|
|
1051
|
+
readonly x: number;
|
|
1052
|
+
readonly y: number;
|
|
1053
|
+
readonly z: number;
|
|
1054
|
+
}>, velocityEnu: Readonly<{
|
|
1055
|
+
readonly x: number;
|
|
1056
|
+
readonly y: number;
|
|
1057
|
+
readonly z: number;
|
|
1058
|
+
}>, soundSpeedMps: number): number;
|
|
1059
|
+
/**
|
|
1060
|
+
* Computes the analytical Closest Point of Approach (CPA) emission time, delayed reception time, and 3D slant distance for an observer relative to a linear flight segment.
|
|
1061
|
+
* @param observer - Candidate ground observer 3D coordinate.
|
|
1062
|
+
* @param segment - Linear flight segment.
|
|
1063
|
+
* @param soundSpeedMps - Effective speed of sound in m/s.
|
|
1064
|
+
* @returns Emission CPA timestamp, delayed observer CPA timestamp, and minimum 3D slant distance in meters.
|
|
1065
|
+
*/
|
|
1066
|
+
declare function computeSegmentCpa(observer: Readonly<GeoPoint3D>, segment: Readonly<LinearFlightSegment>, soundSpeedMps?: number): {
|
|
1067
|
+
readonly cpaEmitEpochSec: number;
|
|
1068
|
+
readonly cpaDelayedEpochSec: number;
|
|
1069
|
+
readonly cpaSlantMeters: number;
|
|
1070
|
+
};
|
|
1071
|
+
/**
|
|
1072
|
+
* Options for synthesizing retarded-time Doppler curves.
|
|
1073
|
+
*/
|
|
1074
|
+
interface SynthesizeCurveOptions {
|
|
1075
|
+
readonly baseFreqHz: number;
|
|
1076
|
+
readonly obsEpochTimesSec: readonly number[];
|
|
1077
|
+
readonly soundSpeedMps?: number;
|
|
1078
|
+
}
|
|
1079
|
+
/**
|
|
1080
|
+
* Synthesizes the exact retarded-time Doppler curve observed on the ground for a linear flight segment at specified reception timestamps.
|
|
1081
|
+
* @param observer - Ground observer 3D coordinate.
|
|
1082
|
+
* @param segment - Linear flight segment.
|
|
1083
|
+
* @param options - Base frequency, observation timestamps, and optional sound speed.
|
|
1084
|
+
* @returns Evaluated retarded acoustic trajectory at each reception timestamp.
|
|
1085
|
+
*/
|
|
1086
|
+
declare function synthesizeRetardedDopplerCurve(observer: Readonly<GeoPoint3D>, segment: Readonly<LinearFlightSegment>, options: Readonly<SynthesizeCurveOptions>): RetardedAcousticPoint[];
|
|
1087
|
+
/**
|
|
1088
|
+
* Metadata describing an aircraft trace being compressed into 4D linear segments.
|
|
1089
|
+
*/
|
|
1090
|
+
interface TraceMetadata {
|
|
1091
|
+
readonly flightId: string;
|
|
1092
|
+
readonly icao24: string;
|
|
1093
|
+
readonly typeCode: string;
|
|
1094
|
+
readonly category: AircraftCategory;
|
|
1095
|
+
readonly dateIso: string;
|
|
1096
|
+
}
|
|
1097
|
+
/**
|
|
1098
|
+
* Compresses a sequence of raw 1 Hz ADS-B pings into piecewise-linear 4D segments (`LinearFlightSegment`) with bounded spatiotemporal error.
|
|
1099
|
+
* @param pings - Chronologically ordered raw ADS-B pings.
|
|
1100
|
+
* @param meta - Flight and aircraft metadata.
|
|
1101
|
+
* @param toleranceMeters - Maximum allowed 3D interpolation error in meters (default 5 m).
|
|
1102
|
+
* @returns Array of compressed linear trajectory segments.
|
|
1103
|
+
*/
|
|
1104
|
+
declare function simplifyTrajectory4D(pings: readonly AdsbPing[], meta: Readonly<TraceMetadata>, toleranceMeters?: number): LinearFlightSegment[];
|
|
1105
|
+
/**
|
|
1106
|
+
* A complex sequence stored as separate real and imaginary component arrays of equal length.
|
|
1107
|
+
*/
|
|
1108
|
+
interface ComplexSpectrum {
|
|
1109
|
+
readonly real: Float64Array;
|
|
1110
|
+
readonly imag: Float64Array;
|
|
1111
|
+
}
|
|
1112
|
+
/**
|
|
1113
|
+
* Computes a Radix-2 Cooley-Tukey Complex Fast Fourier Transform without modifying its inputs: the samples are gathered into freshly allocated arrays in bit-reversed order and the butterflies run on those arrays.
|
|
1114
|
+
* @param real - Real components array of power-of-two length N.
|
|
1115
|
+
* @param imag - Imaginary components array of the same length N.
|
|
1116
|
+
* @returns The forward transform (negative-exponent convention, unnormalised) as new arrays.
|
|
1117
|
+
* @throws When N is not a positive power of two or the two arrays differ in length.
|
|
1118
|
+
*/
|
|
1119
|
+
declare function fft(real: Readonly<Float64Array>, imag: Readonly<Float64Array>): ComplexSpectrum;
|
|
1120
|
+
/**
|
|
1121
|
+
* Computes the one-sided Hann-windowed power spectrum in decibels for a real-valued frame.
|
|
1122
|
+
* @param samples - Input time-domain samples.
|
|
1123
|
+
* @param fftSize - Power-of-two FFT size (zero-padded if `samples.length < fftSize`).
|
|
1124
|
+
* @returns One-sided power spectrum in dB (`length = fftSize / 2 + 1`).
|
|
1125
|
+
*/
|
|
1126
|
+
declare function computeHannPowerSpectrumDb(samples: Readonly<Float32Array>, fftSize: number): Float64Array;
|
|
1127
|
+
/**
|
|
1128
|
+
* Averages equal-length audio channels into one mono signal.
|
|
1129
|
+
* @param channels - One sample array per channel; at least one, all of the same length.
|
|
1130
|
+
* @returns The mono signal. A single channel is returned as a copy, never the caller's array.
|
|
1131
|
+
*/
|
|
1132
|
+
declare function downmixToMono(channels: readonly Readonly<Float32Array>[]): Float32Array;
|
|
1133
|
+
/**
|
|
1134
|
+
* Designs a normalized Blackman-windowed sinc low-pass FIR filter kernel.
|
|
1135
|
+
* @param cutoffHz - Low-pass cutoff frequency in Hz.
|
|
1136
|
+
* @param sampleRateHz - Input sample rate in Hz.
|
|
1137
|
+
* @param numTaps - Odd number of FIR filter taps.
|
|
1138
|
+
* @returns Normalized FIR filter coefficients.
|
|
1139
|
+
*/
|
|
1140
|
+
declare function designLowPassFirKernel(cutoffHz: number, sampleRateHz: number, numTaps?: number): Float64Array;
|
|
1141
|
+
/**
|
|
1142
|
+
* Decimates a high-sample-rate audio buffer (e.g. 48,000 Hz) down to a target sub-kilohertz/low-kilohertz rate (e.g. 2,000 Hz) after applying an anti-aliasing FIR low-pass filter.
|
|
1143
|
+
* @param input - Input mono audio samples.
|
|
1144
|
+
* @param inputRateHz - Original sample rate in Hz (e.g. 48000).
|
|
1145
|
+
* @param targetRateHz - Decimated sample rate in Hz (default `ANALYSIS_SAMPLE_RATE_HZ`).
|
|
1146
|
+
* @returns Decimated mono audio samples and actual output sample rate.
|
|
1147
|
+
*/
|
|
1148
|
+
declare function decimateAudioStream(input: Readonly<Float32Array>, inputRateHz: number, targetRateHz?: number): {
|
|
1149
|
+
readonly samples: Float32Array;
|
|
1150
|
+
readonly sampleRateHz: number;
|
|
1151
|
+
};
|
|
1152
|
+
/**
|
|
1153
|
+
* Single Short-Time Fourier Transform (STFT) frame in the aircraft Doppler band (65 to 500 Hz by default).
|
|
1154
|
+
*/
|
|
1155
|
+
interface SpectrogramFrame {
|
|
1156
|
+
readonly timeSec: number;
|
|
1157
|
+
readonly powerDb: Float64Array;
|
|
1158
|
+
readonly medianNoiseFloorDb: number;
|
|
1159
|
+
readonly peakFreqHz: number;
|
|
1160
|
+
readonly peakPowerDb: number;
|
|
1161
|
+
readonly peakSnrDb: number;
|
|
1162
|
+
readonly noisePolluted: boolean;
|
|
1163
|
+
}
|
|
1164
|
+
/**
|
|
1165
|
+
* Computed spectrogram grid and continuous noise-floor telemetry over an audio recording or episode window.
|
|
1166
|
+
*/
|
|
1167
|
+
interface DopplerSpectrogram {
|
|
1168
|
+
readonly sampleRateHz: number;
|
|
1169
|
+
readonly fftSize: number;
|
|
1170
|
+
readonly minFreqHz: number;
|
|
1171
|
+
readonly maxFreqHz: number;
|
|
1172
|
+
readonly minBin: number;
|
|
1173
|
+
readonly maxBin: number;
|
|
1174
|
+
readonly binStepHz: number;
|
|
1175
|
+
readonly frames: readonly SpectrogramFrame[];
|
|
1176
|
+
readonly quietIntervals: readonly QuietInterval[];
|
|
1177
|
+
readonly overallMedianNoiseDb: number;
|
|
1178
|
+
}
|
|
1179
|
+
/**
|
|
1180
|
+
* Configuration options for computing a Doppler spectrogram.
|
|
1181
|
+
*/
|
|
1182
|
+
interface SpectrogramOptions {
|
|
1183
|
+
readonly sampleRateHz: number;
|
|
1184
|
+
readonly startTimeSec?: number;
|
|
1185
|
+
readonly fftSize?: number;
|
|
1186
|
+
readonly hopSamples?: number;
|
|
1187
|
+
readonly minFreqHz?: number;
|
|
1188
|
+
readonly maxFreqHz?: number;
|
|
1189
|
+
readonly noisePollutionThresholdDb?: number;
|
|
1190
|
+
}
|
|
1191
|
+
/**
|
|
1192
|
+
* Options for computing an isolated single STFT frame.
|
|
1193
|
+
*/
|
|
1194
|
+
interface SingleFrameOptions {
|
|
1195
|
+
readonly sampleRateHz: number;
|
|
1196
|
+
readonly fftSize?: number;
|
|
1197
|
+
readonly minFreqHz?: number;
|
|
1198
|
+
readonly maxFreqHz?: number;
|
|
1199
|
+
readonly timeSec?: number;
|
|
1200
|
+
readonly noisePollutionThresholdDb?: number;
|
|
1201
|
+
readonly baselineNoiseDb?: number;
|
|
1202
|
+
}
|
|
1203
|
+
/**
|
|
1204
|
+
* Result of computing an isolated single STFT frame, including bin boundaries and frequency step.
|
|
1205
|
+
*/
|
|
1206
|
+
interface ComputedSingleFrame extends SpectrogramFrame {
|
|
1207
|
+
readonly minBin: number;
|
|
1208
|
+
readonly maxBin: number;
|
|
1209
|
+
readonly binStepHz: number;
|
|
1210
|
+
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Computes an isolated single STFT spectrogram frame over a single time window.
|
|
1213
|
+
* @param windowSlice - Time-domain audio slice (length must match fftSize).
|
|
1214
|
+
* @param options - Single frame computation options.
|
|
1215
|
+
* @returns Computed STFT frame, peak tracking values, and frequency bin parameters.
|
|
1216
|
+
*/
|
|
1217
|
+
declare function computeSingleSpectrogramFrame(windowSlice: Readonly<Float32Array>, options: Readonly<SingleFrameOptions>): ComputedSingleFrame;
|
|
1218
|
+
/**
|
|
1219
|
+
* Computes a high-resolution spectrogram focused on the aircraft acoustic Doppler band (65 to 500 Hz by default), with parabolic sub-bin peak interpolation and continuous noise-pollution gating.
|
|
1220
|
+
* @param samples - Decimated mono audio samples (typically at 2,000 Hz).
|
|
1221
|
+
* @param options - Spectrogram configuration parameters.
|
|
1222
|
+
* @returns Spectrogram frames, sub-bin peak tracks, and quiet intervals where silence filtering is valid.
|
|
1223
|
+
*/
|
|
1224
|
+
declare function computeDopplerSpectrogram(samples: Readonly<Float32Array>, options: Readonly<SpectrogramOptions>): DopplerSpectrogram;
|
|
1225
|
+
/**
|
|
1226
|
+
* Options for extracting Doppler S-curve observations from a spectrogram.
|
|
1227
|
+
*/
|
|
1228
|
+
interface RidgeTrackerOptions {
|
|
1229
|
+
readonly episodeId: string;
|
|
1230
|
+
readonly minSnrDb?: number;
|
|
1231
|
+
readonly minDurationSec?: number;
|
|
1232
|
+
readonly minFreqDropHz?: number;
|
|
1233
|
+
readonly soundSpeedMps?: number;
|
|
1234
|
+
}
|
|
1235
|
+
/**
|
|
1236
|
+
* Extracts Doppler S-curve observations from a spectrogram, down-weighting noise-polluted frames and computing closed-form kinematics for each detected flyover.
|
|
1237
|
+
* @param spectrogram - Computed spectrogram with noise-pollution flags.
|
|
1238
|
+
* @param options - Tracker thresholds and episode context.
|
|
1239
|
+
* @returns Array of detected aircraft Doppler observations.
|
|
1240
|
+
*/
|
|
1241
|
+
declare function extractDopplerObservations(spectrogram: Readonly<DopplerSpectrogram>, options: Readonly<RidgeTrackerOptions>): DopplerObservation[];
|
|
1242
|
+
/**
|
|
1243
|
+
* Result of 1D emission-time de-chirping matched-filter evaluation.
|
|
1244
|
+
*/
|
|
1245
|
+
interface DechirpScoreResult {
|
|
1246
|
+
readonly coherentSnrDb: number;
|
|
1247
|
+
readonly recoveredBaseFreqHz: number;
|
|
1248
|
+
readonly resampledSamples: Float32Array;
|
|
1249
|
+
}
|
|
1250
|
+
/**
|
|
1251
|
+
* Options for emission-domain de-chirping analysis.
|
|
1252
|
+
*/
|
|
1253
|
+
interface DechirpOptions {
|
|
1254
|
+
readonly sampleRateHz: number;
|
|
1255
|
+
readonly bufferStartEpochSec: number;
|
|
1256
|
+
readonly observer: Readonly<GeoPoint3D>;
|
|
1257
|
+
readonly segment: Readonly<LinearFlightSegment>;
|
|
1258
|
+
readonly expectedBaseFreqHz: number;
|
|
1259
|
+
readonly soundSpeedMps?: number;
|
|
1260
|
+
}
|
|
1261
|
+
/**
|
|
1262
|
+
* Evaluates a candidate observer coordinate and aircraft segment by resampling the raw 1D audio signal onto uniform aircraft emission times `t_emit`.
|
|
1263
|
+
*
|
|
1264
|
+
* Because `t_obs(t_emit) = t_emit + || r(t_emit) - x_obs || / c`, sampling the microphone waveform at `t_obs(t_emit)` undoes the Doppler time-dilation and collapses the curved 2-minute Doppler S-curve into a single stationary sinusoid at `f0`, providing ~20 dB of coherent FFT integration gain.
|
|
1265
|
+
* @param samples - Decimated mono audio buffer.
|
|
1266
|
+
* @param options - Dechirp options including observer, segment, and expected frequency.
|
|
1267
|
+
* @returns Coherent FFT SNR in dB, recovered stationary peak frequency, and de-warped waveform.
|
|
1268
|
+
*/
|
|
1269
|
+
declare function scoreByEmissionDechirping(samples: Readonly<Float32Array>, options: Readonly<DechirpOptions>): DechirpScoreResult;
|
|
1270
|
+
/**
|
|
1271
|
+
* Nominal frequency in Hz of a 50 Hz mains grid (Europe, the UK, Asia, Africa, Australia and eastern Japan).
|
|
1272
|
+
*/
|
|
1273
|
+
declare const GRID_50_NOMINAL_HZ = 50;
|
|
1274
|
+
/**
|
|
1275
|
+
* Nominal frequency in Hz of a 60 Hz mains grid (North America, South Korea, Taiwan and western Japan).
|
|
1276
|
+
*/
|
|
1277
|
+
declare const GRID_60_NOMINAL_HZ = 60;
|
|
1278
|
+
/**
|
|
1279
|
+
* A nominal mains-grid frequency that synthetic audio can carry as electric network hum.
|
|
1280
|
+
*/
|
|
1281
|
+
type NominalGridHz = typeof GRID_50_NOMINAL_HZ | typeof GRID_60_NOMINAL_HZ;
|
|
1282
|
+
/**
|
|
1283
|
+
* Detects passive 50.00 Hz vs 60.00 Hz Electrical Network Frequency (ENF) mains hum in an audio buffer to split the global search space by power-grid hemisphere.
|
|
1284
|
+
* @param samples - Audio samples.
|
|
1285
|
+
* @param sampleRateHz - Sample rate in Hz.
|
|
1286
|
+
* @returns Detected ENF nominal grid (50 Hz, 60 Hz, or unknown), SNR, and geographic region hint.
|
|
1287
|
+
*/
|
|
1288
|
+
declare function detectEnfSignature(samples: Readonly<Float32Array>, sampleRateHz: number): EnfSignature;
|
|
1289
|
+
/**
|
|
1290
|
+
* Estimates ambient air temperature in degrees Celsius from cricket stridulation rate using Dolbear's Law (`T_C = 10 + (N_60 - 40) / 7`).
|
|
1291
|
+
* @param chirpsPerMinute - Measured insect stridulation modulation pulses per minute.
|
|
1292
|
+
* @returns Estimated ambient temperature in degrees Celsius.
|
|
1293
|
+
*/
|
|
1294
|
+
declare function estimateTempFromCricketChirpsCelsius(chirpsPerMinute: number): number;
|
|
1295
|
+
/**
|
|
1296
|
+
* Parameters for synthesizing a realistic acoustic recording containing aircraft Doppler flyovers, optional 50/60 Hz ENF hum, and optional transient noise pollution bursts.
|
|
1297
|
+
*/
|
|
1298
|
+
interface SyntheticAudioConfig {
|
|
1299
|
+
readonly sampleRateHz: number;
|
|
1300
|
+
readonly startEpochSec: number;
|
|
1301
|
+
readonly durationSec: number;
|
|
1302
|
+
readonly observer: Readonly<GeoPoint3D>;
|
|
1303
|
+
readonly flyovers: readonly {
|
|
1304
|
+
readonly segment: Readonly<LinearFlightSegment>;
|
|
1305
|
+
readonly baseFreqHz: number;
|
|
1306
|
+
readonly amplitude: number;
|
|
1307
|
+
}[];
|
|
1308
|
+
readonly enfNominalHz?: NominalGridHz;
|
|
1309
|
+
readonly enfAmplitude?: number;
|
|
1310
|
+
readonly noiseStd?: number;
|
|
1311
|
+
readonly noisePollutionBursts?: readonly {
|
|
1312
|
+
readonly startOffsetSec: number;
|
|
1313
|
+
readonly endOffsetSec: number;
|
|
1314
|
+
readonly burstNoiseStd: number;
|
|
1315
|
+
}[];
|
|
1316
|
+
}
|
|
1317
|
+
/**
|
|
1318
|
+
* Synthesizes a realistic time-domain waveform (continuous phase integration of retarded Doppler frequencies + harmonics + ENF hum + deterministic pseudo-random noise) for testing, simulation, and verification.
|
|
1319
|
+
* @param config - Simulation configuration.
|
|
1320
|
+
* @returns Synthesized mono `Float32Array` audio buffer.
|
|
1321
|
+
*/
|
|
1322
|
+
declare function synthesizeMultiFlyoverAudio(config: Readonly<SyntheticAudioConfig>): Float32Array;
|
|
1323
|
+
/**
|
|
1324
|
+
* Decodes a RIFF WAVE byte buffer into mono samples and its sample rate. Chunks are located by walking the chunk list, so metadata chunks (`JUNK`, `bext`, `LIST`) before `fmt ` or `data` are skipped, and an odd-sized chunk's pad byte is honoured. Multi-channel audio is averaged to mono.
|
|
1325
|
+
* @param wavBytes - Raw `.wav` file bytes.
|
|
1326
|
+
* @returns Decoded mono samples in `[-1, 1]` and the sample rate in Hz.
|
|
1327
|
+
* @throws When the buffer is not RIFF/WAVE, has no `fmt ` or `data` chunk, declares no channels, or uses an unsupported tag or bit depth (8, 16, 24 and 32-bit integer PCM and 32 and 64-bit float are supported).
|
|
1328
|
+
*/
|
|
1329
|
+
declare function decodeWavBytes(wavBytes: Readonly<Uint8Array>): {
|
|
1330
|
+
readonly samples: Float32Array;
|
|
1331
|
+
readonly sampleRateHz: number;
|
|
1332
|
+
};
|
|
1333
|
+
/**
|
|
1334
|
+
* Encodes a mono `Float32Array` audio buffer into a standard 16-bit PCM RIFF WAVE byte array.
|
|
1335
|
+
* @param samples - Mono audio samples in `[-1, 1]`.
|
|
1336
|
+
* @param sampleRateHz - Sample rate in Hz.
|
|
1337
|
+
* @returns Complete `.wav` file bytes.
|
|
1338
|
+
*/
|
|
1339
|
+
declare function encodeWavPcm16(samples: Readonly<Float32Array>, sampleRateHz: number): Uint8Array;
|
|
1340
|
+
/** Number of buckets each side of the measured one that a query expands to on each key axis, so a measurement near a bucket boundary still finds its pair. */
|
|
1341
|
+
declare const QUERY_BUCKET_SPAN = 2;
|
|
1342
|
+
/**
|
|
1343
|
+
* Computes a quantized Shazam-style constellation hash key from two aircraft groundspeeds and their delayed CPA time offset.
|
|
1344
|
+
* @param speedAMps - Groundspeed of first flyover in m/s.
|
|
1345
|
+
* @param speedBMps - Groundspeed of second flyover in m/s.
|
|
1346
|
+
* @param deltaSec - Time offset `t_CPA_B - t_CPA_A` in seconds.
|
|
1347
|
+
* @returns Quantized constellation hash key string.
|
|
1348
|
+
*/
|
|
1349
|
+
declare function formatConstellationKey(speedAMps: number, speedBMps: number, deltaSec: number): string;
|
|
1350
|
+
/**
|
|
1351
|
+
* Generates neighbouring constellation hash keys within measurement tolerance (`QUERY_BUCKET_SPAN` buckets either side on each of the speed and time axes) to prevent boundary quantization misses.
|
|
1352
|
+
* @param speedAMps - Inferred speed of first flyover in m/s.
|
|
1353
|
+
* @param speedBMps - Inferred speed of second flyover in m/s.
|
|
1354
|
+
* @param deltaSec - Measured CPA offset in seconds.
|
|
1355
|
+
* @returns Set of candidate constellation hash keys.
|
|
1356
|
+
*/
|
|
1357
|
+
declare function expandConstellationQueryKeys(speedAMps: number, speedBMps: number, deltaSec: number): Set<string>;
|
|
1358
|
+
/**
|
|
1359
|
+
* Options for indexing constellation pairs.
|
|
1360
|
+
*/
|
|
1361
|
+
interface BuildConstellationOptions {
|
|
1362
|
+
readonly demGrid?: readonly GeoPoint3D[];
|
|
1363
|
+
readonly soundSpeedMps?: number;
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* Builds the Shazam-style Constellation Index from a collection of 4D linear flight segments.
|
|
1367
|
+
* Pairs any two non-jet segments passing within acoustic range (`MAX_PAIR_SLANT_METERS`) of the same cell, with closest-approach times between `MIN_PAIR_DELTA_SEC` and `MAX_PAIR_DELTA_SEC` apart, on the same date.
|
|
1368
|
+
* @param segments - Linear flight segments.
|
|
1369
|
+
* @param options - DEM elevation grid samples and speed of sound.
|
|
1370
|
+
* @returns Array of indexed constellation pair entries.
|
|
1371
|
+
*/
|
|
1372
|
+
declare function buildConstellationIndex(segments: readonly LinearFlightSegment[], options?: Readonly<BuildConstellationOptions>): ConstellationEntry[];
|
|
1373
|
+
/**
|
|
1374
|
+
* Candidate observer target coordinates and epoch timestamp tested against search constraints.
|
|
1375
|
+
*/
|
|
1376
|
+
interface CandidateConstraintTarget {
|
|
1377
|
+
readonly lat: number;
|
|
1378
|
+
readonly lon: number;
|
|
1379
|
+
readonly dateIso: string;
|
|
1380
|
+
readonly epochSec: number;
|
|
1381
|
+
}
|
|
1382
|
+
/**
|
|
1383
|
+
* Checks whether a geographic coordinate and UTC epoch timestamp satisfy all active multi-axis user and side-channel constraints (Space, Date, Time of Day, and 50/60 Hz ENF power grid).
|
|
1384
|
+
* @param target - Candidate coordinate, date, and epoch timestamp.
|
|
1385
|
+
* @param constraints - Active multi-axis search constraints (any undefined field is treated as unconstrained `*`).
|
|
1386
|
+
* @returns `true` if the candidate satisfies all specified constraints.
|
|
1387
|
+
*/
|
|
1388
|
+
declare function matchesSearchConstraints(target: Readonly<CandidateConstraintTarget>, constraints: Readonly<SearchConstraints>): boolean;
|
|
1389
|
+
/**
|
|
1390
|
+
* Largest speed difference, in m/s, that a segment may have from a measured Doppler speed and still be a candidate: the admission gate applied to the wind spread.
|
|
1391
|
+
*/
|
|
1392
|
+
declare const MAX_ALONG_TRACK_WIND_MPS: number;
|
|
1393
|
+
/**
|
|
1394
|
+
* Log-likelihood cost of leaving an observation unmatched. An observation that no segment explains contributes every residual term it would have had (one slant residual, one speed residual and one frequency residual per ridge point) at the outlier gate, so a hypothesis cannot outscore a rival by ignoring evidence: a poor fit costs at most this much, and an omission costs exactly this much.
|
|
1395
|
+
* @param observation - The observation a hypothesis does not explain.
|
|
1396
|
+
* @returns A non-negative amount to subtract from the hypothesis's log-posterior.
|
|
1397
|
+
*/
|
|
1398
|
+
declare function unmatchedObservationLogPenalty(observation: Readonly<DopplerObservation>): number;
|
|
1399
|
+
/**
|
|
1400
|
+
* Smallest slant-distance standard deviation, in metres, the solver assumes for any observation, however sharp its fit. Positional error in the flight data below this is invisible to the solver.
|
|
1401
|
+
*/
|
|
1402
|
+
declare const SLANT_SIGMA_FLOOR_METERS = 40;
|
|
1403
|
+
/**
|
|
1404
|
+
* Paired observation and flight segment constraint used during Gauss-Newton coordinate refinement.
|
|
1405
|
+
*/
|
|
1406
|
+
interface ObservationSegmentPair {
|
|
1407
|
+
readonly observation: Readonly<DopplerObservation>;
|
|
1408
|
+
readonly segment: Readonly<LinearFlightSegment>;
|
|
1409
|
+
}
|
|
1410
|
+
/**
|
|
1411
|
+
* Output of the damped Gauss-Newton / Levenberg-Marquardt coordinate refinement and Fisher Information covariance estimator.
|
|
1412
|
+
*/
|
|
1413
|
+
interface RefinedLocationResult {
|
|
1414
|
+
readonly lat: number;
|
|
1415
|
+
readonly lon: number;
|
|
1416
|
+
readonly altMeters: number;
|
|
1417
|
+
readonly estimatedStartEpochSec: number;
|
|
1418
|
+
readonly rmsFreqResidualHz: number;
|
|
1419
|
+
readonly logLikelihood: number;
|
|
1420
|
+
readonly fisherInfo: readonly [number, number, number, number];
|
|
1421
|
+
readonly ellipseSemiMajorMeters: number;
|
|
1422
|
+
readonly ellipseSemiMinorMeters: number;
|
|
1423
|
+
readonly ellipseBearingDeg: number;
|
|
1424
|
+
}
|
|
1425
|
+
/**
|
|
1426
|
+
* Converts a 2x2 Fisher Information matrix `[I_xx, I_xy, I_yx, I_yy]` in inverse-square meters into a 95% confidence ellipse (`chi2_2(0.95) = 5.991`).
|
|
1427
|
+
* @param fisher - 2x2 symmetric Fisher Information matrix entries `[I_xx, I_xy, I_yx, I_yy]`.
|
|
1428
|
+
* @returns Semi-major axis (m), semi-minor axis (m), and compass bearing of semi-major axis (degrees).
|
|
1429
|
+
*/
|
|
1430
|
+
declare function fisherToConfidenceEllipse95(fisher: readonly [number, number, number, number]): {
|
|
1431
|
+
readonly ellipseSemiMajorMeters: number;
|
|
1432
|
+
readonly ellipseSemiMinorMeters: number;
|
|
1433
|
+
readonly ellipseBearingDeg: number;
|
|
1434
|
+
};
|
|
1435
|
+
/**
|
|
1436
|
+
* Options for Levenberg-Marquardt coordinate refinement.
|
|
1437
|
+
*/
|
|
1438
|
+
interface RefineCoordinateOptions {
|
|
1439
|
+
readonly demGrid?: readonly GeoPoint3D[];
|
|
1440
|
+
readonly soundSpeedMps?: number;
|
|
1441
|
+
}
|
|
1442
|
+
/**
|
|
1443
|
+
* Refines a candidate observer coordinate `(lat, lon)` without spatial grids using damped Levenberg-Marquardt nonlinear least squares and computes the 2x2 Fisher Information matrix and 95% confidence ellipse.
|
|
1444
|
+
* @param seedGeo - Coarse initial coordinate (e.g. H3 cell center or cylinder intersection).
|
|
1445
|
+
* @param pairs - Matched observation-to-segment pairs (1 or more flyovers).
|
|
1446
|
+
* @param options - Terrain elevation grid and sound speed.
|
|
1447
|
+
* @returns Optimized coordinate, log-likelihood, Fisher Information matrix, and 95% error ellipse.
|
|
1448
|
+
*/
|
|
1449
|
+
declare function refineObserverCoordinateGaussNewton(seedGeo: Readonly<GeoPoint3D>, pairs: readonly ObservationSegmentPair[], options?: Readonly<RefineCoordinateOptions>): RefinedLocationResult;
|
|
1450
|
+
/**
|
|
1451
|
+
* Options for configuring or resuming a Doppler geolocation session.
|
|
1452
|
+
*/
|
|
1453
|
+
interface SessionEngineOptions {
|
|
1454
|
+
readonly initialSession?: Readonly<LocationSession> | undefined;
|
|
1455
|
+
readonly dataset: Readonly<DopplerDataset>;
|
|
1456
|
+
readonly ambientTempCelsius?: number | undefined;
|
|
1457
|
+
readonly constraints?: Readonly<SearchConstraints> | undefined;
|
|
1458
|
+
}
|
|
1459
|
+
/**
|
|
1460
|
+
* Continuous & Episodic Bayesian Refinement Engine.
|
|
1461
|
+
*
|
|
1462
|
+
* Supports leaving the microphone running continuously, or pausing and resuming across hours, days,
|
|
1463
|
+
* or device reboots. Ingests observations sequentially and computes an accumulating log-posterior
|
|
1464
|
+
* surface and Fisher Information covariance matrix across surviving candidate hypotheses.
|
|
1465
|
+
*/
|
|
1466
|
+
declare class DopplerSessionEngine {
|
|
1467
|
+
private session;
|
|
1468
|
+
private readonly dataset;
|
|
1469
|
+
private readonly segmentsById;
|
|
1470
|
+
constructor(options: Readonly<SessionEngineOptions>);
|
|
1471
|
+
/**
|
|
1472
|
+
* Returns an immutable snapshot of the current session state.
|
|
1473
|
+
*/
|
|
1474
|
+
getSession(): LocationSession;
|
|
1475
|
+
/**
|
|
1476
|
+
* Updates multi-axis user constraints (bounding box, date range, hour window, ENF grid) and prunes incompatible hypotheses.
|
|
1477
|
+
*/
|
|
1478
|
+
updateConstraints(constraints: Readonly<SearchConstraints>): LocationSession;
|
|
1479
|
+
/**
|
|
1480
|
+
* Starts a new listening episode (e.g. user clicks "Start Listening" or device boots up).
|
|
1481
|
+
*/
|
|
1482
|
+
startEpisode(startedAtEpochSec: number): ListeningEpisode;
|
|
1483
|
+
/**
|
|
1484
|
+
* Updates episode telemetry with real-time in-band noise floor and pollution gating.
|
|
1485
|
+
*/
|
|
1486
|
+
updateEpisodeNoise(episodeId: string, currentNoiseFloorDb: number, noisePolluted: boolean, currentEpochSec: number): void;
|
|
1487
|
+
/**
|
|
1488
|
+
* Pauses an active listening episode (e.g. user pauses, device enters sleep, or ambient noise exceeds threshold).
|
|
1489
|
+
*/
|
|
1490
|
+
pauseEpisode(episodeId: string, pausedAtEpochSec: number): void;
|
|
1491
|
+
/**
|
|
1492
|
+
* Resumes a paused episode or starts a follow-up active episode within the session.
|
|
1493
|
+
*/
|
|
1494
|
+
resumeEpisode(episodeId: string, resumedAtEpochSec: number): ListeningEpisode;
|
|
1495
|
+
/**
|
|
1496
|
+
* Ingests an extracted DopplerObservation and performs sequential Bayesian refinement.
|
|
1497
|
+
*
|
|
1498
|
+
* - First flyover: creates candidate hypotheses along matching flight track cylinders.
|
|
1499
|
+
* - Second flyover: queries constellation hash index or pairs with existing observation to collapse candidates to curve intersections.
|
|
1500
|
+
* - Third+ flyovers: refits each surviving hypothesis on every flyover it explains, so the Fisher Information matrix is that of the joint fit (shrinking O(1/sqrt(N))) and no flyover is counted twice.
|
|
1501
|
+
*
|
|
1502
|
+
* An observation whose id was ingested before replaces it, and the hypotheses are rebuilt from the whole list: a live listener re-reports a growing flyover under one id, and the latest report must not stack on the earlier ones.
|
|
1503
|
+
*/
|
|
1504
|
+
ingestObservation(obs: Readonly<DopplerObservation>): LocationSession;
|
|
1505
|
+
private applyObservation;
|
|
1506
|
+
/**
|
|
1507
|
+
* Log-posterior of a hypothesis: the joint fit of the flyovers it explains, less the cost of every flyover it leaves unexplained.
|
|
1508
|
+
*/
|
|
1509
|
+
private static scoreHypothesis;
|
|
1510
|
+
/**
|
|
1511
|
+
* Allowed speed difference between a measured Doppler speed and a segment's ground speed, which differ by the along-track wind.
|
|
1512
|
+
*/
|
|
1513
|
+
private static speedTolerance;
|
|
1514
|
+
/**
|
|
1515
|
+
* Generates initial candidate hypotheses along flight tracks matching a single flyover.
|
|
1516
|
+
*/
|
|
1517
|
+
private spawnInitialHypotheses;
|
|
1518
|
+
/**
|
|
1519
|
+
* Keeps the best-scoring hypotheses. Ranking comes before the cut: dataset order says nothing about fit, so cutting first can discard the true track.
|
|
1520
|
+
*/
|
|
1521
|
+
private static keepBest;
|
|
1522
|
+
/**
|
|
1523
|
+
* Matches candidate constellations from the Shazam-style hash table.
|
|
1524
|
+
*/
|
|
1525
|
+
private matchConstellations;
|
|
1526
|
+
/**
|
|
1527
|
+
* Sequentially refines existing candidate hypotheses by refitting each on every flyover it explains, the new one included.
|
|
1528
|
+
*/
|
|
1529
|
+
private refineExistingHypotheses;
|
|
1530
|
+
}
|
|
1531
|
+
/**
|
|
1532
|
+
* Reference ground truth observer location used for offline demonstration and regression testing.
|
|
1533
|
+
* Oxford, UK (51.7520° N, 1.2577° W, elevation 64 m).
|
|
1534
|
+
*/
|
|
1535
|
+
declare const BUNDLED_GROUND_TRUTH: GeoPoint3D;
|
|
1536
|
+
/**
|
|
1537
|
+
* Realistic piecewise-linear flight segments crossing the bundled reference region.
|
|
1538
|
+
*/
|
|
1539
|
+
declare const BUNDLED_SEGMENTS: readonly LinearFlightSegment[];
|
|
1540
|
+
/**
|
|
1541
|
+
* Regional DEM grid surrounding the reference location.
|
|
1542
|
+
*/
|
|
1543
|
+
declare const BUNDLED_DEM_GRID: readonly GeoPoint3D[];
|
|
1544
|
+
/**
|
|
1545
|
+
* Pre-indexed constellation entries built from the bundled reference segments.
|
|
1546
|
+
*/
|
|
1547
|
+
declare const BUNDLED_CONSTELLATIONS: {
|
|
1548
|
+
hashKey: string;
|
|
1549
|
+
dateIso: string;
|
|
1550
|
+
h3Cell: string;
|
|
1551
|
+
centerLat: number;
|
|
1552
|
+
centerLon: number;
|
|
1553
|
+
segmentIdA: string;
|
|
1554
|
+
segmentIdB: string;
|
|
1555
|
+
speedAMps: number;
|
|
1556
|
+
speedBMps: number;
|
|
1557
|
+
cpaDelayedEpochSecA: number;
|
|
1558
|
+
cpaDelayedEpochSecB: number;
|
|
1559
|
+
deltaSec: number;
|
|
1560
|
+
}[];
|
|
1561
|
+
/**
|
|
1562
|
+
* Complete bundled DopplerDataset object available synchronously without network requests.
|
|
1563
|
+
*/
|
|
1564
|
+
declare const BUNDLED_DATASET: DopplerDataset;
|
|
1565
|
+
/**
|
|
1566
|
+
* Synthesizes a realistic reference audio buffer containing the bundled flyovers and a 50 Hz European ENF mains hum.
|
|
1567
|
+
* @param sampleRateHz - Audio sample rate (default 2000 Hz).
|
|
1568
|
+
* @returns Decimated mono `Float32Array` audio samples.
|
|
1569
|
+
*/
|
|
1570
|
+
declare function generateBundledReferenceAudio(sampleRateHz?: number): Float32Array;
|
|
1571
|
+
/**
|
|
1572
|
+
* Encodes the reference audio into a `.wav` byte array.
|
|
1573
|
+
* @param sampleRateHz - Audio sample rate.
|
|
1574
|
+
* @returns Raw `.wav` file bytes.
|
|
1575
|
+
*/
|
|
1576
|
+
declare function generateBundledReferenceWavBytes(sampleRateHz?: number): Uint8Array;
|
|
1577
|
+
export { computeSegmentCpa as $, QuietIntervalSchema as $t, synthesizeMultiFlyoverAudio as A, ConstellationEntry as At, SpectrogramOptions as B, GeoPoint3D as Bt, formatConstellationKey as C, define as Ct, SyntheticAudioConfig as D, AircraftCategorySchema as Dt, encodeWavPcm16 as E, AircraftCategory as Et, extractDopplerObservations as F, DopplerObservationSchema as Ft, downmixToMono as G, LinearFlightSegmentSchema as Gt, computeSingleSpectrogramFrame as H, HypothesisMatch as Ht, ComputedSingleFrame as I, DopplerRidgePoint as It, fft as J, LocationHypothesis as Jt, ComplexSpectrum as K, ListeningEpisode as Kt, DopplerSpectrogram as L, DopplerRidgePointSchema as Lt, DechirpScoreResult as M, DopplerDataset as Mt, scoreByEmissionDechirping as N, DopplerDatasetSchema as Nt, detectEnfSignature as O, AsymptoticKinematics as Ot, RidgeTrackerOptions as P, DopplerObservation as Pt, SynthesizeCurveOptions as Q, QuietInterval as Qt, SingleFrameOptions as R, EnfSignature as Rt, expandConstellationQueryKeys as S, getOwn as St, decodeWavBytes as T, AdsbPingSchema as Tt, decimateAudioStream as U, HypothesisMatchSchema as Ut, computeDopplerSpectrogram as V, GeoPoint3DSchema as Vt, designLowPassFirKernel as W, LinearFlightSegment as Wt, simplifyTrajectory4D as X, LocationSession as Xt, TraceMetadata as Y, LocationHypothesisSchema as Yt, RetardedAcousticPoint as Z, LocationSessionSchema as Zt, unmatchedObservationLogPenalty as _, geoToLocalEnu as _t, BUNDLED_SEGMENTS as a, DEFAULT_SOUND_SPEED_MPS as at, QUERY_BUCKET_SPAN as b, slantDistanceMeters as bt, DopplerSessionEngine as c, DEFAULT_ELLIPSE_SEGMENTS as ct, ObservationSegmentPair as d, HALF_TURN_DEG as dt, SearchConstraints as en, solveRetardedDelaySec as et, RefineCoordinateOptions as f, HorizontalEllipse as ft, refineObserverCoordinateGaussNewton as g, geoToEcef as gt, fisherToConfidenceEllipse95 as h, encodeSpatialCell as ht, BUNDLED_GROUND_TRUTH as i, AtmosphereState as it, DechirpOptions as j, ConstellationEntrySchema as jt, estimateTempFromCricketChirpsCelsius as k, AsymptoticKinematicsSchema as kt, SessionEngineOptions as l, DEFAULT_SPATIAL_RESOLUTION as lt, SLANT_SIGMA_FLOOR_METERS as m, ellipseOutline as mt, BUNDLED_DATASET as n, Vector3D as nn, DopplerCurveMeasurement as nt, generateBundledReferenceAudio as o, effectiveRaySoundSpeedMps as ot, RefinedLocationResult as p, decodeSpatialCellCenter as pt, computeHannPowerSpectrumDb as q, ListeningEpisodeSchema as qt, BUNDLED_DEM_GRID as r, Vector3DSchema as rn, extractAsymptoticKinematics as rt, generateBundledReferenceWavBytes as s, speedOfSoundAtTempMps as st, BUNDLED_CONSTELLATIONS as t, SearchConstraintsSchema as tn, synthesizeRetardedDopplerCurve as tt, MAX_ALONG_TRACK_WIND_MPS as u, FULL_TURN_DEG as ut, BuildConstellationOptions as v, interpolateTerrainElevationMeters as vt, matchesSearchConstraints as w, AdsbPing as wt, buildConstellationIndex as x, recordOf as xt, CandidateConstraintTarget as y, localEnuToGeo as yt, SpectrogramFrame as z, EnfSignatureSchema as zt };
|