Ich lerne gerade über Diskrete Fourier-Transformation und ich spiele mit numpy, um es besser zu verstehen.FFT real/imaginär/abs Teile Interpretation
Ich versuchte, ein "sin x sin x sin" Signal zu plotten und eine saubere FFT mit 4 Nicht-Nullpunkten zu erhalten. Ich sagte mir naiv: "Nun, wenn ich ein Signal" sin + sin + sin + sin "mit diesen Amplituden und Frequenzen auftrage, sollte ich das gleiche" sin x sin x sin "Signal erhalten, richtig?
Nun. .. nicht genau
(Erste ist "x" -Signal ist an zweiter Stelle "+" Signal)
Sowohl die gleichen Amplituden/Frequenzen teilen, aber sind nicht die gleichen Signale, auch wenn ich kann sehen, sie haben einige Ähnlichkeiten.
Ok, sin Ich habe nur absolute Werte von FFT gezeichnet, ich glaube, ich habe einige Informationen verloren.
Dann aufgetragen I Realteil, Imaginärteil und absolute Werte für beide Signale:
Nun, ich bin verwirrt. Was mache ich mit all dem? Ich lese über DFT aus einer mathematischen Sichtweise. Ich verstehe, dass komplexe Werte aus dem Einheitskreis kommen. Ich musste sogar etwas über den Hilbert-Raum lernen, um zu verstehen, wie es funktioniert (und es war schmerzhaft! ... und ich kratzte nur an der Oberfläche). Ich wünschte nur, wenn diese real/imaginären Plots außerhalb mathematischer Welt jede konkrete Bedeutung zu verstehen:
- abs (fft): Frequenzen + Amplituden
- real (fft):?
- imaginäre (fft):?
Code:
import numpy as np
import matplotlib.pyplot as plt
N = 512 # Sample count
fs = 128 # Sampling rate
st = 1.0/fs # Sample time
t = np.arange(N) * st # Time vector
signal1 = \
1 *np.cos(2*np.pi * t) *\
2 *np.cos(2*np.pi * 4*t) *\
0.5 *np.cos(2*np.pi * 0.5*t)
signal2 = \
0.25*np.sin(2*np.pi * 2.5*t) +\
0.25*np.sin(2*np.pi * 3.5*t) +\
0.25*np.sin(2*np.pi * 4.5*t) +\
0.25*np.sin(2*np.pi * 5.5*t)
_, axes = plt.subplots(4, 2)
# Plot signal
axes[0][0].set_title("Signal 1 (multiply)")
axes[0][0].grid()
axes[0][0].plot(t, signal1, 'b-')
axes[0][1].set_title("Signal 2 (add)")
axes[0][1].grid()
axes[0][1].plot(t, signal2, 'r-')
# FFT + bins + normalization
bins = np.fft.fftfreq(N, st)
fft = [i/(N/2) for i in np.fft.fft(signal1)]
fft2 = [i/(N/2) for i in np.fft.fft(signal2)]
# Plot real
axes[1][0].set_title("FFT 1 (real)")
axes[1][0].grid()
axes[1][0].plot(bins[:N/2], np.real(fft[:N/2]), 'b-')
axes[1][1].set_title("FFT 2 (real)")
axes[1][1].grid()
axes[1][1].plot(bins[:N/2], np.real(fft2[:N/2]), 'r-')
# Plot imaginary
axes[2][0].set_title("FFT 1 (imaginary)")
axes[2][0].grid()
axes[2][0].plot(bins[:N/2], np.imag(fft[:N/2]), 'b-')
axes[2][1].set_title("FFT 2 (imaginary)")
axes[2][1].grid()
axes[2][1].plot(bins[:N/2], np.imag(fft2[:N/2]), 'r-')
# Plot abs
axes[3][0].set_title("FFT 1 (abs)")
axes[3][0].grid()
axes[3][0].plot(bins[:N/2], np.abs(fft[:N/2]), 'b-')
axes[3][1].set_title("FFT 2 (abs)")
axes[3][1].grid()
axes[3][1].plot(bins[:N/2], np.abs(fft2[:N/2]), 'r-')
plt.show()
Vielen Dank an Sie und hotpaw2. Ich denke ich verstehe es jetzt viel besser. Ich wusste nicht einmal die Existenz von atan2! – Cyrille
Fragen ?: 1) Ich nehme an, der wahre Teil der komplexen Zahl im Quadrat ist positiv, oder? 2) Was ist das Vorzeichen des Imaginärteils der komplexen Zahl, wenn sie quadriert ist? Ist es negativ, weil sqrt (-1) ** 2 -1 ist? –
@ox .: Nein, denke an komplexe Zahlen als 're + j * im'. Also sind "re" und "im" echte Werte, und sowohl "re^2" als auch "im^2" sind positiv. –