From 81cfca70a9e11e449050bd812896deca0eb389f8 Mon Sep 17 00:00:00 2001 From: Matiq Date: Mon, 17 Aug 2026 09:51:49 +0300 Subject: [PATCH] add dsp/ with FFT, filters, detector, stereo support; initial harness --- verify_bit_exact.py | 108 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100755 verify_bit_exact.py diff --git a/verify_bit_exact.py b/verify_bit_exact.py new file mode 100755 index 0000000..32fdc58 --- /dev/null +++ b/verify_bit_exact.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +"""bit-exact verification — прогон всех свипов, побайтовое сравнение int24 PCM.""" + +import subprocess +import os +import glob +import wave +import struct +import sys + +RENDERER = "/home/m/re-tools/dsp/harness" +TEST_ROOT = "/home/m/soothe-bt" + +def read_wav24(path): + """Read WAV24 file and return numpy array or list of int24 samples.""" + with wave.open(path, 'rb') as w: + n = w.getnframes() + data = w.readframes(n * w.getnchannels()) + sw = w.getsampwidth() + nc = w.getnchannels() + + if sw == 3: + samples = [] + for i in range(0, len(data), 3): + val = struct.unpack(' render -> out.wav, compare to ref.wav.""" + in_wav = f"{TEST_ROOT}/{name}.wav" + ref_wav = f"{TEST_ROOT}/{name}_ref.wav" + out_wav = f"/tmp/out_{name}.wav" + + if not os.path.exists(in_wav): + print(f"SKIP {name}: no input") + return None + + if not run_harness(in_wav, out_wav): + print(f"FAIL {name}: renderer error") + return False + + match, diff, max_diff = compare_bytes(ref_wav, out_wav) + + if match: + print(f"PASS {name}") + return True + else: + print(f"FAIL {name}: {diff} byte differences") + return False + +def main(): + rpps = sorted(glob.glob(f"{TEST_ROOT}/*.rpp")) + print(f"Found {len(rpps)} RPP files") + + passed = 0 + failed = 0 + skipped = 0 + + for rpp in rpps[:10]: # Test first 10 + name = os.path.splitext(os.path.basename(rpp))[0] + wav = f"{TEST_ROOT}/{name}.wav" + + if not os.path.exists(wav): + skipped += 1 + continue + + result = test_sweep(name) + if result is True: + passed += 1 + elif result is False: + failed += 1 + else: + skipped += 1 + + print(f"\nSummary: {passed} passed, {failed} failed, {skipped} skipped") + +if __name__ == "__main__": + main()