Ich habe Probleme mit numpy
Implementierung der schnellen Fourier-Transformation. Mein Signal ist nicht periodisch und daher sicherlich kein idealer Kandidat, das Ergebnis der FFT ist jedoch weit entfernt von dem, was ich erwartet habe. Es ist das gleiche Signal, einfach um einen Faktor gestreckt. I aufgetragen, um eine Sinuskurve, annähert mein Signal neben ihn, die veranschaulichen soll, dass ich die FFT-Funktion richtig nutzen:numpys schnelle Fourier-Transformation liefert unerwartete Ergebnisse
import numpy as np
from matplotlib import pyplot as plt
signal = array([[ 0.], [ 0.1667557 ], [ 0.31103874], [ 0.44339886], [ 0.50747922],
[ 0.47848347], [ 0.64544846], [ 0.67861755], [ 0.69268326], [ 0.71581176],
[ 0.726552 ], [ 0.75032795], [ 0.77133769], [ 0.77379966], [ 0.80519187],
[ 0.78756476], [ 0.84179849], [ 0.85406538], [ 0.82852684], [ 0.87172407],
[ 0.9055542 ], [ 0.90563205], [ 0.92073452], [ 0.91178145], [ 0.8795554 ],
[ 0.89155587], [ 0.87965686], [ 0.91819571], [ 0.95774404], [ 0.95432073],
[ 0.96326252], [ 0.99480947], [ 0.94754962], [ 0.9818627 ], [ 0.9804966 ],
[ 1.], [ 0.99919711], [ 0.97202208], [ 0.99065786], [ 0.90567128],
[ 0.94300558], [ 0.89839004], [ 0.87312245], [ 0.86288378], [ 0.87301008],
[ 0.78184963], [ 0.73774451], [ 0.7450479 ], [ 0.67291666], [ 0.63518575],
[ 0.57036157], [ 0.5709147 ], [ 0.63079811], [ 0.61821523], [ 0.49526048],
[ 0.4434457 ], [ 0.29746173], [ 0.13024641], [ 0.17631683], [ 0.08590552]])
sinus = np.sin(np.linspace(0, np.pi, 60))
plt.plot(signal)
plt.plot(sinus)
Die blaue Linie ist mein Signal, die grüne Linie ist die Sinus.
transformed_signal = abs(np.fft.fft(signal)[:30]/len(signal))
transformed_sinus = abs(np.fft.fft(sinus)[:30]/len(sinus))
plt.plot(transformed_signal)
plt.plot(transformed_sinus)
Die blaue Linie ist transformed_signal
, ist die grüne Linie die transformed_sinus
.
Plotten nur transformed_signal
zeigt das Verhalten oben beschrieben:
Kann mir jemand erklären, was hier vor sich geht?
UPDATE
Ich war in der Tat ein Problem, die FFT des Aufrufs. Dies ist den richtigen Anruf und das richtige Ergebnis:
transformed_signal = abs(np.fft.fft(signal,axis=0)[:30]/len(signal))
Oder, wenn die Absicht war, dass "Signal" ein 1D-Vektor ist, transformiere es mit etwas wie "np.array ([x [0] für x in Signal])" – mtrw