(define mksin (let ((twopi (* 2 (atan 0 -1)))) ; n = points ; f = frequency ; sr = sample rate (lambda (n f sr) (let ((out (make-f64vector (fx+ n 2))) (step (/ 1 sr))) (do ((i 0 (fx+ i 1))) ((fx= i n) out) (f64vector-set! out i (+ 20.0 (* 1 (sin (* twopi f (* step i))))))))))) (let* ((nn 50000) (sr 50000) (osz (fx+ 1 (fx/ nn 2))) (in (mksin nn 12000 sr)) (out (make-f64vector (fx* 2 osz)))) (rfft (list nn) in in) (do ((i 0 (fx+ i 1))) ((fx>= i nn)) (f64vector-set! in i (/ (f64vector-ref in i) nn))) (do ((i 0 (fx+ i 2))) ((fx>= i nn)) (let ((re (f64vector-ref in i)) (im (f64vector-ref in (fx+ 1 i)))) (print (/ (* (/ (fx- i 0) 2) sr) nn) #\: (/ (sqrt (+ (* re re) (* im im))) 1)) )) (irfft (list nn) in in))