2015-11-21 6 views
5

Ich versuche gerade die fft-Funktion von numpy zu verstehen. Dafür habe ich folgende Annahme getestet:
Ich habe zwei Funktionen, f(x) = x^2 und g(x) = f'(x) = 2*x. Nach den Fourier-Transformationsgesetzen und Wolfram Alpha sollte es G(w) = 2pi*i*F(w) (Vorfaktoren können variieren, aber es sollte nur einen konstanten Faktor geben). Bei der Umsetzung der in Python, ich schreibeWie funktioniert numpy.fft.fft?

import numpy as np 
def x2(x): 
    return x*x 
def nx(x): 
    return 2*x 

a = np.linspace(-3, 3, 16) 
a1 = x2(a) 
a2 = nx(a) 

b1 = np.fft.fft(a1) 
b2 = np.fft.fft(a2) 

c = b1/b2 

Jetzt erwarte ich einen nahezu konstanten Wert für c, aber ich bekomme

array([ 1.02081592e+16+0.j  , 1.32769987e-16-1.0054679j , 
     4.90653893e-17-0.48284271j, -1.28214041e-16-0.29932115j, 
     -1.21430643e-16-0.2j  , 5.63664751e-16-0.13363573j, 
     -5.92271642e-17-0.08284271j, -4.21346622e-16-0.03978247j, 
     -5.55111512e-16-0.j  , -5.04781597e-16+0.03978247j, 
     -6.29288619e-17+0.08284271j, 8.39500693e-16+0.13363573j, 
     -1.21430643e-16+0.2j  , -0.00000000e+00+0.29932115j, 
     -0.00000000e+00+0.48284271j, 1.32769987e-16+1.0054679j ]) 

Wo ist mein Fehler, und was kann ich tun, um die fft zu verwenden wie beabsichtigt?

+2

Der falsche Teil hier ist 'G (w) = 2 pi i F (w) '. Sollte "G (w) = 2 pi i w F (w)" sein. –

+0

@DietrichEpp: Was ist w in diesen Arrays, und ist es auch imaginär? –

+0

@arc_lupus 'w' ist der Frequenzraum, der äquivalent zu' x' ist. In diesem Fall haben Sie 'x^2' im ursprünglichen Raum, der an sich keine Frequenz hat (zumindest nicht im leicht verständlichen Sinn), so dass Sie eine Vielzahl von verschiedenen Peaks erhalten, die' x repräsentieren^2'. Zum Beispiel, wenn 'f (x) = sin (x)', dann hätten Sie eine schöne, einfache Delta-Funktion bei 1, um die einfache Frequenz in 'sin (x)' zu erfassen. –

Antwort

5

Die angegebenen Eigenschaften gelten für die Continuous Fourier transform (CFT). Was von der FFT berechnet wird, ist die Discrete Fourier transform (DFT), die mit der CFT verwandt ist, aber nicht genau äquivalent ist.

Es stimmt, dass die DFT unter bestimmten Bedingungen proportional zur CFT ist: nämlich mit ausreichender Abtastung einer Funktion, die außerhalb der Probengrenzen Null ist (siehe z. B. Anhang E von this book).

Keine der beiden Bedingungen gilt für die Funktionen, die Sie oben vorschlagen, daher ist die DFT nicht proportional zur CFT und Ihre numerischen Ergebnisse spiegeln das wider.


Hier einige Code, der die Beziehung, die Sie interessiert sind, unter Verwendung eines entsprechend abgetasteten bandbegrenzten Funktion über die FFT bestätigt:

import numpy as np 

def f(x): 
    return np.exp(-x ** 2) 
def fprime(x): 
    return -2 * x * f(x) 

a = np.linspace(-10, 10, 100) 
a1 = f(a) 
a2 = fprime(a) 

b1 = np.fft.fft(a1) 
b2 = np.fft.fft(a2) 
omega = 2 * np.pi * np.fft.fftfreq(len(a), a[1] - a[0]) 

np.allclose(b1 * 1j * omega, b2) 
# True