"""Trace Tran sample-by-sample to find exactly where the codec drifts.""" from __future__ import annotations import sys from pathlib import Path REPO = Path(__file__).resolve().parents[1] sys.path.insert(0, str(REPO)) from analysis_idf.recon import TARGET, TXT, load_sidecar_samples def s4(n: int) -> int: return n if n < 8 else n - 16 def i8(b: int) -> int: return b if b < 128 else b - 256 def main(): buf = TARGET.read_bytes() sc = load_sidecar_samples(TXT) GEO_LSB = 0.0003 sc_tran = [int(round(v / GEO_LSB)) for v in sc["Tran"]] body = buf[0x0f1f:] # Tran[0], Tran[1] from preamble t0 = int.from_bytes(body[3:5], "big", signed=True) t1 = int.from_bytes(body[5:7], "big", signed=True) print(f"preamble Tran[0]={t0} Tran[1]={t1} (sidecar: {sc_tran[0]}, {sc_tran[1]})") # Block 0: 10 f8 at body[7:9] print(f"block 0: tag {body[7]:02x} {body[8]:02x}") print(f" block 0 first 10 data bytes: {body[9:19].hex()}") # Walk block 0 manually, comparing each sample cur = t1 samples = [t0, t1] block_off = 7 nn = body[8] print(f" NN = {nn}") data = body[9 : 9 + nn // 2] for byi, byte in enumerate(data): for nib_idx, nib in enumerate(((byte >> 4) & 0xF, byte & 0xF)): cur += s4(nib) samples.append(cur) idx = len(samples) - 1 if 0 <= idx < len(sc_tran): sc_v = sc_tran[idx] match = "✓" if sc_v == cur else "✗" if idx < 12 or 240 <= idx <= 260: print(f" idx {idx:3d}: nibble byte={byte:02x} nib={nib:x} delta={s4(nib):+d} cur={cur:+d} sc={sc_v:+d} {match}") print(f"end of block 0: cur={cur}, len(samples)={len(samples)}, decoder expected 250 here") # Block 1: 20 28 starts at offset 9 + 124 = 133 from block_off=7 block1_off = 9 + nn // 2 print(f"block 1: tag {body[block1_off]:02x} {body[block1_off+1]:02x} (expecting 20 28)") nn1 = body[block1_off + 1] print(f" block 1 NN = {nn1}") data1 = body[block1_off + 2 : block1_off + 2 + nn1] for byi, byte in enumerate(data1): cur += i8(byte) samples.append(cur) idx = len(samples) - 1 if idx < len(sc_tran): sc_v = sc_tran[idx] match = "✓" if sc_v == cur else "✗" if 248 <= idx <= 295: print(f" idx {idx:3d}: int8 byte={byte:02x} delta={i8(byte):+d} cur={cur:+d} sc={sc_v:+d} {match}") if __name__ == "__main__": main()