(** Perform and FFT followed by an IFFT, so it should be roughly the
    identity... *)

module FFT = Audio.Mono.Analyze.FFT

let () =
  let read = new Audio.IO.Reader.of_wav_file Sys.argv.(1) in
  let write = new Audio.IO.Writer.to_wav_file read#channels read#sample_rate "out.wav" in
  let fft_n = 11 in
  let fft = FFT.init fft_n in
  let blen = 1 lsl fft_n in
  let buf = Audio.create read#channels blen in
  let loop = ref true in
  while !loop do
    let n = read#read buf 0 blen in
    if n = 0 then loop := false;
    let c = FFT.complex_create (Audio.to_mono buf) 0 blen in
    FFT.Window.cosine c;
    FFT.fft fft c;
    let c = Array.map (fun c -> c.Complex.re) c in
    write#write (Array.make read#channels c) 0 blen
  done;
  write#close;
  read#close

