Formats de données
Un essai enregistré est un dossier Downloads/NVH_Spectro_Exports/<nom>/ contenant le WAV et son sidecar JSON. Les formats sont versionnés, avec lecture des versions antérieures — un enregistrement d'hier se rouvre aujourd'hui, et s'ouvrira demain.
Sidecar télémétrie — schéma v3
Écrit par TelemetryCodec.encodeV3 (kotlinx-serialization, schemaVersion: 3). Chaque échantillon est apparié 1:1 à une fenêtre FFT :
| Champ | Sens |
|---|---|
speedKmh | vitesse GNSS brute du fix (diagnostique) |
estSpeedKmh + estSpeedSigmaKmh | vitesse estimée (Kalman) et son 1-σ — null = inconnu, jamais 0 |
validity | VALID / DEGRADED / INVALID à la capture |
audioTimeNanos | BOOTTIME du centre de la fenêtre audio appariée (GPS-03) |
elapsedRealtimeNanos | instant monotone du fix |
lat / lng / altitude / speedAccuracyMs / gpsStatus | fix brut, pour diagnostic et rejeu |
En-tête du document : appVersion, sampleRate, captureSource (route micro réelle), speedEstimator (identité + paramètres complets de l'estimateur), speedStatus (« causale »), orderConfidenceK.
Migration v1/v2 → v3
- v1 — télémétrie minimale, sans horodatage ni σ : lecture en « brute (interpolée) », validité DEGRADED.
- v2 — ajoute
schemaVersion,appVersion, temps monotone, altitude, σv brute. - v3 — ajoute estimation + σ + validité + temps audio + identité d'estimateur.
Les tests de migration couvrent v1, v2 et v3. Un correctif latent notable : les sidecars v2 décodés comme INVALID à une époque ont été corrigés en DEGRADED (« incertitude inconnue ») — un vieil enregistrement n'affiche pas « -- » à tort.
Trace terrain v2 (debug)
En debug uniquement, FieldLocationLogger écrit un CSV nvh-field-trace v2 : chaque fix brut (temps monotone + UTC, provider, position, Doppler, σv, précision horizontale), le résultat de l'estimateur (état, validité, rejet, NIS) et un instantané GNSS (satellites utilisés, C/N0 moyen, constellations, bande L5). En-tête de capacité (# caps sdk=… rawMeasurements=… fullTracking=…) et UUID d'installation anonymisé. C'est le jeu de données du réglage GPS-5. Absent des builds release.
Stockage & réglages
- Enregistrements —
RecordingStore: MediaStore.Downloads (patron IS_PENDING) sur API 29+, avecnettoyage des entrées orphelines en cas d'échec d'écriture ; noms suffixés à la milliseconde (pas de collision à la seconde). - Réglages —
SettingsStore(DataStore Preferences) : plage dB, FFT, fenêtres, détecteur et cinématique complète (JSON@Serializable). Restauration au démarrage avant l'armement des observateurs ; écritures débounce 500 ms. - Journal de diagnostic —
DiagnosticLog: rotatif local (2 × 256 kB), thread dédié, se désactive après un premier échec ; partage par FileProvider non exporté, sur action explicite de l'utilisateur.
Audio & vidéo
- WAV — parseur RIFF complet (
WavDataReader) : chunks LIST/fact/bext tolérés, fmt extensible, downmix stéréo avec durée comptée en trames, buffers dimensionnés au chunk data. 24 bits / float / non-PCM : refus typé avec message clair (pas de décodage en bruit). - Vidéo —
VideoAudioExtractor: drainage complet après EOS (la fin de chaque vidéo était perdue), tableau court croissant (plus de ~13 M de Shorts boxing),INFO_OUTPUT_FORMAT_CHANGEDhonoré (le décodeur peut resampler — l'analyse suit le vrai format), PCM float géré, progression réelle affichée. - La durée de la timeline d'analyse est min(media, PCM analysé) : la tête de lecture ne quitte jamais la zone analysée, et la troncature à 5 min est annoncée par une bannière.