2014-06-06 39 views
11

Rozważmy funkcję f (t), jak obliczyć ciągłą Fouriertransform g (w) i wykreślić ją (używając numpy i matplotlib)?Dyskretna ciągła transformata Fouriera z numpy

Ten problem lub odwrotny (G (w), podany wykres f (t) nieznany) występuje wówczas, gdy nie istnieje analityczne rozwiązanie integralny Fouriera.

+0

+1 więc napisać jakieś pytanie, a następnie odpowiedzieć na to sam? – GingerHead

+5

Tak, czytałem, że ludzie są do tego zachęcani. Był to jeden z niewielu problemów z numpy/matplotlib, na które nie znalazłem rozwiązania, używając google. Pomyślałem, że podzielę się tym rozwiązaniem. Strona, na której przeczytałem o odpowiedzi na własne pytanie, była dostępna pod adresem http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – thomasfermi

+0

Witam, czy byłbyś tak miło, żeby rzucić okiem na moje pytanie [tutaj] (http://stackoverflow.com/questions/34428886/discrete-fourier-transfromation-from-a-list-of-xy-points)? –

Odpowiedz

15

Możesz użyć do tego celu numpy FFT module, ale musisz wykonać dodatkową pracę. Najpierw spójrzmy na całkę Fouriera i dyskretyzujmy ją: Tutaj k, m to liczby całkowite i N liczba punktów danych dla f (t). Używając tej dyskretyzacji dostajemy enter image description here

sumy w ostatniej wypowiedzi jest dokładnie taka dyskretna transformacja Fouriera (DFT) wykorzystuje NumPy (patrz sekcja „szczegóły implementacji” w numpy FFT module). Dzięki tej wiedzy możemy napisać następujący skrypt Pythona

import numpy as np 
import matplotlib.pyplot as pl 

#Consider function f(t)=1/(t^2+1) 
#We want to compute the Fourier transform g(w) 

#Discretize time t 
t0=-100. 
dt=0.001 
t=np.arange(t0,-t0,dt) 
#Define function 
f=1./(t**2+1.) 

#Compute Fourier transform by numpy's FFT function 
g=np.fft.fft(f) 
#frequency normalization factor is 2*np.pi/dt 
w = np.fft.fftfreq(f.size)*2*np.pi/dt 


#In order to get a discretisation of the continuous Fourier transform 
#we need to multiply g by a phase factor 
g*=dt*np.exp(-complex(0,1)*w*t0)/(np.sqrt(2*np.pi)) 

#Plot Result 
pl.scatter(w,g,color="r") 
#For comparison we plot the analytical solution 
pl.plot(w,np.exp(-np.abs(w))*np.sqrt(np.pi/2),color="g") 

pl.gca().set_xlim(-10,10) 
pl.show() 
pl.close() 

Powstały fabuła pokazuje, że skrypt działa enter image description here

+3

+1 Za dobry sposób na opublikowanie pytania i samodzielne odpowiadanie na nie! – GingerHead

+0

Jeśli w ten sposób obliczasz (dyskretyzowane) FT, możesz uwzględnić częstotliwości mniejsze od 1 lub okresy będące wielokrotnością długości tablicy wejściowej? Być może mógłbyś pomóc w udzieleniu odpowiedzi na to pytanie: http://dsp.stackexchange.com/questions/39017/looking-for-cycles-of-odiods-długich-the-input-signal- length – mac13k

+0

Tak, dla częstotliwości- do-time-transformacji Fouriera POWINIUESZ zawrzeć małe częstotliwości, w przeciwnym razie twój wynik na długie czasy nie będzie zbyt dobry. Myślę, że twoje pytanie nie jest bezpośrednio związane i nie mogę odpowiedzieć na to bez poważnych badań, przepraszam. – thomasfermi