fft#
- scipy.fft.fft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *, plan=None)[Quelle]#
Berechnet die 1-D diskrete Fourier-Transformation.
Diese Funktion berechnet die n-Punkte diskrete Fourier-Transformation (DFT) der 1. Dimension mit dem effizienten Fast Fourier Transform (FFT) Algorithmus [1].
- Parameter:
- xarray_like
Eingabearray, kann komplex sein.
- nint, optional
Länge der transformierten Achse der Ausgabe. Wenn n kleiner ist als die Länge der Eingabe, wird die Eingabe gekürzt. Wenn sie größer ist, wird die Eingabe mit Nullen aufgefüllt. Wenn n nicht angegeben ist, wird die Länge der Eingabe entlang der durch axis angegebenen Achse verwendet.
- axisint, optional
Achse, entlang derer die FFT berechnet werden soll. Wenn nicht angegeben, wird die letzte Achse verwendet.
- norm{“backward”, “ortho”, “forward”}, optional
Normalisierungsmodus. Standard ist „backward“, was bedeutet, dass keine Normalisierung bei den Vorwärtstransformationen und Skalierung mit
1/nbei deriffterfolgt. „forward“ wendet stattdessen den Faktor1/nauf die Vorwärtstransformation an. Fürnorm="ortho"werden beide Richtungen mit1/sqrt(n)skaliert.Hinzugefügt in Version 1.6.0: Optionen
norm={"forward", "backward"}wurden hinzugefügt- overwrite_xbool, optional
Wenn True, kann der Inhalt von x zerstört werden; der Standardwert ist False. Siehe die Hinweise unten für weitere Details.
- workersint, optional
Maximale Anzahl von Workern für parallele Berechnungen. Wenn negativ, wickelt sich der Wert von
os.cpu_count()herum. Weitere Details finden Sie unten.- planobject, optional
Dieses Argument ist für die Übergabe eines vorab berechneten Plans von nachgelagerten FFT-Anbietern reserviert. Es wird derzeit in SciPy nicht verwendet.
Hinzugefügt in Version 1.5.0.
- Rückgabe:
- outcomplex ndarray
Die abgeschnittene oder mit Nullen aufgefüllte Eingabe, transformiert entlang der durch axis angegebenen Achse oder der letzten Achse, wenn axis nicht angegeben ist.
- Löst aus:
- IndexError
wenn achsen größer ist als die letzte Achse von x.
Siehe auch
Hinweise
FFT (Fast Fourier Transform) bezieht sich auf eine Methode, mit der die diskrete Fourier-Transformation (DFT) effizient berechnet werden kann, indem Symmetrien in den berechneten Termen genutzt werden. Die Symmetrie ist am höchsten, wenn n eine Zweierpotenz ist, und die Transformation ist daher für solche Größen am effizientesten. Für schlecht zerlegbare Größen verwendet
scipy.fftden Algorithmus von Bluestein [2] und ist daher nie schlechter als O(n log n). Weitere Leistungsverbesserungen können durch Auffüllen der Eingabe mit Nullen mitnext_fast_lenerzielt werden.Wenn
xein 1D-Array ist, dann ist diefftäquivalent zuy[k] = np.sum(x * np.exp(-2j * np.pi * k * np.arange(n)/n))
Der Frequenzterm
f=k/nbefindet sich beiy[k]. Beiy[n/2]erreichen wir die Nyquist-Frequenz und gehen zu den Negativfrequenztermen über. Bei einer 8-Punkte-Transformation sind die Frequenzen des Ergebnisses also [0, 1, 2, 3, -4, -3, -2, -1]. Um die FFT-Ausgabe so anzuordnen, dass die Nullfrequenzkomponente zentriert ist, wie [-4, -3, -2, -1, 0, 1, 2, 3], verwenden Siefftshift.Transformationen können in einfacher, doppelter oder erweiterter Präzision (long double) Gleitkommazahlen durchgeführt werden. Eingaben in halber Präzision werden in einfache Präzision umgewandelt und nicht-Gleitkommazahl-Eingaben werden in doppelte Präzision umgewandelt.
Wenn der Datentyp von
xreell ist, wird automatisch ein „Real FFT“-Algorithmus verwendet, der die Berechnungszeit etwa halbiert. Um die Effizienz noch etwas weiter zu steigern, verwenden Sierfft, das die gleiche Berechnung durchführt, aber nur die Hälfte des symmetrischen Spektrums ausgibt. Wenn die Daten sowohl reell als auch symmetrisch sind, kann diedctdie Effizienz erneut verdoppeln, indem die Hälfte des Spektrums aus der Hälfte des Signals generiert wird.Wenn
overwrite_x=Trueangegeben ist, kann der vonxreferenzierte Speicher von der Implementierung beliebig verwendet werden. Dies kann die Wiederverwendung des Speichers für das Ergebnis beinhalten, ist aber keinesfalls garantiert. Sie sollten sich nach der Transformation nicht auf den Inhalt vonxverlassen, da sich dieser ohne Vorwarnung in Zukunft ändern kann.Das Argument
workersgibt die maximale Anzahl paralleler Jobs an, in die die FFT-Berechnung aufgeteilt wird. Dies führt unabhängige 1-D-FFTs innerhalb vonxaus. Daher mussxmindestens 2-dimensional sein und die nicht-transformierten Achsen müssen groß genug sein, um sie in Chunks aufzuteilen. Wennxzu klein ist, können weniger Jobs als angefordert verwendet werden.Referenzen
[1]Cooley, James W., und John W. Tukey, 1965, „An algorithm for the machine calculation of complex Fourier series“, Math. Comput. 19: 297-301.
[2]Bluestein, L., 1970, „A linear filtering approach to the computation of discrete Fourier transform“. IEEE Transactions on Audio and Electroacoustics. 18 (4): 451-455.
Beispiele
>>> import scipy.fft >>> import numpy as np >>> scipy.fft.fft(np.exp(2j * np.pi * np.arange(8) / 8)) array([-2.33486982e-16+1.14423775e-17j, 8.00000000e+00-1.25557246e-15j, 2.33486982e-16+2.33486982e-16j, 0.00000000e+00+1.22464680e-16j, -1.14423775e-17+2.33486982e-16j, 0.00000000e+00+5.20784380e-16j, 1.14423775e-17+1.14423775e-17j, 0.00000000e+00+1.22464680e-16j])
In diesem Beispiel hat eine reelle Eingabe eine FFT, die hermitesch ist, d. h. im Realteil symmetrisch und im Imaginärteil antisymmetrisch.
>>> from scipy.fft import fft, fftfreq, fftshift >>> import matplotlib.pyplot as plt >>> t = np.arange(256) >>> sp = fftshift(fft(np.sin(t))) >>> freq = fftshift(fftfreq(t.shape[-1])) >>> plt.plot(freq, sp.real, freq, sp.imag) [<matplotlib.lines.Line2D object at 0x...>, <matplotlib.lines.Line2D object at 0x...>] >>> plt.show()