2017-02-21 1 views
1

J'essaie de comprendre comment fonctionne fft en python (ou en général).
Lorsque j'ai un signal enregistré pendant quelques secondes, je peux seulement afficher une seconde de cette FFT.
Existe-t-il un moyen de prendre toutes les données et de calculer la moyenne? Je l'ai fait auparavant dans LabView. Quelqu'un peut-il aider?FFT Numpy sur quelques secondes

Voici un exemple de code que j'utilise.

from numpy import linspace, sin, pi, log10, average, arange 
from matplotlib.pyplot import plot, show, figure 
from numpy.fft import fft, fftfreq 

N = 1000 * 60 * 4 
dt = 1/1000 
x = linspace(0, N*dt, N) 
freq = linspace(10, 200, N) 
sinsweep = sin(x*freq) 
mavg = [average(sinsweep[i*60:(i+1)*60]) for i in range(int(N/60))] 
plot(freq, sinsweep, '.') 
plot(linspace(10, 200, int(N/60)), mavg, '.') 

f = figure() 
t = arange(60) 
sp = fft(mavg, n=60) 
freq = fftfreq(t.shape[-1]) 
plot(sp.imag) 
show() 

plot data fft

+0

Je ne comprends pas ce que vous essayez de faire. Quelle est votre sortie attendue. Le code que vous utilisez fonctionne. Il prend le signal moyen dans une seconde et affiche plusieurs secondes. – Glostas

+0

J'essaie d'obtenir un graphique fft qui montre pendant toute la durée du test toutes les fréquences. Ce qui signifie que je shold obtenir une large gamme de 10 à 200 Hz. –

+1

Ensuite, prenez la FFT du signal et vous avez terminé – Glostas

Répondre

1

Je donne quelques modifications à votre code, pour obtenir un beau spectre. D'abord j'augmente le nombre de points pour vérifier le critère de Shannon. Et quelques astuces pour
améliorer la vitesse.

from numpy import linspace, sin, pi, log10, average, arange 
from matplotlib.pyplot import plot, show, figure 
from numpy.fft import fft, fftfreq 
close() 
N = 10000 * 60 * 4 
dt = 1/10000 
t = arange(0, N*dt, dt) 
freq = linspace(10, 200, N) 
sinsweep = sin(t*freq) 
mavg = sinsweep.reshape(-1,60).mean(1) 
tm=t[::60] 
figure('signal') 
plot(tm, mavg)  
sp = fft(mavg) 
freq = fftfreq(tm.size,dt*60) 
valid=freq>0 
figure('spectrum') 
plot(freq[valid],abs(sp[valid])) 
show() 

pour enter image description here

Est-ce que vous attendiez?

+0

Oui, merci. Mais je ne comprends pas comment le programme FFT sait à quelle fréquence je travaille? S'il calcule toutes les données, il peut supposer que les données sont à 1Hz? Et encore une question quelles sont les unités dans le Y, si l'entrée est disons m? Merci encore. –

+1

Te (échantillonnage) est 1/dt, le temps total est t_max-t_min. Y n'est pas normalisé: vous devez le diviser par (N/2) pour avoir la bonne grandeur. votre «moyen» (/ 60) ne facilite pas de parler de tout cela. –