[Matrix-SIG] FFT derivative
William Park
parkw@better.net
Fri, 5 Nov 1999 07:05:00 -0500
On Thu, Nov 04, 1999 at 05:00:43PM -0500, Jean-Bernard ADDOR wrote:
> Hey Numerical people!
>
> I wrote a python code for derivation in Fourrier space, and it gives very
> bad results. The idea is to multiply the transform of the data by -ik.
>
> 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?
Do you want h'(t) or H'(f)? For your reference,
h'(t) <==> j2\pi f H(f)
-j2\pi t h(t) <==> H('f)
so the discrete version can be found by substituting
f = n/(NT), t = kT
where T is time sampling interval.
>
>
> Jean-Bernard
>
> def FFTderivative(a, order=1, axis=-1):
> from Numeric import arange
> from FFT import fft, inverse_fft
> a = Numeric.asarray(a) # works on arbitrary python sequence
> l = a.shape[axis]/2
> m = a.shape[axis] - 2*l
> if axis != -1: a = Numeric.swapaxes(a, axis, -1)
> b = fft(concatenate((a, a[...,::-1]), -1)) # JD trick, could be made
> nicer
> c =
> (1j*concatenate((arange(a.shape[-1]),arange(-a.shape[-1],0))))**order
> #c = (1j*concatenate((arange(l+m),arange(-l,0))))**order # was before
> fourier space doubling
> # from the FT theory it should be -1j instead of 1j, why?
The usual engineering convention is to use e^{-j2\pi ft} to go from time
domain to frequency domain. But, there are people who still use
e^{j2\pi ft} or, even worse, e^{j\omega t}.
> d = b*c
> r = inverse_fft(d)[...,:a.shape[-1]]
> if a.typecode() != 'D' and a.typecode() != 'F': # not complex type
> r = r.real
> if axis != -1: r = Numeric.swapaxes(r, axis, -1)
> return r
>
>
>
> _______________________________________________
> Matrix-SIG maillist - Matrix-SIG@python.org
> http://www.python.org/mailman/listinfo/matrix-sig