2013-02-22 16 views
8

Wiem, że ogólnie rzecz biorąc, FFT and multiplication jest zwykle szybszy niż operacja bezpośrednia convolve, gdy macierz jest stosunkowo duża. Jednak zawieram bardzo długi sygnał (powiedzmy 10 milionów punktów) z bardzo krótką odpowiedzią (powiedzmy 1 tysiąc punktów). W tym przypadku fftconvolve nie wydaje się mieć większego sensu, ponieważ zmusza FFT drugiej macierzy do tego samego rozmiaru pierwszej macierzy. Czy w tym przypadku jest to szybsze po prostu wykonać bezpośrednie convolve?Python SciPy convolve vs fftconvolve

+2

Czy istnieje powód, dla którego nie można po prostu zmierzyć obu podejść, np. Za pomocą 'timeit'? – Dougal

+1

Nie znałem tej funkcji. Spróbuję. Chciałbym jednak także poznać podstawową teorię. – LWZ

Odpowiedz

2

FFT szybkie splotowanie za pomocą algorytmów dodawania zakładek lub nakładania można wykonać w ograniczonej pamięci za pomocą FFT, która jest tylko małą wielokrotnością (np. 2X) większą niż odpowiedź impulsowa. Przerywa długi FFT w odpowiednio zachodzące na siebie krótsze, ale wyściełane FFT.

Nawet przy obciążeniu stropów, O (NlogN) pobije M * N wydajności dla wystarczająco dużej N i M.

+0

Dzięki za odpowiedź! Czy masz na myśli, że nawet z funkcją 'fftconvolve', automatycznie rozbija długą FFT na krótkie FFT i nie muszę się tym martwić? – LWZ

+0

@LWZ: scipy's fftconvolve tego nie robi, nie. hotpaw, czy masz referencję/implementację dla tej metody? – endolith

6

Spójrz na porównanie zrobiłem tutaj:

http://scipy-cookbook.readthedocs.io/items/ApplyFIRFilter.html

Twoja sprawa może znajdować się w pobliżu przejścia pomiędzy zwykłym splotem a użyciem splotu opartego na FFT, więc najlepszym wyjściem (zgodnie z sugestią @Dougala w komentarzu) jest samodzielne zrobienie tego.

(Zauważ, że nie pokrywają dodaj lub pokrywają zapisywanie w tym porównaniu.)

+0

link wydaje się nie wskazywać, co masz na myśli (mimo że I tak go znaleźć na stronie) – luca

+0

@luca Dzięki. Ta strona była oryginalnie na starej wiki scipy, której już nie ma. Zaktualizowałem link. –

3

dziękuję za pomoc. Teraz zrobiłem sprawdzić się, zrobiłem splot z 2 tablic, wielkość 2^20 a 2^4, a jest to wynik:

numpy.convolve: 110 ms 
scipy.signal.convolve: 1.0 s 
scipy.signal.fftconvolve: 2.5 s 

Więc mamy zwycięzcę, numpy convolve jest to znacznie szybciej niż inni. Wciąż nie wiem dlaczego.


Teraz wypróbowałem 2 dłuższe tablice o rozmiarze 2^22 i 2^10. Wynik:

numpy.convolve: 6.7 s 
scipy.signal.convolve: 221 s 
scipy.signal.fftconvolve: MemoryError 

Różnica staje się większa.