"""Verify decode_waveform_v2 against sidecar across all 2304 samples per channel.""" from __future__ import annotations import sys from pathlib import Path REPO = Path(__file__).resolve().parents[1] sys.path.insert(0, str(REPO)) from minimateplus.waveform_codec import decode_waveform_v2 from analysis_idf.recon import TARGET, TXT, load_sidecar_samples def main(): buf = TARGET.read_bytes() sc = load_sidecar_samples(TXT) body = buf[0x0f1f:] decoded = decode_waveform_v2(body) print(f"Sidecar lengths: Tran={len(sc['Tran'])} Vert={len(sc['Vert'])} Long={len(sc['Long'])} MicL={len(sc['MicL'])}") print(f"Decoded lengths: Tran={len(decoded['Tran'])} Vert={len(decoded['Vert'])} Long={len(decoded['Long'])} MicL={len(decoded['MicL'])}") print() GEO_LSB = 0.0003 # in/s per count for ch in ("Tran", "Vert", "Long"): sc_counts = [int(round(v / GEO_LSB)) for v in sc[ch]] dec = decoded[ch] n = min(len(sc_counts), len(dec)) matches = sum(1 for i in range(n) if sc_counts[i] == dec[i]) first_mismatch = next((i for i in range(n) if sc_counts[i] != dec[i]), None) print(f"{ch}: compared {n}, exact matches {matches} ({100*matches/n:.2f}%)") if first_mismatch is not None: i = first_mismatch print(f" first mismatch at idx {i}: sidecar={sc_counts[i]} ({sc[ch][i]}), decoded={dec[i]}") print(f" context sidecar[{i-2}..{i+5}]: {sc_counts[max(0,i-2):i+5]}") print(f" context decoded[{i-2}..{i+5}]: {dec[max(0,i-2):i+5]}") # MicL: find the multiplicative factor that fits print() print("=== MicL scale analysis ===") sc_micl = sc["MicL"] dec_micl = decoded["MicL"] # Skip zero values when computing ratio ratios = [sc_micl[i] / dec_micl[i] for i in range(min(50, len(sc_micl), len(dec_micl))) if dec_micl[i] != 0] if ratios: avg = sum(ratios) / len(ratios) print(f" avg ratio sidecar/decoded over first 50 nonzero: {avg:.4e} (n={len(ratios)})") print(f" ratios sample: {[f'{r:.4e}' for r in ratios[:6]]}") if __name__ == "__main__": main()