Numpy fft.pack срещу FFTW срещу Внедрете DFT сами

В момента трябва да пусна FFT на сигнал от 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++ само за FFT - те са нещо като идеалния случай за свързване на 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++ свързвания може да отнеме много време), имате алтернативата да използвате Реализация на FFT на OpenCV.

Събрах пример за играчка, сравняващ функциите dft() на OpenCV и fft2 на numpy в python (Intel(R) Core(TM) i7-3930K CPU).

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 изображения с различни разделителни способности от 20x20 до 60x60:
fft2 на Numpy: 1,709100 секунди
dft на OpenCV: 0,621239 секунди

Това вероятно не е толкова бързо, колкото свързването към специализирана C++ библиотека като fftw, но е доста нисък плод.

person spaceapple    schedule 23.08.2016