FFT zwoje są oparte na convolution theorem, który stanowi, że givem dwie funkcje f
i g
, jeśli Fd()
i Fi()
oznaczają bezpośrednie i odwrotnej transformaty Fouriera i *
i .
splot i mnożenia, a następnie:
f*g = Fi(Fd(d).Fd(g))
Aby zastosować to do sygnału f
i jądra g
, istnieje kilka rzeczy, którymi należy się zająć:
f
i g
muszą być tego samego rozmiaru, aby krok mnożenia był możliwy, więc konieczne jest zerowanie jądra.
- Podczas wykonywania DFT, co jest tym, co robi FFT, wynikowa reprezentacja domeny częstotliwości jest okresowa. Oznacza to, że domyślnie jądro owija się wokół krawędzi podczas wykonywania splotu. Jeśli tego chcesz, to wszystko jest świetne. Ale jeśli nie, musisz dodać dodatkowe zerowanie rozmiaru jądra, aby tego uniknąć.
- Większość (wszystkich?) Pakietów FFT działa tylko dobrze (z punktu widzenia wydajności) w rozmiarach, które nie mają dużych czynników pierwszeństwa. Zaokrąglanie sygnału i rozmiaru jądra do następnej potęgi dwóch jest powszechną praktyką, która może spowodować (bardzo) znaczne przyspieszenie.
Jeśli sygnał i jądra rozmiary są f_l
i g_l
, robiąc prosty splot w dziedzinie czasu wymaga g_l * (f_l - g_l + 1)
mnożenia i (g_l - 1) * (f_l - g_l + 1)
uzupełnień.
W przypadku podejścia FFT należy wykonać 3 transformaty FFT o rozmiarze co najmniej f_l + g_l
, a także zmultiplikacje f_l + g_l
.
Dla dużych rozmiarów zarówno f
, jak i g
, FFT jest wyraźnie lepszy ze złożonością n*log(n)
. W przypadku małych jąder bezpośrednie podejście może być szybsze.
scipy.signal
ma zarówno metody, które można odtwarzać w trybie convolve
i . I fftconvolve
obsługuje wszystkie wyściółki opisane powyżej dla Ciebie.
Należy zauważyć, że splot w dziedzinie częstotliwości jest bardziej skuteczny, gdy jądro przekroczy pewien rozmiar. W przypadku stosunkowo małych ziaren bezpośrednie splatanie jest bardziej wydajne. –