[Wissenschaftlich-technische Berechnung von Python] 1-dimensionale 3D-diskrete Hochgeschwindigkeits-Fourier-Transformation, scipy

Einführung

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. ** ** **

Inhalt

(1) Beispiel einer eindimensionalen diskreten Fourier-Transformation (2) Beispiel einer 3D-Fourier-Transformation


Beispiel (1): Eindimensionale diskrete 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.

  1. scipy.fftpack. ** fft ** Fourier-Transformation
  2. scipy.fftpack. ** ift ** inverse Fourier-Transformation

Die Gesamtzahl der Daten N sei 40 und die Abtastbreite T sei von $ t = 0 $ bis $ t = 10 $ ($ T = 10 $).

Daher Zeitabtastung

t_n \ = \frac{nT}{N} (n =0, 1, ..., N-1)

Wird sein.

Dazu die diskreten Punkte der Frequenz $ \ omega $

\omega_k = \frac{2k\pi}{T} (k=1,2,3,...,N)

Wird sein.

Der Programmablauf ist wie folgt.

  1. Die Gaußsche Funktion $ f (t) = e ^ {(- (t-5) ^ 2)} $ wird an 40 Punkten von t = 0 bis 10 gleichmäßig abgetastet.
  2. Verwenden Sie ** fft, um es in eine komplexe diskrete Fourier-Transformation umzuwandeln und $ g (\ omega_n) $ zu erhalten. ** ** **
  3. Visualisieren Sie es (** Abbildung 1 **). Es ist in einen Realteil und einen Imaginärteil unterteilt. 4.Leistungsspektrum|g(\omega_n)|^2Wird berechnet und illustriert(Figur 2)。
  4. ** Konvertiere $ g (\ omega_n) $ erneut durch Fourier-Transformation (inverse Fourier-Transformation), um die Funktion $ ff (t) $ zu erhalten. ** ** **
  5. Vergleichen Sie $ ff (t) $ mit $ f (t) $ (** Abbildung 3 **). Reproduzieren Sie die angegebenen Datenpunkte genau.

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

Ergebnis (1) Eindimensionale diskrete Hochgeschwindigkeits-Fourier-Transformation

t1.png

Abbildung 1. Diskrete Fourier-Transformation $ g (\ omega_n) $

t2.png

Figur 2.Leistungsspektrum|g(\omega_n)|^2

t3.png

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.


Beispiel (2) Dreidimensionale diskrete Fourier-Hochgeschwindigkeitstransformation

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

  1. scipy.fftpack. ** fftn ** n-dimensionale Fourier-Transformation
  2. scipy.fftpack. ** iftn ** n-dimensionale inverse Fourier-Transformation

** 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.

  1. Gaußsche Funktion $ f (t_x, t_y, t_z) = e ^ {- [(t_x-5) ^ 2 + (t_y-5) ^ 2 + (t_z-5) ^ 2)]} , "3 Die Dimensionszeit " tx, ty, tz $ wird an 4 Punkten von t = 0 bis 10 gleichmäßig abgetastet (Nx, Ny, Nz = 4, 4, 4).
  2. Verwenden Sie ** fftn, um es in eine komplexe diskrete Fourier-Transformation umzuwandeln und $ g (\ omega_ {x_n}, \ omega_ {y_m}, \ omega_ {z_k}) $ zu erhalten. ** ** **
  3. ** Inverse Fourier-Transformation mit ifftn, um die Funktion $ f (t_x, t_y, t_z) $ zu erhalten. ** ** **
  4. Versuchen Sie, den numerischen Wert auszugeben.
""" 
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


Ergebnis (2): Schnelle diskrete 3D-Fourier-Transformation

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.


Verweise

  1. scipys scipy.fftpack-Modul Webseite
  2. Kenichi Kanaya, ["Angewandte Mathematikklasse, die Sie verstehen können"](https://www.amazon.co.jp/%E3%81%93%E3%82%8C%E3%81%AA%E3%82 % 89% E5% 88% 86% E3% 81% 8B% E3% 82% 8B% E5% BF% 9C% E7% 94% A8% E6% 95% B0% E5% AD% A6% E6% 95% 99 % E5% AE% A4% E2% 80% 95% E6% 9C% 80% E5% B0% 8F% E4% BA% 8C% E4% B9% 97% E6% B3% 95% E3% 81% 8B% E3 % 82% 89% E3% 82% A6% E3% 82% A7% E3% 83% BC% E3% 83% 96% E3% 83% AC% E3% 83% 83% E3% 83% 88% E3% 81 % BE% E3% 81% A7-% E9% 87% 91% E8% B0% B7-% E5% 81% A5% E4% B8% 80 / dp / 4320017382), Kyoritsu Publishing, 2003.
  3. Strang, ["Einführung in die lineare Algebra"](https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E6%A8%99%E6%BA%96MIT%E6 % 95% 99% E7% A7% 91% E6% 9B% B8-% E3% 82% B9% E3% 83% 88% E3% 83% A9% E3% 83% B3% E3% 82% B0-% E7 % B7% 9A% E5% BD% A2% E4% BB% A3% E6% 95% B0% E3% 82% A4% E3% 83% B3% E3% 83% 88% E3% 83% AD% E3% 83 % 80% E3% 82% AF% E3% 82% B7% E3% 83% A7% E3% 83% B3-% E3% 82% AE% E3% 83% AB% E3% 83% 90% E3% 83% BC% E3% 83% 88 / dp / 4764904055), Modern Science Co., Ltd., 2015.
  4. Mark Newman, "Computational Physics", Createspace Independent Publishing Platform, 2012.

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

[Wissenschaftlich-technische Berechnung von Python] 1-dimensionale 3D-diskrete Hochgeschwindigkeits-Fourier-Transformation, scipy
[Wissenschaftlich-technische Berechnung mit Python] Spline-Interpolation dritter Ordnung, scipy
[Wissenschaftlich-technische Berechnung mit Python] Summenberechnung, numerische Berechnung
[Wissenschaftlich-technische Berechnung nach Python] Numerische Integration, Trapezgesetz / Simpson-Gesetz, numerische Berechnung, scipy
[Wissenschaftlich-technische Berechnung mit Python] Inverse Matrixberechnung, numpy
[Wissenschaftlich-technische Berechnung mit Python] Histogramm, Visualisierung, Matplotlib
[Wissenschaftlich-technische Berechnung mit Python] Lagrange-Interpolation, numerische Berechnung
[Wissenschaftlich-technische Berechnung von Python] Anpassung durch nichtlineare Funktion, Zustandsgleichung, scipy
[Wissenschaftlich-technische Berechnung mit Python] Lösen (verallgemeinerter) Eigenwertprobleme mit numpy / scipy mithilfe von Bibliotheken
[Wissenschaftlich-technische Berechnung mit Python] Logistisches Diagramm, Visualisierung, Matplotlib
[Wissenschaftlich-technische Berechnung mit Python] Polarkoordinatendiagramm, Visualisierung, Matplotlib
[Wissenschaftlich-technische Berechnung von Python] Grundlegende Operation des Arrays, numpy
[Wissenschaftlich-technische Berechnung mit Python] Monte-Carlo-Integration, numerische Berechnung, Numpy
[Wissenschaftlich-technische Berechnung durch Python] Liste der Verwendung von (speziellen) Funktionen, die in der Physik unter Verwendung von scipy verwendet werden
[Wissenschaftlich-technische Berechnung mit Python] Lösen simultaner linearer Gleichungen, numerische Berechnung, Numpy
[Wissenschaftlich-technische Berechnung mit Python] Beispiel für die Visualisierung von Vektorfeld, elektrostatischem Magnetfeld, Matplotlib
[Wissenschaftlich-technische Berechnung mit Python] 2D-Random-Walk (Drunken-Walk-Problem), numerische Berechnung
[Wissenschaftlich-technische Berechnung mit Python] Berechnung des Matrixprodukts mit @ operator, python3.5 oder höher, numpy
[Wissenschaftlich-technische Berechnung mit Python] Lösen gewöhnlicher Differentialgleichungen, mathematischer Formeln, Sympy
[Wissenschaftlich-technische Berechnung von Python] Zeichnungsanimation der parabolischen Bewegung mit Locus, Matplotlib
[Wissenschaftlich-technische Berechnung mit Python] Lösen der gewöhnlichen Differentialgleichung zweiter Ordnung nach der Numerov-Methode, numerische Berechnung
[Wissenschaftlich-technische Berechnung von Python] Numerische Berechnung zur Ermittlung des Ableitungswerts (Differential)
[Wissenschaftlich-technische Berechnung mit Python] Analytische Lösungssympathie zur Lösung von Gleichungen
[Wissenschaftlich-technische Berechnung mit Python] Zeichnen, visualisieren, matplotlib 2D-Daten mit Fehlerleiste
[Wissenschaftlich-technische Berechnung von Python] Zeichnung von 3D-gekrümmter Oberfläche, Oberfläche, Drahtrahmen, Visualisierung, Matplotlib
[Wissenschaftlich-technische Berechnung nach Python] Lösen der eindimensionalen Newton-Gleichung nach der Runge-Kutta-Methode 4. Ordnung
[Wissenschaftlich-technische Berechnung mit Python] Plot, Visualisierung, Matplotlib von 2D-Daten, die aus einer Datei gelesen wurden
[Wissenschaftlich-technische Berechnung mit Python] Zeichnen, Visualisieren, Matplotlib von 2D-Konturlinien (Farbkonturen) usw.
[Python] Einzeilige FFT (schnelle Fourier-Transformation) und anderer Wahnsinn
[Wissenschaftlich-technische Berechnung mit Python] Numerische Lösung der gewöhnlichen Differentialgleichung zweiter Ordnung, Anfangswertproblem, numerische Berechnung
[Wissenschaftlich-technische Berechnung mit Python] Liste der Matrizen, die in Hinpan in der numerischen linearen Algebra vorkommen
[Wissenschaftliche und technische Berechnung von Python] Zeichnung fraktaler Figuren [Shelpinsky-Dreieck, Bernsley-Farn, fraktaler Baum]
[Wissenschaftlich-technische Berechnung von Python] Wellen "Stöhnen" und Gruppengeschwindigkeit, Wellenüberlagerung, Visualisierung, Physik der High School
[Wissenschaftlich-technische Berechnung nach Python] Numerische Lösung des Problems des eindimensionalen harmonischen Oszillators nach der Speed-Berle-Methode
[Wissenschaftlich-technische Berechnung nach Python] Numerische Lösung des Eigenwertproblems der Matrix durch Potenzmultiplikation, numerische lineare Algebra
[Wissenschaftlich-technische Berechnung nach Python] Monte-Carlo-Simulation nach der Metropolenmethode der Thermodynamik des 2D-Anstiegsspinsystems
Wissenschaftlich-technische Berechnung mit Python] Zeichnen und Visualisieren von 3D-Isoplanes und deren Querschnittsansichten mit Mayavi
[Wissenschaftlich-technische Berechnung nach Python] Ableitung analytischer Lösungen für quadratische und kubische Gleichungen, mathematische Formeln, Sympy
Signalverarbeitung in Python (1): Fourier-Transformation
Eigenschaften der diskreten Fourier-Transformation
[Wissenschaftlich-technische Berechnung durch Python] Lösung des Randwertproblems gewöhnlicher Differentialgleichungen im Matrixformat, numerische Berechnung
[Wissenschaftlich-technische Berechnung von Python] Lösen der eindimensionalen Schrödinger-Gleichung im stationären Zustand durch Schießmethode (1), Potential vom Well-Typ, Quantenmechanik