home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-04-27 | 2.2 KB | 62 lines | [TEXT/????] |
- ;;; $Header: fft.scm,v 1.4 88/01/26 07:43:39 GMT gjs Exp $
-
- (if-mit
- (declare (usual-integrations = + - * /
- zero? 1+ -1+
- ;; truncate round floor ceiling
- sqrt exp log sin cos)))
-
- ;;;; Discrete Fourier Transform -- GJS -- 8 April 1987
- ;;; Implemented using FFT for records whose length is a power of 2.
- ;;; Data records are represented as lists of (complex) numbers.
-
- (define (power-of-2? n)
- (and (integer? n)
- (positive? n)
- (let lp ((n n)) (or (= n 1) (and (even? n) (lp (quotient n 2)))))))
-
- (define (make-transform-pair period)
- (define (roots-of-unity n)
- (let ((n/2 (/ n 2)) (2pi/n (/ 2pi n)))
- (let loop ((k 0))
- (if (= k n/2)
- '()
- (cons (make-rectangular (cos (* 2pi/n k)) (sin (* 2pi/n k)))
- (loop (1+ k)))))))
- (define (evens list)
- (if (null? list)
- '()
- (cons (car list) (evens (cddr list)))))
- (define (odds list)
- (if (null? list)
- '()
- (cons (cadr list) (odds (cddr list)))))
- ;; Below here all arithmetic is assumed to be complex generic.
- (define (fft-internal data ws)
- (if (null? (cdr data))
- data
- (let ((ews (if (null? (cdr ws)) ws (evens ws))))
- (let ((even-fft (fft-internal (evens data) ews))
- (odd-fft (map * ws (fft-internal (odds data) ews))))
- (append (map + even-fft odd-fft)
- (map - even-fft odd-fft))))))
- (if (power-of-2? period)
- (let* ((w-list (roots-of-unity period))
- (w*-list (map conjugate w-list)))
- (define (ft data)
- (if (= period (length data))
- (map (lambda (z) (/ z period))
- (fft-internal data w*-list))
- (error "Wrong length data record -- FT" period)))
- (define (ift data)
- (if (= period (length data))
- (fft-internal data w-list)
- (error "Wrong length data record -- IFT" period)))
- (list period ft ift))
- (error "Period is not a power of 2 -- MAKE-TRANSFORM-PAIR")))
-
- ;;; For example, we may:
- ;;; (define fts (make-transform-pair 64))
- ;;; (define ft (cadr fts)) ; This gets the transform.
- ;;; (define ift (caddr fts)) ; This gets the inverse transform.
-