Korelacja krzyżowa i splot są ze sobą ściśle powiązane. Krótko mówiąc, aby przeprowadzić splot z FFT, ty
- zeruj piki sygnałów wejściowych (dodaj zera na końcu, aby co najmniej połowa fali była „pusta”)
- weź FFT obu sygnałów
- pomnóż wyniki razem (mnożenie elementarne)
- wykonaj odwrotną FFT
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Musisz uzupełnić zero, ponieważ metoda FFT jest w rzeczywistości korelacją krzyżową kołową , co oznacza, że sygnał zawija się na końcach. Więc dodajesz wystarczającą liczbę zer, aby pozbyć się nakładania, aby zasymulować sygnał od zera do nieskończoności.
Aby uzyskać korelację krzyżową zamiast splotu, musisz albo odwrócić czas jednego z sygnałów przed wykonaniem FFT, albo wziąć złożoną koniugat jednego z sygnałów po FFT:
corr(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros[reversed]))
corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))
cokolwiek jest łatwiejsze ze sprzętem / oprogramowaniem. W przypadku autokorelacji (korelacji krzyżowej sygnału z samym sobą) lepiej jest wykonać koniugat złożony, ponieważ wtedy wystarczy obliczyć FFT tylko raz.
Jeśli sygnały są prawdziwe, możesz użyć prawdziwych FFT (RFFT / IRFFT) i zaoszczędzić połowę czasu obliczeniowego, obliczając tylko połowę widma.
Możesz także zaoszczędzić czas obliczeń, wypełniając do większego rozmiaru, dla którego FFT jest zoptymalizowany (takiego jak 5-gładka liczba dla FFTPACK, ~ 13-gładka liczba dla FFTW lub potęga 2 dla prostej implementacji sprzętowej).
Oto przykład w Pythonie korelacji FFT w porównaniu z korelacją siłową: https://stackoverflow.com/a/1768140/125507
To da ci funkcję korelacji krzyżowej, która jest miarą podobieństwa do przesunięcia. Aby uzyskać przesunięcie, w którym fale są „wyrównane” ze sobą, w funkcji korelacji wystąpi szczyt:
Wartość x piku jest przesunięciem, które może być ujemne lub dodatnie.
Widziałem to tylko w celu znalezienia przesunięcia między dwiema falami. Można uzyskać dokładniejsze oszacowanie przesunięcia (lepsze niż rozdzielczość próbek), stosując interpolację paraboliczną / kwadratową na szczycie.
Aby uzyskać wartość podobieństwa między -1 a 1 (wartość ujemna wskazująca, że jeden z sygnałów maleje wraz ze wzrostem drugiego), należy skalować amplitudę zgodnie z długością wejść, długością FFT, konkretną implementacją FFT skalowanie itp. Autokorelacja fali z samym sobą daje wartość maksymalnego możliwego dopasowania.
Pamiętaj, że będzie to działać tylko na falach o tym samym kształcie. Jeśli próbkowano je na innym sprzęcie lub dodano szumy, ale poza tym nadal mają ten sam kształt, to porównanie będzie działać, ale jeśli kształt fali został zmieniony przez filtrowanie lub przesunięcia fazowe, mogą brzmieć tak samo, ale wygrał też nie są skorelowane.