2014-06-06 9 views
11

Betrachten Sie eine Funktion f (t), wie berechne ich die kontinuierliche Fouriertransformation g (w) und plotte sie (mit numpy und matplotlib)?Diskretisierte kontinuierliche Fourier-Transformation mit numpy

Diese oder das inverse Problem (G (w) gegeben, Auftragung von f (t) nicht bekannt) tritt auf, wenn es keine analytische Lösung für das Fourier-Integral existiert.

+0

+1 arbeitet schreiben So haben Sie eine Frage zu schreiben und es dann von selbst beantworten? – GingerHead

+5

Ja, ich habe gelesen, dass Leute dazu ermutigt werden. Dies war eine der wenigen numpy/matplotlib-Probleme, für die ich keine Lösung gefunden habe. Also dachte ich, ich würde die Lösung teilen. Die Seite, wo ich über das Beantworten Ihrer eigenen Frage las, war hier http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – thomasfermi

+0

Hallo, würden Sie sein so nett, meine Frage [hier] (http://stackoverflow.com/questions/34428886/discrete-fourier-transfromation-from-a-list-of-xy-points) zu sehen? –

Antwort

15

Sie können die numpy FFT module dafür verwenden, müssen aber etwas zusätzliche Arbeit zu tun. Zuerst betrachten wir das Fourier-Integral und diskretisieren es: Hier sind k, m ganze Zahlen und N die Anzahl der Datenpunkte für f (t). Diese Diskretisierung benutzen wir enter image description here

Die Summe in dem letzten Ausdruck ist genau die diskreten Fourier-Transformation (DFT) numpy verwendet (siehe Abschnitt „Implementierungsdetails“ des numpy FFT module) erhalten. Mit diesem Wissen können wir den folgenden Python-Skript

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

Die resultierende Kurve zeigt, dass das Skript enter image description here

+3

+1 Für eine nette Art, eine Frage zu veröffentlichen und selbst zu beantworten! – GingerHead

+0

Wenn Sie eine (diskretisierte) FT auf diese Weise berechnen, können Sie dann Frequenzen kleiner als 1 oder Punkte einschließen, die ein Vielfaches der Länge des Eingabearrays sind? Vielleicht könnten Sie helfen, diese Frage zu beantworten: http://dsp.stackexchange.com/questions/39017/looking-for-cycles-of-periods-longer-than-the-input-signal-length – mac13k

+0

Ja, für eine Frequenz- zu-Zeit-Fourier-Transformation sollten Sie kleine Frequenzen einschließen, sonst wird Ihr Ergebnis für lange Zeiten nicht sehr gut sein. Ich denke, Ihre Frage ist nicht direkt verwandt, und ich kann sie nicht beantworten, ohne selbst beträchtliche Nachforschungen anzustellen, tut mir leid. – thomasfermi

Verwandte Themen