[Matrix-SIG] FFT derivative
Warren B. Focke
warren@pfiesteria.gsfc.nasa.gov
Thu, 4 Nov 1999 17:37:47 -0500 (EST)
On Thu, 4 Nov 1999, Jean-Bernard ADDOR wrote:
> Do you have any hint? Do you know about any code in any language which do
> that, and I could just translate into python? Are any books with detailled
> example of the use of the FFT to compute derivatives?
Try this:
--------------------------
import FFT, Numeric, umath
def deriv(series, num=None, axis=-1):
fspace = FFT.fft(series, num, axis)
fspace = fderiv(fspace, num, axis)
return(FFT.inverse_fft(fspace, num, axis))
def fderiv(fspace, num=None, axis=-1):
if num == None:
num = fspace.shape[axis]
n2 = (num - 1) / 2
iomega = ((Numeric.arange(num) + n2) % num) - n2
iomega = iomega.astype('D') * 2.0 * Numeric.pi * 1.0j / num
dims = len(fspace.shape)
if dims > 1:
newshape = [1] * dims
newshape[axis] = num
iomega.shape = newshape
dspace = fspace * iomega
# if the length is even, zero out the value at nyquist
nyq = num / 2
if (nyq*2 == num):
if dims > 1:
sly = [slice(None)] * dims
sly[axis] = nyq
else:
sly = nyq
dspace[sly] = 0.0
return(dspace)
------------------------------
Note that the results will still look "bad" if the sequence you are taking
the derivative of is not continuous at high order across its endpoints.
> # from the FT theory it should be -1j instead of 1j, why?
Probably because some people put the minus sign on the forward transform,
and others on the reverse, and FFTPACK does the opposite of what you
expected.
Warren Focke