Numpy fft.pack против FFTW против реализации DFT самостоятельно

В настоящее время мне нужно запустить БПФ для сигнала с 1024 точками выборки. До сих пор я реализовал свой собственный алгоритм DFT в python, но он очень медленный. Если я буду использовать NUMPY fftpack или даже перейду на C++ и буду использовать FFTW, как вы думаете, это будет лучше?


person andy_ttse    schedule 26.02.2015    source источник
comment
Да. (Это утверждение в скобках здесь только для того, чтобы иметь более 15 символов в этом комментарии.)   -  person Warren Weckesser    schedule 26.02.2015
comment
Да... Его будет легче поддерживать (потому что это не ваша ответственность) и использовать более оптимизированную реализацию (потому что она созрела гораздо дольше). Пока вы согласны с требованием дополнительной зависимости, очень мало причин создавать свою собственную :-)   -  person mgilson    schedule 26.02.2015
comment
но какой из них вы рекомендуете, numpy или fftw в python или fftw в c++.   -  person andy_ttse    schedule 26.02.2015
comment
Начните с numpy, чтобы вам не пришлось ничего реализовывать с нуля. Посмотрите, соответствует ли он вашим потребностям.   -  person Warren Weckesser    schedule 26.02.2015


Ответы (3)


Если вы реализуете DFFT полностью в Python, ваш код будет работать на на порядки медленнее, чем любой упомянутый вами пакет. Не только потому, что эти библиотеки написаны на языках гораздо более низкого уровня, но также (в частности, FFTW) они написаны настолько сильно оптимизированными, использующими преимущества локальности кеша, векторных единиц и практически всех трюков в книге, что это неудивительно. меня, если бы они работали в 10 000 раз быстрее наивной реализации Python. Даже если вы используете numpy в своей реализации, он все равно будет меркнуть по сравнению с ним.

Так да; используйте fftpack numpy. Если это недостаточно быстро, вы можете попробовать привязки python для FFTW (PyFFTW), но ускорение от fftpack до fftw не будет таким значительным. Я действительно сомневаюсь, что есть необходимость переходить на C++ только для БПФ - они являются своего рода идеальным случаем для привязок Python.

person Gretchen    schedule 26.02.2015

Если вам нужна скорость, то вы хотите перейти на FFTW, ознакомьтесь с pyfftw. проект. Чтобы использовать инструкции процессора SIMD, вам необходимо выровнять данные, а в numpy сделать это непросто. Более того, pyfftw позволяет использовать настоящую многопоточность, так что поверьте мне, это будет намного быстрее.

person bubla    schedule 26.02.2015
comment
Знаете ли вы, насколько pyfftw примерно быстрее, чем fftpack? - person Trilarion; 31.08.2015

Если вы хотите придерживаться 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, но это довольно простой плод.

person spaceapple    schedule 23.08.2016