В настоящее время мне нужно запустить БПФ для сигнала с 1024 точками выборки. До сих пор я реализовал свой собственный алгоритм DFT в python, но он очень медленный. Если я буду использовать NUMPY fftpack или даже перейду на C++ и буду использовать FFTW, как вы думаете, это будет лучше?
Numpy fft.pack против FFTW против реализации DFT самостоятельно
Ответы (3)
Если вы реализуете DFFT полностью в Python, ваш код будет работать на на порядки медленнее, чем любой упомянутый вами пакет. Не только потому, что эти библиотеки написаны на языках гораздо более низкого уровня, но также (в частности, FFTW) они написаны настолько сильно оптимизированными, использующими преимущества локальности кеша, векторных единиц и практически всех трюков в книге, что это неудивительно. меня, если бы они работали в 10 000 раз быстрее наивной реализации Python. Даже если вы используете numpy в своей реализации, он все равно будет меркнуть по сравнению с ним.
Так да; используйте fftpack numpy. Если это недостаточно быстро, вы можете попробовать привязки python для FFTW (PyFFTW), но ускорение от fftpack до fftw не будет таким значительным. Я действительно сомневаюсь, что есть необходимость переходить на C++ только для БПФ - они являются своего рода идеальным случаем для привязок Python.
Если вам нужна скорость, то вы хотите перейти на FFTW, ознакомьтесь с pyfftw. проект. Чтобы использовать инструкции процессора SIMD
, вам необходимо выровнять данные, а в numpy
сделать это непросто. Более того, pyfftw
позволяет использовать настоящую многопоточность, так что поверьте мне, это будет намного быстрее.
Если вы хотите придерживаться Python (обработка и поддержка пользовательских привязок C++ может занять много времени), у вас есть альтернатива использованию OpenCV реализация БПФ.
Я собрал игрушечный пример, сравнивая функции OpenCV dft() и numpy fft2 в python (процессор 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)]
Результаты последовательного преобразования 20 000 фрагментов изображений с различным разрешением от 20 x 20 до 60 x 60:
fft2 Numpy: 1,709100 секунд
dft OpenCV: 0,621239 секунд.
Это, вероятно, не так быстро, как привязка к выделенной библиотеке C++, такой как fftw, но это довольно простой плод.