Comment calculer efficacement uniquement les faibles coefficients d'une FFT à remplissage nul

14

J'ai un algorithme qui met à zéro une séquence sur 4N, fait une FFT et n'utilise que la fréquence la plus basse N points sur le 4N généré.

Cela semble être beaucoup de travail gaspillé, des idées sur la façon dont cela peut être fait plus rapidement?

Mark Borgerding
la source
@Dilip. J'utiliserai les bibliothèques FFTW ou IMKL. Je pourrais bien sûr utiliser ma bibliothèque kissfft, mais cela commence à un inconvénient de vitesse par rapport aux autres
Mark Borgerding
2
J'ai supprimé le commentaire auquel vous avez répondu, car je voulais dire décimation en fréquence, mais j'ai écrit décimation en temps à la place. Mais regardez le diagramme papillon ici. Si vous écrivez du code pour les deux premières étapes pour les -FFT pour prendre en compte le grand nombre de zéros et sauter les multiplications correspondantes, vous pouvez alors appeler 4 fois le sous-programme de la bibliothèque FFT pour les N -FFT dans lesquels les vecteurs d'entrée sont pleins". Bien sûr, vous n'avez besoin que de N / 4 des sorties de chaque appel de sous-programme. 4N4NN/4
Dilip Sarwate

Réponses:

2

Si vous n'avez que quelques bacs, les éléments suivants peuvent être très efficaces pour vous:
1. Faites simplement la DFT à chaque fréquence dont vous avez besoin.
2. Utilisez l'algorithme Goertzel pour chaque fréquence en question.

Jacob
la source
Mark a dit qu'il avait besoin de bacs sur 4 N , donc 1) ne semble pas être une option raisonnable. L'algorithme de Goertzel présente des avantages tels que le calcul en ligne lors de la réception des données, un petit stockage, etc., mais nécessite 2 N + 4 multiplications par bin, tandis que chaque bin calculé comme une évaluation polynomiale via la règle de Horner n'a besoin que de N multiplications. Ainsi, 2) ne semble pas non plus être une option particulièrement raisonnable. N4N2N+4N
Dilip Sarwate
Vous avez raison, en lisant la question, j'ai en quelque sorte manqué les détails. Pendant que je répondais, je me disais: "Gee, ce serait bien de savoir combien de bacs il veut ..." Je suppose que je devrais relire la question avant de répondre.
Jacob
2

Le remplissage nul à la longueur 4X, calculant la FFT la plus longue, puis utilisant uniquement les 1/4 / bins inférieurs produit des résultats presque identiques à l'interpolation Sinc fenêtrée de la FFT de longueur d'origine.

Il suffit donc d'utiliser la longueur FFT d'origine et d'interpoler en utilisant un noyau d'interpolation Sinc triphasé avec une largeur de fenêtre appropriée.

hotpaw2
la source
0

Le remplissage nul dans le domaine temporel vous donne une solution de fréquence plus élevée mais pas de nouvelles informations, il fournit donc essentiellement une interpolation dans le domaine de fréquence. Selon la nature de vos signaux et la précision requise, vous pourrez obtenir les points de fréquence supplémentaires avec une FFT régulière de N points et effectuer une interpolation appropriée (linéaire, spline, pchip, sinc, etc.).

Hilmar
la source
x(z)=i=0N1xizixiN1Nαn,0nN1α=exp(j2π/N)NNXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N), which are N points on the first quadrant of the unit circle. I don't see how linear, spline etc interpolation is going to work. Please explain.
Dilip Sarwate
Sorry, that penultimate sentence in my previous comment should have said fourth quadrant of the unit circle. Since β4=α, every fourth desired value x(β4k) has already been computed by the FFT: x(β4k)=x(αk).
Dilip Sarwate
I suspect it would be difficult to do a decent interpolation faster than doing the larger FFT.
Mark Borgerding
Let's say you have a 128 point FFT and 12800Hz sample rate. A 128 point FFTs gives values at 0Hz, 100Hz, 200 Hz, 300Hz, etc. What the zero padding does is to increase the frequency resolution to 0 Hz, 25Hz,50 Hz, 100Hz etc. This can be viewed as an interpolation problem. To me mathematically precised you need to do circular sinc intperpolation of 128th order. That certainly isn't worth the bother but depending on application and precision required a much lower order interpolation would be good enough
Hilmar