Commit 796624d9 authored by Raymond Toy's avatar Raymond Toy
Browse files

Add and update some comments.

Add warning that rfft and cfft have different definitions for the
forward transform.  The sign of the exponential is different.  I do
not know why.

Note that the documentation from FFTPACK51 has the same issue with the
additional issue that the CFFT is not normalized by N whereas the RFFT
is.
parent 24f81156
...@@ -93,10 +93,8 @@ ...@@ -93,10 +93,8 @@
for n = 0, 1,...,floor(N/2)+1 for n = 0, 1,...,floor(N/2)+1
NOTE: This differs from the typical engineering definition of the WARNING: This definition differs from the formula used for CFFT
forward FFT, where the transfrom is often not normalized by the which uses exp(-2*%pi*%i*k*n/N)!"
length and the argument to exp has a negative sign. This is
generally considered the inverse FFT in engineering"
(declare (type (simple-array double-float (*)) x)) (declare (type (simple-array double-float (*)) x))
(let* ((n (length x)) (let* ((n (length x))
...@@ -219,6 +217,17 @@ ...@@ -219,6 +217,17 @@
wsave))))) wsave)))))
(defun cfft (x) (defun cfft (x)
"Compute the FFT of a complex array X
Let N be the length of X. The FFT is:
Y[n] = 1/N*sum(x[k] * exp(-2*%pi*%i*n*k/N), k = 0, N-1)
for n = 0, 1,...,N -1
WARNING: This definition differs from RFFT which has
exp(+2*%pi*%i*n*k/N)"
(declare (type (simple-array (complex double-float) (*)) x)) (declare (type (simple-array (complex double-float) (*)) x))
(let* ((n (length x)) (let* ((n (length x))
(lenwrk (* 2 n)) (lenwrk (* 2 n))
...@@ -254,6 +263,12 @@ ...@@ -254,6 +263,12 @@
(defun test-cfft (n &key verbose) (defun test-cfft (n &key verbose)
(let* ((x (make-array n :element-type '(complex double-float)))) (let* ((x (make-array n :element-type '(complex double-float))))
;; The test signal is a simple ramp: 1, 2, 3,..., N.
;;
;; The analytical FFT for this is:
;;
;; X[0] = (N+1)/2
;; X[n] = -1/2 + %i*cot(%pi*n/N)/2
(loop for k from 0 below n (loop for k from 0 below n
do do
(setf (aref x k) (complex (+ k 1) 0d0))) (setf (aref x k) (complex (+ k 1) 0d0)))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment