FFT pour une gamme de fréquences spécifique.

11

Je voudrais convertir un signal en domaine fréquentiel. La plage de fréquence souhaitée est 0.1 Hzde 1 Hzet la résolution de fréquence est 0.01 Hz.

Avec le taux d'échantillonnage de 30 Hz, FFT donne les composantes de fréquence jusqu'à 15 Hz. Augmenter la fréquence d'échantillonnage donne une meilleure résolution de fréquence. Cependant, la FFT offre une gamme de fréquences plus large. Dans mon cas, je veux juste 0.1 Hzà 1 Hz, FFT donne jusqu'à 15 Hz(calcul supplémentaire).

Ma question est, existe-t-il de toute façon un moyen standard de calculer un domaine de fréquence d'un signal avec une plage de fréquences spécifique et une haute résolution?

NcJie
la source
2
sonne comme si vous vouliez la Zoom FFT arc.id.au/ZoomFFT.html
endolith
Si vous faites juste un DFT standard avec un taux d'échantillonnage de 2 Hz et une durée de 100 s, vous obtiendrez une bande de fréquence de 0 à 1 Hz avec une résolution de 0,01 Hz. Seuls 10% de vos échantillons seront en dehors de la bande qui vous intéresse. Cela vaut-il vraiment la peine de travailler sur les détails d'un algorithme "pas si standard" pour améliorer l'efficacité de ce calcul relativement petit?
The Photon
La contrainte est que la durée doit être aussi courte que possible. 100s est trop long. Nous avons besoin d'environ 10+ s
NcJie

Réponses:

5

Je pense que la meilleure solution à votre problème est d'utiliser le chirp-DFT. C'est comme une loupe pour une certaine gamme de fréquences. Elle est plus efficace que l'implémentation directe de la DFT (sans FFT), car un algorithme FFT peut être utilisé avec certains pré et post-traitement appropriés. Vous devez essentiellement moduler votre signal avec un signal gazouillis, puis filtrer à l'aide d'une FFT, puis moduler à nouveau votre signal pour obtenir la réponse en fréquence souhaitée. Voir ici et ici pour plus de détails sur la façon d'implémenter le chirp-DFT.

Matt L.
la source
2

Il y a aussi la possibilité d'utiliser la déformation de fréquence (fonctionne également comme une loupe dans la mesure où vous obtenez une résolution améliorée dans votre gamme de fréquence d'intérêt pour la même taille FFT au détriment d'une résolution inférieure à des fréquences plus élevées). Cependant, vous n'enregistrez aucun MIPS car la taille FFT n'est pas réduite et la déformation de fréquence est loin d'être bon marché.

Si vous souhaitez uniquement calculer certains bacs dans la FFT (et ainsi enregistrer MIPS), il existe deux méthodes pour le faire. Par exemple le DFT coulissant. Les références dans cet article donnent une très belle explication http://www.comm.utoronto.ca/~dimitris/ece431/slidingdft.pdf . Je pense aussi que le goertzel algo fait quelque chose de similaire mais je ne le sais pas.

Il y a ensuite l'option de sous-échantillonnage avant FFT. Cela permettra également d'économiser des MIPS.

Edit: Juste pour clarifier le commentaire concernant l'algorithme de Goertzel qui n'est pas utile. En branchant directement les valeurs dans l'expression trouvée au bas de cette page wiki http://en.wikipedia.org/wiki/Goertzel_algorithm, l'approche Goertzel sera plus complexe qu'une FFT lorsque la taille de la FFT requise est supérieure à 128 (en supposant que la taille de la FFT est un facteur 2 et une implémentation radix-2).

Cependant, il y a d'autres facteurs à prendre en compte qui vont en faveur du Goertzel. Pour citer la page wiki: "Les implémentations FFT et les plates-formes de traitement ont un impact significatif sur les performances relatives. Certaines implémentations FFT [9] effectuent des calculs internes de nombres complexes pour générer des coefficients à la volée, augmentant considérablement leur" coût K par unité de travail. "Les algorithmes FFT et DFT peuvent utiliser des tableaux de valeurs de coefficient précalculées pour une meilleure efficacité numérique, mais cela nécessite plus d'accès aux valeurs de coefficient mises en mémoire tampon dans la mémoire externe, ce qui peut conduire à une contention de cache accrue qui compense certains des avantages numériques . "

"Les deux algorithmes gagnent environ un facteur d'efficacité de 2 lors de l'utilisation de données d'entrée à valeur réelle plutôt qu'à valeur complexe. Cependant, ces gains sont naturels pour l'algorithme de Goertzel mais ne seront pas atteints pour la FFT sans utiliser certaines variantes d'algorithmes spécialisées pour transformer le réel -données évaluées. "

niaren
la source
1
La DFT glissante est en fait utile dans le contexte de l'analyse du spectre en temps réel, où la séquence d'entrée est très longue et le spectre doit être recalculé à intervalles réguliers. L'algorithme de Goertzel est très efficace si seulement quelques valeurs DFT doivent être calculées. Cela ne serait pas utile pour résoudre le problème donné car le nombre souhaité de points de fréquence est trop grand.
Matt L.
Merci @MattL. pour avoir souligné la faiblesse de l'algorithme Goertzel.
NcJie
1

Δf=fsN
fsNN

Ns(t)fcfbx(n)s(t)x(n)=s(n/fs)

x~(n)=x(n)ej2πk0/N
k0=fc/fsfbfb+fcf~sfbx~(n)M=fs/fbN

s(t)M

Deve
la source