2014-09-02 18 views
8

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)

enter image description here

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:

enter image description here

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() 

Antwort

16

Für jeden Frequenzbin die Größenordnungsqrt(re^2 + im^2) Sie erkennen die Amplitude der Komponente bei der entsprechenden Frequenz. Die Phaseatan2(im, re) teilt Ihnen die relative Phase dieser Komponente mit. Die realen und imaginären Teile allein sind nicht besonders nützlich.

+1

Vielen Dank an Sie und hotpaw2. Ich denke ich verstehe es jetzt viel besser. Ich wusste nicht einmal die Existenz von atan2! – Cyrille

+0

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? –

+1

@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. –

4

In Bezug auf einen Referenzpunkt, sagen die Mitte eines festen Zeitfensters, eine Sinuswelle und eine Kosinuswelle der gleichen Frequenz wird anders aussehen (unterschiedliche Anfangsphasen in Bezug auf jeden festen Zeitreferenzpunkt haben). Sie sind auch mathematisch orthogonal über jede ganze periodische Breite, so dass sie unabhängige Basisvektorkomponenten einer Transformation darstellen können.

Der reale Teil eines FFT-Ergebnisses ist, wie viel jede Frequenzkomponente einer Kosinuswelle ähnelt, die Imaginärkomponente, wie viel jede Komponente einer Sinuswelle ähnelt. Verschiedene Verhältnisse von Sinus- und Kosinuskomponenten zusammen erlauben es, eine Sinuskurve beliebiger oder gewünschter Phase zu konstruieren, wodurch das FFT-Ergebnis vollständig sein kann.

Größe allein kann den Unterschied zwischen einer Sinus- und Kosinuswelle nicht erkennen. Eine IFFT (imag (FFT)) würde die Rekonstruktion eines Signals mit einer anderen Phase als die reinen Kosinuswellen zunichte machen.Gleiches gilt für IFFT (re (FFT)) und reine Sinuswellen (in Bezug auf das FFT-Fenster).

1

Sie können das Signal 1, das aus einem Produkt von drei cos-Funktionen besteht, in eine Summe von vier cos-Funktionen umwandeln. Dies macht den Unterschied zur Funktion 2, die eine Summe von vier Sinusfunktionen ist.

Eine Cos-Funktion ist eine gerade Funktion cos (-x) == cos (x). Die Fourier-Transformation einer geraden Funktion ist rein real. Dies ist der Grund, warum die Darstellung des Imaginärteils des fft von Funktion 1 nur Werte nahe Null enthält (1e-15).

Eine Sinusfunktion ist eine ungerade Funktion sin (-x) == -sin (x). Die Fourier-Transformation einer ungeraden Funktion ist rein imaginär. Das ist der Grund, warum die Darstellung des reellen Teils des fft von Funktion 2 nur Werte nahe Null enthält (1e-15).

Wenn Sie FFT und DFT im Detail verstehen möchten, lesen Sie ein Lehrbuch der Signalanalyse für die Elektrotechnik.

+0

Sie haben Recht, ich habe das gute Beispiel (sin/cos) nicht eingereicht. Nun, ich lese verschiedene Lehrbücher, Webseiten, schaue mir Videos an, ein DSP Mooc, aber sie bestehen meistens aus einigen (zumindest für mich) einschüchternden mathematischen Konzepten und Formeln und erfordern zusätzliche Untersuchungen wie diese. Ich beginne sie zu verstehen, aber ich habe noch einen langen Weg vor mir. Dank der vorherigen Antworten kann ich nun jedes Signal manuell rekonstruieren, indem ich Cosinus-Teilsignale (da das ursprüngliche Signal echt ist) mit entsprechenden Größen und Phasen addiere. Die Phasenformel war der Schlüssel, den ich vermisste. Deshalb habe ich Paul R akzeptiert – Cyrille