[PYTHON] Fourier-Transformation von Rohdaten

Ich habe versucht, die diskrete Fourier-Transformation mit Rohdaten zu analysieren

Ich habe versucht, die für das maschinelle Lernen erforderlichen Funktionen durch Fourier-Transformation aus Zeitreihendaten zu finden. Es gab einige Artikel, die automatisch periodische Funktionen erstellten und analysierten, aber ich nahm mir Zeit, um herauszufinden, wie ich mit tatsächlichen Daten umgehen sollte, und erstellte sie als Memorandum. Ich habe es auch zusammengefasst, einschließlich des Verständnisses der Konzepte und Begriffe. Es kann mehrdeutig sein, weil es ein grobes Verständnis ist. Bitte weisen Sie auf Fehler hin.

Diskrete Fourier-Transformation (DFT)

Um die Fourier-Transformation kurz zusammenzufassen: __ Eine Umwandlung des periodischen Signals von Zeitreihendaten für den Zeitbereich in ein Spektrum im Frequenzbereich __ werden. Durch Anwenden einer Fensterfunktion (im Allgemeinen eines summenden Fensters) wird sie auch zwangsweise als periodisch angesehen.

Schnelle Fourier-Transformation (FFT)

Die Hochgeschwindigkeits-Fourier-Transformation bezieht sich auf eine diskrete Fourier-Transformation, die mit hoher Geschwindigkeit berechnet werden kann, wenn die Anzahl der Daten die Potenz von 2 ist. Ich verstehe die Details von Formeln und Algorithmen nicht, aber wenn Sie eine große Datenmenge haben, können Sie erwarten, die Berechnungsgeschwindigkeit zu verbessern, indem Sie auf 0 auffüllen und die Anzahl der Daten auf die Potenz von 2 ausrichten.

Implementierung

Zunächst werden die Rohdaten so wie sie sind einer Fourier-Transformation unterzogen. Hier wird Numpys fft verwendet. (Numpy Version ist '1.18.1') https://numpy.org/doc/stable/reference/generated/numpy.fft.fft.html FFT ist eine schnelle Fourier-Transformation, aber wenn Sie einen Wert an numpy übergeben, wird sie Fourier-transformiert, auch wenn es sich nicht um eine Zweierpotenz handelt. Mit anderen Worten wird angenommen, dass FFT ausgeführt wird, wenn die Potenz von 2 Leistung ist, und DFT ausgeführt wird, wenn es nicht die Potenz von 2 ist. Diese Daten sind 30fps 1 Sekunde Daten Das heißt, die Probendaten 30 werden einer Fourier-Transformation unterzogen. Dieses Mal werden eine Spalte und 30 Zeilen einer bestimmten CSV-Datei als Daten behandelt.

Datenabruf


#Import der benötigten Bibliotheken
import numpy as np
#Lade Daten
data = np.loadtxt('____.csv', delimiter=',', dtype=float)
features = data[0:30,0:1]
features[0:30,0:1]

Die 30 Daten, die Sie analysieren möchten, wurden in Features importiert. Übrigens sind die Daten in Features die folgenden Array-Daten.

features


array([[0.32640783],[0.32772677],[0.32963271],[0.32872528],[0.33125733],[0.3250282 ],[0.33900562],[0.33105499],[0.33294834],[0.34554142],[0.33217829],[0.33006385],[0.33765947],[0.33173415],[0.33826796][0.34325231],[0.35284764],[0.34785128],[0.349527  ],[0.34782048],[0.35720176],[0.36520328],[0.37276383],[0.37766436],[0.37410199],[0.37990772],[0.38644416],[0.38045958],[0.37864619],[0.39122537]])

Wir haben mit der Implementierung fortgefahren und dabei auf die zugehörigen Artikel verwiesen. Der Implementierungscode und die Ergebnisse lauten wie folgt.

main


#Abtastfrequenz
rate = 30 # [1/s]

#Beispielzeit[s]
t = np.arange(0, 1, 1/rate)

#Signal
signal = np.ravel(features[0:30,0:1])
plt.plot(t, signal)
plt.xlim(0, 1)
plt.xlabel('time [s]', fontsize=20)
plt.title('Time series of signal', fontsize=20)
plt.show()
#print(np.ravel(signal))
# power spectrum
p = np.abs(np.fft.rfft(signal))

hammingWindow = np.hamming(30)    #Summen Fenster
plt.plot(t, hammingWindow*signal)
plt.show()
p2 = np.abs(np.fft.rfft(hammingWindow*signal))

#Gibt bei gegebener Abtastrate (die Umkehrung von) die Frequenz jeder Komponente zurück
f = np.fft.rfftfreq(signal.size, d=1./rate)
print(p)
print(np.fft.rfft(hammingWindow*signal),p2)

plt.xlabel("Frequency [Hz]", fontsize=20)
plt.ylabel("Amplitude spectrum", fontsize=20)
plt.yscale("log")
plt.plot(f, p)
plt.show()
plt.yscale("log")
plt.plot(f, p2)
plt.show()
#Schnelle Fourier-Transformation
F = np.fft.fft(hammingWindow*signal)
#Berechnen Sie das Amplitudenspektrum
Amp = np.abs(F)
freq = np.linspace(0, 1.0/0.03, 30) #Frequenzachse
print(np.fft.rfft(signal))
plt.plot(freq, Amp)
plt.show()

Ergebnis

Zunächst wurden die Daten (Merkmale) im Zeitbereich grafisch dargestellt.

image.png

Wenn Sie es betrachten, können Sie sehen, dass es keine Periodizität gibt ... Da der Zweck darin besteht, es zu implementieren, werden wir so weitermachen, wie es ist. Außerdem ist eine Form, die an ein summendes Fenster angepasst ist, das Periodizität verleiht, so.

image.png

Es sieht aus wie ein Zyklus. (Weil die Kanten ausgerichtet sind)

Das Ergebnis der Fourier-Transformation jedes von ihnen in ein Amplitudenspektrum ist wie folgt.

image.png

[10.49214916 0.35316679 0.16715576 0.10588365 0.04224876 0.08174254 0.0362962 0.03914191 0.04407553 0.07351728 0.02862219 0.05424663 0.06239112 0.03642959 0.04382539 0.01436891]

image.png

[5.44620123 2.3808305 0.0238307 0.02004583 0.03723908 0.02777476 0.00710696 0.01448964 0.00951674 0.02489049 0.01539931 0.01742193 0.01562835 0.01323487 0.01355436 0.01185119]

Die linke Achse ist ein logarithmischer Graph. Ein ähnliches Amplitudenspektrum wurde erhalten.

Wie oben beschrieben, wurde das Amplitudenspektrum durch Durchführen der Fourier-Transformation erhalten. Das Leistungsspektrum ist das Quadrat des Amplitudenspektrums. Wenn Sie also das Leistungsspektrum wünschen, können Sie das Amplitudenspektrum quadrieren.

Zusammenfassung

Im Folgenden waren die Begriffe Fourier-Transformation und Numpy beim Auffinden des Amplitudenspektrums kompliziert, daher werde ich sie zusammenfassen.

np.fft.fft: Gibt das Ergebnis der Fourier-Transformation zwischen Real- und Imaginärteil zurück np.fft.rfft: Gibt nur den Realteil zurück (1/2 Array von np.fft.fft)

Daher haben abs (np.fft.fft) und abs (np.fft.rfft) die gleiche Größe, aber unterschiedliche Rücklauflängen. np.fft.rfft ist die Hälfte von np.fft.fft. Es ist nicht notwendig, da es sich um eine komplexe konjugierte Beziehung handelt.

Fourier-Transformation und Python

F (w) = np.fft.fft (w): Fourierspektrum (Fourier-transformiert)

|F(w)| = np.abs(F(w)): Schwingungsspektrum(F(w)Absolutwert von)

|F(w)|^2: Leistungsspektrum[F(w)*(F(w)Konjugieren Sie die komplexe Anzahl von)], Quadrat des Amplitudenspektrums, Leistung(Leistung)Die Dimension von haben

Excel-Analyse

Tatsächlich ist die Fourier-Analyse im Datenanalysetool von Excel installiert. Als ich überprüfte, ob es dasselbe wie numpy war, wurden derselbe Realteil und Imaginärteil wie np.fft.fft zurückgegeben. Es kann besser sein, wenn das Programmieren schwierig ist. Die Werte werden jedoch zwischen dem Realteil und dem Imaginärteil gemischt, und eine neue Berechnung ist erforderlich, um das Amplitudenspektrum zu erhalten. Beachten Sie auch, dass in Excel die Anzahl der Daten nur ausgeführt werden kann, wenn es sich um eine Zweierpotenz handelt.

Inverse Fourier-Transformation

Es kann angenommen werden, dass die Niederfrequenzkomponente einen großen Umriss in der Diagrammform bildet und die Hochfrequenzkomponente verrauscht ist. Es wurde während einer Literaturrecherche gesehen. Wenn daher nur das Spektrum der Niederfrequenzkomponente 0 Hz bis 2 Hz als Ergebnis der Fourier-Umwandlung umgekehrt Fourier-transformiert wird, Ich dachte, ich könnte ein Diagramm in der Nähe der Originaldaten zeichnen, also habe ich es implementiert. Die ersten drei Daten von dem, was zuvor rffted wurde, bleiben unverändert, und die anderen werden auf 0 gesetzt.

irfft


plt.plot(t, np.fft.irfft([1.04921492e+01+0.j,8.98589353e-02+0.34154378j,-6.04938542e-02+0.15582535j,0,0,0,0,0,0,0,0,0,0,0,0,0]))
plt.show()

Ergebnis image.png

Es hat eine ähnliche Form im Vergleich zum Diagramm der Originaldaten. Daher kann gesagt werden, dass es reproduziert werden könnte (Eigenschaften könnten durch die Frequenzkomponente extrahiert werden).

Verweise

https://ja.wikipedia.org/wiki/離散フーリエ変換 https://numpy.org/doc/stable/reference/generated/numpy.fft.fft.html https://kyotogeopython.zawawahoge.com/html/基礎編/Numpyの基礎(7)便利なライブラリ群.html https://aidiary.hatenablog.com/entry/20110716/1310824587 https://www.geidai.ac.jp/~marui/r_program/spectrum.html

Recommended Posts

Fourier-Transformation von Rohdaten
Eigenschaften der diskreten Fourier-Transformation
Qiskit: Quanten-Fourier-Transformation
Vorverarbeitung von Präfekturdaten
Auswahl der Messdaten
Experiment zur Optimierung der Tensorflow-Daten
Visualisierung von Daten nach Präfektur
Durchschnittliche Schätzung der begrenzten Daten
Über die Datenverwaltung von Amboss-App-Server
Wahrscheinlichkeitsvorhersage von unausgeglichenen Daten
Vergleichen wir die Fourier-Transformation der synthetisierten Schallquelle und die Zusammensetzung der Fourier-Transformation
Signalverarbeitung in Python (1): Fourier-Transformation
Speichersparende Matrixkonvertierung von Protokolldaten
Differenzierung von Zeitreihendaten (diskret)
10 Auswahlen der Datenextraktion durch pandas.DataFrame.query
Animation von Geodaten durch Geopandas
Empfehlung zur Datenanalyse mit MessagePack
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Datenverarbeitung 2 Analyse verschiedener Datenformate
Regelmäßiger Export von Google Analytics-Rohdaten nach BigQuery mithilfe von Cloud-Funktionen