2015-02-26 2 views
0

Je suis actuellement besoin de courir FFT sur 1024 points de signal d'échantillonnage. Jusqu'à présent, j'ai implémenté mon propre algorithme DFT en python, mais il est très lent. Si j'utilise le fftpack NUMPY, ou même passer en C++ et utiliser FFTW, pensez-vous que ce serait mieux?Numpy fft.pack vs FFTW vs mettre en œuvre DFT sur votre propre

+2

Oui. (Cette parenthèse est seulement ici pour avoir plus de 15 caractères dans ce commentaire.) –

+2

Oui ... Ce sera plus facile à maintenir (parce que ce n'est pas de votre responsabilité) et utiliser une implémentation plus optimisée (parce qu'elle a eu beaucoup plus de temps pour mûrir). Tant que vous avez besoin de la dépendance supplémentaire, alors il y a très peu de raisons de construire votre propre :-) – mgilson

+0

mais celui que vous recommandez, numpy ou fftw en python ou fftw en C++. –

Répondre

7

Si vous implémentez entièrement le DFFT dans Python, votre code exécutera ordres de grandeur plus lent que l'un ou l'autre des paquets que vous avez mentionnés. Non seulement parce que ces bibliothèques sont écrites dans des langages de niveau inférieur, mais aussi (FFTW en particulier) elles sont écrites de façon très optimisée, en profitant de la localisation du cache, des unités vectorielles et de toutes les astuces du livre. moi si elles ont couru à 10.000 fois la vitesse d'une mise en œuvre naïve de Python. Même si vous utilisez numpy dans votre implémentation, il sera encore pâle en comparaison.

Alors oui; utilisez fftpack de numpy. Si ce n'est pas assez rapide, vous pouvez essayer les liaisons python pour FFTW (PyFFTW), mais l'accélération de fftpack à fftw ne sera pas aussi spectaculaire. Je doute vraiment qu'il soit nécessaire de passer en C++ juste pour les FFT - c'est en quelque sorte le cas idéal pour les liaisons Python.

1

Si vous avez besoin de vitesse, alors vous voulez aller pour FFTW, consultez le projet pyfftw. Afin d'utiliser les instructions du processeur SIMD, vous devez aligner les données et il n'y a pas de moyen facile de le faire dans numpy. En outre, pyfftw vous permet d'utiliser le multithreading vrai, alors croyez-moi, ce sera beaucoup plus rapide.

+0

Savez-vous combien pyfftw est plus rapide que fftpack environ? – Trilarion

0

Si vous souhaitez conserver Python (la gestion et la maintenance de liaisons C++ personnalisées peuvent prendre du temps), vous avez la possibilité d'utiliser l'implémentation OpenCV's de FFT.

J'ai assemblé un exemple de jouet comparant les fonctions fft2 dft() et numpy de OpenCV dans python (processeur Intel (R) Core (TM) i7-3930K).

samplesFreq_cv2 = [ 
     cv2.dft(samples[iS]) 
     for iS in xrange(nbSamples)] 

samplesFreq_np = [ 
     np.fft.fft2(samples[iS]) 
     for iS in xrange(nbSamples)] 

Résultats pour séquentiellement transformer 20000 patches d'image des résolutions allant de 20x20 à 60x60:
de fft2 de Numpy: 1.709100 secondes
de DFT de OpenCV: 0.621239 secondes

Ceci est probablement pas aussi vite que la liaison à un dédie la bibliothèque C++ comme fftw, mais c'est un fruit plutôt simple.