"""Two authored tone frames, direct DFT and explicit power scaling; no audio input."""
import math,cmath,json
FS=8000;N=8
def dft(x):return [sum((v*cmath.exp(-2j*math.pi*k*m/len(x)) for m,v in enumerate(x)),0j) for k in range(len(x))]
def run():
    rows=[];frames=[]
    for frame,k0 in enumerate((1,2)):
        x=[math.sin(2*math.pi*k0*m/N) for m in range(N)];X=dft(x);powers=[abs(v)**2/N**2 for v in X]
        assert abs(sum(powers)-sum(v*v for v in x)/N)<1e-12
        assert abs(powers[k0]-.25)<1e-12 and abs(powers[N-k0]-.25)<1e-12
        assert max(range(N//2+1),key=lambda k:powers[k])==k0
        frames.append({'frame':frame,'samples':x,'full_DFT_real':[v.real for v in X],'full_DFT_imag':[v.imag for v in X],'time_domain_mean_square':sum(v*v for v in x)/N})
        for k in range(N//2+1):rows.append({'frame':frame,'start_seconds':frame*N/FS,'end_seconds':(frame+1)*N/FS,'bin':k,'frequency_hz':k*FS/N,'raw_bin_power_div_N_squared':powers[k]})
    assert len(rows)==10 and frames[0]['time_domain_mean_square']>0
    return {'sample_rate':FS,'frame_size':N,'hop':N,'window':'rectangular, no overlap','one_sided_bins_not_doubled':True,'power_scale':'abs(DFT)^2/N^2, not PSD per Hz or dB','rows':rows,'frames':frames,'real_speech_recorded_or_analyzed':False,'NumPy_or_FFT_library_run':False}
if __name__=='__main__':print(json.dumps(run(),indent=2))
