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)

FFT réel/imaginaire/pièces en abs interprétation

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 :

FFT réel/imaginaire/pièces en abs interprétation

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