import csv, math, sys
with open(sys.argv[1], newline="") as stream:
    rows = list(csv.DictReader(stream))[:256]
if len(rows) < 32:
    raise SystemExit("Capture at least 32 consecutive samples; 256 recommended.")
times = [float(r["ms"]) for r in rows]
signal = [float(r["az"]) for r in rows]
intervals = [b-a for a,b in zip(times,times[1:])]
if min(intervals) <= 0:
    raise SystemExit("Timestamps must increase.")
n = len(signal)
fs = (n-1)*1000/(times[-1]-times[0])
mean = sum(signal)/n
windowed = [(v-mean)*(0.5-0.5*math.cos(2*math.pi*i/(n-1))) for i,v in enumerate(signal)]
spectrum = []
for k in range(1,n//2+1):
    re = sum(v*math.cos(2*math.pi*k*i/n) for i,v in enumerate(windowed))
    im = -sum(v*math.sin(2*math.pi*k*i/n) for i,v in enumerate(windowed))
    spectrum.append((k*fs/n, math.hypot(re,im)/n))
peak = max(spectrum,key=lambda p:p[1])
print("sample_rate_Hz",fs,"dt_min_ms",min(intervals),"dt_max_ms",max(intervals),file=sys.stderr)
print("largest_non_DC_bin_Hz",peak[0],file=sys.stderr)
print("frequency_Hz,relative_magnitude")
for hz,mag in spectrum:
    print(f"{hz:.5f},{mag:.7f}")
