#!/usr/bin/env python3 import sys, os, struct import numpy as np SR = 44100 def read_wav(path): d = open(path, 'rb').read() i = 12 ch = bps = None data_off = data_sz = None while i + 8 <= len(d): cid = d[i:i+4]; sz = struct.unpack('= fl) & (frq <= fh) total += float(np.sum(np.abs(X[m])**2)) frames += 1 if frames == 0: return -300.0 return 10*np.log10(total/frames + 1e-30) def main(): # probe band around the carrier at flexible freqs center = float(sys.argv[1]) outs = sys.argv[2:] half_w = float(os.environ.get('PROBE_BW', 800.0)) widths = [] step = float(os.environ.get('PROBE_STEP', 25.0)) f = center - half_w while f <= center + half_w: widths.append(f) f += step datas = {p: load(p) for p in outs} colw = 11 print(f"{'freq':>6}" + ''.join(f" {os.path.basename(p)[:colw]:>{colw}}" for p in outs)) prevbase = None for fl in widths: fh = fl + step row = f"{fl + step/2:6.0f}" base = None for p in outs: d = band_db(datas[p], fl, fh) if base is None: base = d row += f" {d:>{colw}.1f}" print(row) # also print relative-to-first file per bin is tricky; print a second table relative to first col print("--- relative dB to first file ---") for fl in widths: fh = fl + step row = f"{fl + step/2:6.0f}" first = None for p in outs: d = band_db(datas[p], fl, fh) if first is None: first = d row += f" {d - first:>+{colw}.1f}" print(row) if __name__ == '__main__': main()