2015-11-21 46 views
5

Obecnie próbuję zrozumieć funkcję fft od numpy. W tym celu przetestowałem następujące założenie:
Mam dwie funkcje, f(x) = x^2 i g(x) = f'(x) = 2*x. Zgodnie z prawami transformacji Fouriera i wolfram alpha powinno być tak, że G(w) = 2pi*i*F(w) (przedrostki mogą się różnić, ale powinien być tylko stały czynnik). Przy wdrażaniu że w Pythonie, piszęJak działa 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 

Teraz jestem spodziewa się prawie stałą wartość c, ale pojawia

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

Gdzie jest mój błąd, i co mogę zrobić, aby korzystać z FFT jak zamierzono?

+2

Nieprawidłowe część Oto 'G (w) = 2 pi i F (w) '. Powinno to być 'G (w) = 2 pi i w F (w)'. –

+0

@DietrichEpp: Co to jest w tych tablicach i czy jest to również wyobrażenie? –

+0

@arc_lupus 'w' jest częstotliwością-przestrzenią równoważną' x'. W tym przypadku masz 'x^2' w oryginalnej przestrzeni, która nie ma częstotliwości, per se (przynajmniej nie w sensie łatwym do zrozumienia), więc otrzymasz wiele różnych pików reprezentujących' x^2'. Np., Jeśli 'f (x) = sin (x)', to masz ładną, prostą funkcję delta w 1, aby uchwycić prostą częstotliwość w 'sin (x)'. –

Odpowiedz

5

Podane właściwości dotyczą modelu Continuous Fourier transform (CFT). To, co jest obliczane przez FFT, to Discrete Fourier transform (DFT), które jest związane z CFT, ale nie jest dokładnie równoważne.

To prawda, że ​​DFT jest proporcjonalny do CFT w pewnych warunkach: mianowicie przy wystarczającym próbkowaniu funkcji, która wynosi zero poza granicami próbki (patrz np. Załącznik E this book).

Żaden warunek nie obowiązuje dla funkcji, które proponuje się powyżej, więc DFT nie jest proporcjonalny do CFT, a wyniki liczbowe to odzwierciedlają.


Oto niektóre kod, który potwierdza poprzez FFT relację jesteś zainteresowany, za pomocą odpowiednio próbkowany funkcję pasmo ograniczone:

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