2015-11-21 26 views
5

Attualmente sto cercando di capire la funzione fft da numpy. Per questo ho testato la seguente ipotesi:
Ho due funzioni, f(x) = x^2 e g(x) = f'(x) = 2*x. Secondo le leggi di trasformazione di Fourier e wolfram alfa dovrebbe essere quello G(w) = 2pi*i*F(w) (i prefattori possono variare, ma dovrebbe esserci solo un fattore costante). In sede di attuazione che in python, scrivoCome funziona 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 

Ora mi aspetto un valore quasi costante per c, ma ho

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 ]) 

Dov'è il mio errore, e quello che posso fare per utilizzare la FFT come inteso?

+2

La parte non corretta qui è 'G (w) = 2 pi i F (w) '. Dovrebbe essere 'G (w) = 2 pi i w F (w)'. –

+0

@DietrichEpp: che cosa è w in quegli array, ed è anche immaginario? –

+0

@arc_lupus 'w' è lo spazio di frequenza equivalente a' x'. In questo caso, hai 'x^2' nello spazio originale, che non ha frequenza, di per sé (almeno non nel senso di facile comprensione), quindi otterrai una moltitudine di picchi diversi per rappresentare' x^2'. Ad esempio, se 'f (x) = sin (x)', allora avresti una funzione di delta semplice, semplice a 1 per catturare la semplice frequenza in 'sin (x)'. –

risposta

5

Le proprietà fornite si applicano allo Continuous Fourier transform (CFT). Quello che viene calcolato dalla FFT è lo Discrete Fourier transform (DFT), che è correlato al CFT ma non è esattamente equivalente.

È vero che la DFT è proporzionale alla CFT in determinate condizioni: vale a dire con un campionamento sufficiente di una funzione che è pari a zero al di fuori dei limiti del campione (si veda ad esempio l'Appendice E di this book).

Nessuna condizione vale per le funzioni che si propongono in precedenza, quindi la DFT non è proporzionale alla CFT ei risultati numerici lo riflettono.


Ecco po 'di codice che conferma tramite la FFT il rapporto che ti interessa, utilizzando una funzione di banda limitata in modo appropriato campionato:

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