web-dev-qa-db-fra.com

Analyse de fréquence Scipy / Numpy FFT

Je cherche comment transformer l'axe des fréquences en fft (pris via scipy.fftpack.fftfreq) en fréquence en Hertz, plutôt qu'en bacs ou bacs fractionnaires.

J'ai essayé de coder ci-dessous pour tester la FFT:

t = scipy.linspace(0,120,4000)
acc = lambda t: 10*scipy.sin(2*pi*2.0*t) + 5*scipy.sin(2*pi*8.0*t) + 2*scipy.random.random(len(t))

signal = acc(t)

FFT = abs(scipy.fft(signal))
FFT = scipy.fftpack.fftshift(FFT)
freqs = scipy.fftpack.fftfreq(signal.size)

pylab.plot(freqs,FFT,'x')
pylab.show()

Le taux d'échantillonnage doit être de 4000 échantillons/120 secondes = 33,34 échantillons/s.

Le signal a un signal de 2,0 Hz, un signal de 8,0 Hz et du bruit aléatoire.

Je prends la FFT, saisis les fréquences et l'intrigue. Les chiffres sont assez absurdes. Si je multiplie les fréquences par 33,34 (la fréquence d'échantillonnage), alors j'obtiens des pics à environ 8 Hz et 15 Hz, ce qui semble faux (aussi, les fréquences devraient être un facteur de 4 à part, pas 2!).

Des pensées sur ce que je fais mal ici?

32
nathan lachenmyer

Je pense que vous n'avez pas besoin de faire fftshift (), et vous pouvez passer la période d'échantillonnage à fftfreq ():

import scipy
import scipy.fftpack
import pylab
from scipy import pi
t = scipy.linspace(0,120,4000)
acc = lambda t: 10*scipy.sin(2*pi*2.0*t) + 5*scipy.sin(2*pi*8.0*t) + 2*scipy.random.random(len(t))

signal = acc(t)

FFT = abs(scipy.fft(signal))
freqs = scipy.fftpack.fftfreq(signal.size, t[1]-t[0])

pylab.subplot(211)
pylab.plot(t, signal)
pylab.subplot(212)
pylab.plot(freqs,20*scipy.log10(FFT),'x')
pylab.show()

à partir du graphique, vous pouvez voir qu'il y a deux pics à 2 Hz et 8 Hz.

enter image description here

48
HYRY

scipy.fftpack.fftfreq (n, d) vous donne directement les fréquences. Si vous définissez d=1/33.34, cela vous indiquera la fréquence en Hz pour chaque point du fft.

11
tom10

La largeur de fréquence de chaque bin est (sample_freq/num_bins).

Un problème plus fondamental est que votre taux d'échantillonnage n'est pas suffisant pour vos signaux d'intérêt. Votre fréquence d'échantillonnage est de 8,3 Hz; vous avez besoin d'au moins 16 Hz pour capturer une tonalité d'entrée de 8 Hz.1


1. À tous les experts DSP; Je suis conscient que c'est en fait BW qui est pertinent, pas la fréquence maximale. Mais je suppose que l'OP ne veut pas faire l'acquisition de données sous-échantillonnées.

6
Oliver Charlesworth