FFT réel/imaginaire/pièces en abs interprétation
Je suis actuellement en apprentissage sur discret transformée de Fourier et je suis en train de jouer avec numpy pour mieux le comprendre.
J'ai essayé de tracer une "sin x sin x sin" signal et d'obtenir un nettoyage FFT avec 4 non-zéro points. J'ai naïvement me suis dit : "eh bien, si j'ai tracé un "sin + sin + sin + sin" signal avec ces amplitudes et les fréquences, je devrais obtenir le même "sin x sin x sin" le signal, droit?
... Pas exactement
(Le premier est "x" du signal, le second est "+" signal)
Les deux partagent les mêmes amplitudes et des fréquences, mais ne sont pas les mêmes signaux, même si je peux voir qu'ils ont quelques similitudes.
Ok, puisque je n'ai tracé les valeurs absolues de la FFT, je pense que j'ai perdu quelques informations.
Puis j'ai tracé partie réelle, partie imaginaire et la valeur absolue pour les deux signaux :
Maintenant, je suis confus. Que dois-je faire avec tout cela? J'ai lu sur la DFT à partir d'un point de vue mathématique. Je comprends que les valeurs complexes proviennent du cercle unité. J'ai même eu à apprendre à propos de l'espace de Hilbert pour comprendre comment il fonctionne (et c'est pénible!...et j'ai seulement effleuré la surface). Je voudrais seulement comprendre si ces réel/imaginaire parcelles ont tout béton signification en dehors de mathématiques monde:
- abs(fft) : les fréquences + amplitudes
- réel(fft) : ?
- imaginaire(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()
OriginalL'auteur Cyrille | 2014-09-02
Vous devez vous connecter pour publier un commentaire.
Pour chaque fréquence bin, le ampleur
sqrt(re^2 + im^2)
vous indique l'amplitude de la composante à la fréquence correspondante. Le phaseatan2(im, re)
vous indique la phase relative de la composante. Les parties réelles et imaginaires, sur leur propre, ne sont pas particulièrement utile, sauf si vous êtes intéressé dans les propriétés de symétrie autour de la fenêtre de données du centre (même contre impair).Des Questions?: 1) je suppose que la partie réelle du nombre complexe au carré est positif, non? 2) Quel est le signe de la partie imaginaire du nombre complexe quand il est au carré? Est-il négatif parce que sqrt(-1)**2, -1?
non, pense que des nombres complexes comme
re + j * im
. Donc, à la foisre
etim
sont des valeurs réelles, et les deuxre^2
etim^2
sera positif.OriginalL'auteur Paul R
Avec le respect d'un certain point de référence, dire le centre d'une fenêtre de temps fixe, une onde sinus et un cosinus de l'onde de même fréquence, seront différents (ont différentes phases de départ à l'égard de tout temps fixe de point de référence). Ils seront également mathématiquement orthogonale sur tout entier périodique de la largeur, de sorte que peut représenter de manière indépendante composantes du vecteur d'une transformation.
La partie réelle d'une FFT résultat est de savoir combien de chaque composante de fréquence ressemble à une onde cosinus, la partie imaginaire, combien chaque composant ressemble à une onde sinusoïdale. Divers rapports de sinus et cosinus ensemble des composants permettent de construire une sinusoïde de tout arbitraire ou de phase souhaitée, permettant ainsi à la FFT raison d'être complète.
Ampleur seul ne peut pas faire la différence entre un sinus et le cosinus de l'onde. Une IFFT(imag(FFT)) serait gâcher la reconstruction d'un signal avec une phase différente de pure cosinus. Même avec IFFT(re(FFT)) et les ondes sinusoïdales pures (par rapport à la FFT ouverture de la fenêtre).
OriginalL'auteur hotpaw2
Vous pouvez convertir le signal 1, qui consiste en un produit de trois fonctions cos à une somme de quatre cos fonctions. Ce qui fait la différence à la fonction 2 qui est une somme de quatre fonctions sinus.
Une fonction cos est une fonction paire cos(-x) == cos(x).
La Transformation de Fourier d'une fonction paire est pur réel.
C'est la raison pour laquelle le tracé de la partie imaginaire de la fft de la fonction 1 ne contient que des valeurs proches de zéro (1e-15).
La fonction sinus est impaire sin(-x) == -sin(x).
La Transformation de Fourier d'une fonction impaire est imaginaire pur.
C'est la raison pour laquelle le tracé de la partie réelle de la fft de la fonction 2 ne contient que des valeurs proches de zéro (1e-15).
Si vous voulez comprendre la FFT et DFT plus en détail de lire un manuel d'analyse du signal pour le génie électrique.
OriginalL'auteur Heinz M.