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 :

ChampSens
speedKmhvitesse GNSS brute du fix (diagnostique)
estSpeedKmh + estSpeedSigmaKmhvitesse estimée (Kalman) et son 1-σ — null = inconnu, jamais 0
validityVALID / DEGRADED / INVALID à la capture
audioTimeNanosBOOTTIME du centre de la fenêtre audio appariée (GPS-03)
elapsedRealtimeNanosinstant monotone du fix
lat / lng / altitude / speedAccuracyMs / gpsStatusfix 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

  • EnregistrementsRecordingStore : 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églagesSettingsStore (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 diagnosticDiagnosticLog : 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éoVideoAudioExtractor : 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_CHANGED honoré (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.