Die Fourier-Transformation ist eine unverzichtbare Technik für die Durchführung wissenschaftlicher und technischer Forschung. ** In diesem Artikel wird das [scipy.fftpack-Modul] von scipy (https://docs.scipy.org/doc/scipy/reference/tutorial/fftpack.html#two-and-n-dimensional-discrete-fourier-transforms) [ Das Verfahren der diskreten Fourier-Hochgeschwindigkeitstransformation unter Verwendung von 1] wird anhand eines einfachen Beispiels zusammengefasst. ** ** ** Für die Methode der gewöhnlichen diskreten Fourier-Transformation wird auf die entsprechende Literatur verwiesen, da es einen elementaren Text gibt [2,3].
** In diesem Artikel wird die Verwendung der Hochgeschwindigkeits-Fourier-Konvertierungsbibliothek von scipy unter Berücksichtigung der Nutzungsszene am Arbeitsplatz in den Vordergrund gerückt [4]. Wenn Sie üben, während Sie die Funktionsweise von Beispiel (1) überprüfen, können Sie es bald vor Ort verwenden. ** ** **
(1) Beispiel einer eindimensionalen diskreten Fourier-Transformation (2) Beispiel einer 3D-Fourier-Transformation
In diesem Beispiel wird die Fourier-Transformation $ g (\ omega) $ der Gaußschen Funktion $ f (t) = e ^ {(- (t-5) ^ 2)} $ erhalten. Es werden nur die folgenden zwei Methoden verwendet.
Die Gesamtzahl der Daten N sei 40 und die Abtastbreite T sei von $ t = 0 $ bis $ t = 10 $ ($ T = 10 $).
Daher Zeitabtastung
Wird sein.
Dazu die diskreten Punkte der Frequenz $ \ omega $
Wird sein.
Der Programmablauf ist wie folgt.
** Eine schnelle Fourier-Transformation der gewünschten Funktion ist möglich, indem die Funktionsform von $ f (t) $ geändert wird. ** ** **
FFT1D.py
"""
Eindimensionale diskrete Fourier-Transformation
"""
import numpy as np
from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt
#Erstellen von Zeitreihen-Beispieldaten
N = 40 #Die Anzahl der Daten
T=10 #Stichprobenbreite
del_t= T/N #Abtastintervall
del_w=2*np.pi/T #Frequenzintervall der diskreten Fourier-Transformation
#
#Diskrete Punkterzeugung
t = np.arange(0,T-del_t,del_t)
w=np.arange(2*np.pi/T, 2*np.pi*N/T, del_w)
#
f = np.exp(-(t-5)**2) # #Funktion, die Beispieldaten liefert
#
g = fft(f)
g_real=np.real(g)
g_imag=np.imag(g)
#plot
plt.xlabel('w', fontsize=24)
plt.ylabel('g(w)', fontsize=24)
plt.plot(w,g_real,marker='o', markersize=4,label='Fourier transform: Real part')
plt.plot(w,g_imag,marker='o',markersize=4, label='Fourier transform: Imaginary part')
plt.legend(loc='best')
plt.show()
#Anzeige des Leistungsspektrums
plt.plot(w,np.abs(g)**2,marker='o',markersize=4,label='|g(w)|^2')
plt.xlabel('w', fontsize=24)
plt.ylabel('Power spectrum |g(w)|^2', fontsize=24)
plt.legend(loc='best')
plt.show()
#Inverse diskrete Fourier-Transformation
ff = ifft(g)
plt.plot(t, np.real(ff), label='Fourier inverse transform: Real part')
plt.plot(t, np.imag(ff), label='Fourier inverse transform: Imaginary part')
plt.plot(t, f,'o',markersize=4,label='Raw data')
plt.xlabel('t', fontsize=24)
plt.ylabel('f(t)', fontsize=24)
plt.legend(loc='best')
plt.show()
Abbildung 1. Diskrete Fourier-Transformation $ g (\ omega_n) $
Figur 2.Leistungsspektrum
Abbildung 3. Vergleich von inversen komplexen Fourier-transformierten (Linie) und abgetasteten Daten (grüner Kreis). Da ich an eine reale Funktion dachte, ist der Imaginärteil der inversen komplexen Fourier-Transformation Null.
In diesem Beispiel ist die dreidimensionale Gaußsche Funktion $ f (t_x, t_y, t_z) = e ^ {- [(t_x-5) ^ 2 + (t_y-5) ^ 2 + (t_z-5) ^ 2)]} $ Führt eine komplexe diskrete Fourier-Transformation mit hoher Geschwindigkeit durch. Im Vergleich zu Beispiel (1), das ein eindimensionales Problem war, gibt es mehr Indizes usw., aber der Inhalt ist nicht wesentlich schwierig.
Wie bei der eindimensionalen Methode gibt es nur die folgenden zwei Methoden für mehrdimensionale (zwei oder mehr).
** Die Dimension der Fourier-Transformation muss auf der Programmierseite nicht sehr nervös sein, da scipy sie bei der Durchführung der Fourier-Transformation anhand der Größe des Arrays bestimmt. **
Dieses Beispiel dient nur zur Funktionsprüfung und wird nicht visualisiert. Bei Bedarf kann jedoch problemlos die gewünschte Handlung erstellt werden.
Der Programmablauf ist wie folgt.
"""
Mehrdimensionale diskrete Fourier-Transformation
12. August 2017
"""
import numpy as np
from scipy.fftpack import fftn, ifftn #n-dimensionale diskrete Fourier / inverse Fourier-Transformation
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#Erstellen von Zeitreihen-Beispieldaten
Nx = 4 #Anzahl der Daten in Nx-Richtung
Ny = 4 #Anzahl der Daten in Ny-Richtung
Nz = 4 #Anzahl der Daten in Nz-Richtung
Tx=10 #Stichprobenbreite
Ty = 10
Tz = 10
del_t_x= Tx/Nx #Abtastintervall in Sendungsrichtung
del_t_y= Ty/Ny #Abtastintervall in Ty-Richtung
del_t_z= Tz/Nz #Abtastintervall in Ty-Richtung
del_w_x=2*np.pi/Tx #Abstand der x-Komponentenfrequenzen der diskreten Fourier-Transformation
del_w_y=2*np.pi/Ty #Abstand der y-Komponentenfrequenzen der diskreten Fourier-Transformation
del_w_z=2*np.pi/Tz #Abstand der z-Komponentenfrequenz der diskreten Fourier-Transformation
#
t_x, t_y, t_z= np.meshgrid(np.arange(0,Tx-del_t_x,del_t_x),np.arange(0,Ty-del_t_y,del_t_y), np.arange(0,Tz-del_t_z,del_t_z)) #Netzgenerierung
w_x, w_y, w_z= np.meshgrid(np.arange(2*np.pi/Tx, 2*np.pi*Nx/Tx, del_w_x),np.arange(2*np.pi/Ty, 2*np.pi*Ny/Ty, del_w_y), np.arange(2*np.pi/Tz, 2*np.pi*Nz/Tz, del_w_z)) #Netzgenerierung
#
f = np.exp(-((t_x-5)**2+(t_y-5)**2+(t_z-5)**2)) #Funktion, die Beispieldaten liefert
#
g = fftn(f) #Mehrdimensionale schnelle Fourier-Transformation:3D in diesem Fall
g_real=np.real(g) #Realteil
g_imag=np.imag(g) #Imaginärteil
#Inverse mehrdimensionale diskrete Fourier-Transformation
ff = ifftn(g)
ff_real=np.real(ff)#Realteil
ff_imag=np.imag(ff) #Imaginärteil
Lassen Sie uns einen kleinen numerischen Wert ausgeben.
print(g[1,2,1])
out: (-0.500000003576+0.862688207649j)
Dies bedeutet, dass die [1,2,1] -Komponente des Fourier-transformierten g -0,5 + 0,86i (komplexe Zahl) beträgt.
Als nächstes überprüfen wir die inverse Fourier-Transformation.
print(ff[1,2,2])
out: (0.00193045413623+0j)
Dies ist eine reelle Zahl. Ich kann problemlos rechnen.
Sie können Informationen aus vielen Büchern und Websites über "nicht schnelle" gewöhnliche diskrete Fourier-Transformationen erhalten. Die Referenzen 2 und 3 beziehen sich auch auf schnelle Fourier-Transformationen. Aufgrund der sorgfältigen Betrachtung des Lesers ist es sehr leicht zu lesen. 4 ist ein fremdes Buch, aber die Erklärung mit dem Wesen ist lesenswert.
Recommended Posts