# [Numpy-discussion] FFT usage / consistency

Felix Richter felix@physik3.uni-rostock...
Tue Jul 29 08:04:41 CDT 2008

```> Do your answers differ from the theory by a constant factor, or are
> they completely unrelated?

No, it's more complicated. Below you'll find my most recent, more stripped
down code.

- I don't know how to scale in a way that works for any n.
- I don't know how to get the oscillations to match. I suppose its a problem
with the frequency scale, but usage of fftfreq() is straightforward...
- I don't know why the imaginary part of the FFT behaves so different from the
real part. It should just be a matter of sin vs. cos.

Is this voodoo? ;-)

And I didn't find any example on the internet which tries just to reproduce an
analytic FT with the FFT...

# coding: UTF-8
"""Test for FFT against analytic results"""

from scipy import *
from scipy import fftpack as fft
import pylab

def expdecay(t, dx, a):
return exp(-a*abs(t))*exp(1j*dx*t) * sqrt(pi/2.0)

def lorentz(x, dx, a):
return a/((x-dx)**2+a**2)

origfunc = lorentz
exactfft = expdecay

xrange, dxrange = linspace(0, 100, 2**12, retstep=True)
n = len(xrange)

# calculate original function over positive half of x-axis
# this serves as input to fft, make sure datatype is complex
ftdata = zeros(xrange.shape, complex128)
ftdata += origfunc(xrange, 50, 1.0)

# do FFT
fftft  = fft.fft(ftdata)
# normalize
# but how exactly?
fftft /= sqrt(n)

# shift frequencies into human-readable order
fftfts= fft.fftshift(fftft)

# determine frequency axis
fftscale = fft.fftfreq(n, dxrange)
fftscale = fft.fftshift(fftscale)

# calculate exact result of FT for comparison
exactres = exactfft(fftscale, 50, 1.0)

pylab.subplot(211)
pylab.plot(xrange, ftdata.real, 'x', label='Re data')
pylab.legend()
pylab.subplot(212)
pylab.plot(fftscale, fftfts.real, 'x', label='Re FFT(data)')
pylab.plot(fftscale, fftfts.imag, '.', label='Im FFT(data)')
pylab.plot(fftscale, exactres.real, label='exact Re FT')
pylab.plot(fftscale, exactres.imag, label='exact Im FT')
pylab.legend()
pylab.show()
pylab.close()
```