1: | | (declare (fixnum)) |
2: | | |
3: | | ;; (include "fftbasic.scm") |
4: | | |
5: | | (define fftw-holder (make-f64vector (* 64 64 2))) |
6: | | |
7: | | (define (slice->fftw-holder slice) |
8: | 0% | (let ((accessor (Array-accessor slice))) |
9: | 0% | (let outer ((i 0) |
10: | | (k 0)) |
11: | .01% | (if (< i 64) |
12: | .03% | (let inner ((j 0) |
13: | 0% | (k k)) |
14: | .83% | (if (< j 64) |
15: | .7% | (let ((value (accessor i j))) |
16: | 2.% | (f64vector-set! fftw-holder k (Complex-real value)) |
17: | 2.36% | (f64vector-set! fftw-holder (+ k 1) (Complex-imag value)) |
18: | 1.43% | (inner (+ j 1) |
19: | .56% | (+ k 2))) |
20: | .01% | (outer (+ i 1) |
21: | 0% | k))))))) |
22: | | |
23: | | (define (slice<-fftw-holder slice) |
24: | 0% | (let ((setter (Mutable-array-setter slice))) |
25: | 0% | (let outer ((i 0) |
26: | 0% | (k 0)) |
27: | .02% | (if (< i 64) |
28: | .02% | (let inner ((j 0) |
29: | 0% | (k k)) |
30: | .82% | (if (< j 64) |
31: | | (let () |
32: | 1.16% | (setter (make-Complex (f64vector-ref fftw-holder k) |
33: | 1.14% | (f64vector-ref fftw-holder (+ k 1))) |
34: | .4% | i j) |
35: | 1.27% | (inner (+ j 1) |
36: | .6% | (+ k 2))) |
37: | .01% | (outer (+ i 1) |
38: | .01% | k))))))) |
39: | | |
40: | | |
41: | | (define (fftwc-slice slice) |
42: | 0% | (slice->fftw-holder slice) |
43: | 0% | (fftwc fftw-holder) |
44: | .19% | (slice<-fftw-holder slice)) |
45: | | |
46: | | ;;; the arguments here are in the order i (for volumes) to l (for columns) |
47: | | |
48: | | (define (fftwc-volume volume) |
49: | | (Array-for-each fftwc-slice (curry volume 1))) |
50: | | |
51: | | (define (fftwc-data data) |
52: | | (Array-for-each fftwc-slice (curry data 2))) |
53: | | |
54: | | (declare (generic)) |