2016-07-22 19 views
2

Im FFT (zweiten) Diagramm erwarte ich eine größere Spitze bei Frequenz = 1,0, verglichen mit anderen Frequenzen, da es sich um ein 1 Hz Rechtecksignal bei 5Hz handelt.Wie finde ich die Frequenz einer Rechteckwelle mit FFT

Ich bin ein Anfänger in diesem, möglicherweise fehlt etwas albern hier Hier ist, was ich getan habe:

import numpy as np 
from matplotlib import pyplot as plt 
from scipy import signal 
t500 = np.linspace(0,5,500,endpoint=False) 
s1t500 = signal.square(2*np.pi*1.0*t500) 

Erste Plot zeigt 1 Hz Rechteckwelle bei 5 Hz abgetastet für 5 Sekunden:

t5 = np.linspace(0,5,25,endpoint=False) 
t5 = t5 + 1e-14 
s1t5 = signal.square(2.0*np.pi*1.0*t5) 
plt.ylim(-2,2); plt.plot(t500,s1t500,'k',t5,s1t5,'b',t5,s1t5,'bo'); plt.show() 

1 Hz Square Wave sampled at 5Hz

Hier in der zweiten Handlung erwarte ich das magn es ist bei f = 1 Hz mehr als bei f = 2. Fehle ich etwas?

y1t5 = np.fft.fft(s1t5) 
ff1t5 = np.fft.fftfreq(25,d=0.2) 
plt.plot(ff1t5,y1t5); plt.show() 

FFT for 1 Hz Square Wave sampled at 5Hz

+0

Dies scheint eine Eigenschaft von DFT zu sein, fand ich ein ähnliches Beispiel in der Matlab-Dokumentation: http://de.mathworks.com/help/matlab/math/discrete-fourier-transform-dft.html – jojonas

Antwort

4

Es scheint, dass Sie die Tatsache übersehen, dass Fourier produziert Funktionen Transformation (oder Zahlenfolgen bei DFT/FFT) in komplexen Raum:

>>> np.fft.fft(s1t5) 
[ 5. +0.j   0. +0.j   0. +0.j   0. +0.j   0. +0.j 
    5.-15.38841769j 0. +0.j   0. +0.j   0. +0.j   0. +0.j 
    5. +3.63271264j 0. +0.j   0. +0.j   0. +0.j   0. +0.j 
# and so on 

Um zu sehen, das Amplitudenspektrum auf Ihrer Parzelle anwenden np.absolute oder abs:

>>> np.absolute(np.fft.fft(s1t5)) 
[ 5.   0.   0.   0.   0.   16.18033989 
    0.   0.   0.   0.   6.18033989 0.   0. 
    0.   0.   6.18033989 0.   0.   0.   0. 
    16.18033989 0.   0.   0.   0.  ] 

Ansonsten wird nur der reale Teil angezeigt.

+0

Was wäre, wenn Ich benutze 'np.fft.rfft', sollte dies nicht die erwartete 1/n-Abhängigkeit zurückgeben? – jojonas

+0

Wenn Sie eine symmetrische Rechteckwelle haben, dann ist die FFT wirklich real (um die Genauigkeit der Maschine zu erhöhen). Hier ein Beispiel dafür in Matlab: http://blogs.mathworks.com/steve/2010/07/16/ complex-surprises-from-fft/ –

+0

@AhmedFasih OP transformiert nicht die tatsächliche 1-Hz-Rechteckwelle, sondern einen Satz von Proben, die mit einer Abtastrate von 5 Hz erzeugt wurden. Dies führt den Imaginärteil ein. – Vovanrock2002