Je voudrais convertir un signal en domaine fréquentiel. La plage de fréquence souhaitée est 0.1 Hz
de 1 Hz
et 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?
Réponses:
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.
la source
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. "
la source
la source