Aby rozwinąć nieco więcej na temat poprzednich odpowiedzi, obliczenie autokorelacji sygnału o długości skutkuje (próbkowaną) autokorelacją wielkości . Właściwie powinno być nieskończone, ale autokorelacja poza tak wynosi .N2N−10[−(N−1),N−1]0
Teraz chcesz użyć dyskretnej transformaty Fouriera (DFT) do jej obliczenia, a formuła jest w rzeczywistości odwrotnym DFT kwadratowej wielkości DFT twojego sygnału. Ale pomyśl o tym: jeśli weźmiemy to na odwrót i obliczymy DFT autokorelacji, uzyskasz spektrum wielkości , jeśli nie chcesz stracić próbek! Widmo to musi więc mieć rozmiar i dlatego musisz zerować swój sygnał w dziedzinie czasu do , obliczyć DFT (w punktach ) i kontynuować.2 N - 1 2 N - 1 2 N - 12N−12N−12N−12N−1
Innym sposobem na to jest analiza tego, co się stanie, jeśli obliczymy DFT w punktach : jest to równoważne z próbkowaniem w dół twojego dyskretnego czasu (ciągłej częstotliwości) transformaty Fouriera (DTFT). Odzyskanie autokorelacji, która powinna być wielkości , z niedopróbkowanym spektrum wielkości prowadzi zatem do aliasingu w czasie (o których mówiono o fenenetach o okrągłości), co wyjaśnia, dlaczego masz ten symetryczny wzór po prawej stronie hand side ”, jeśli Twój wynik.2 N - 1 N.N2N−1N
W rzeczywistości kod podany przez Hilmara również działa, ponieważ tak długo, jak zero-pad do rozmiaru większego niż (w jego przypadku oblicza FT o rozmiarze ), „przesada” próbkę FT , i nadal otrzymujesz „przydatne” próbki (pozostałe powinny wynosić s). Tak więc, dla wydajności, od zera do , to wszystko, czego potrzebujesz (cóż, być może lepiej jest zerować do następnej potęgi 2 z , jeśli używasz FFT).N 2 N - 1 0 2 N - 1 2 N - 1N−1N2N−102N−12N−1
W skrócie: powinieneś to zrobić (aby dostosować się do swojego języka programowania):
autocorr = ifft( complex( abs(fft(inputData, n=2*N-1))**2, 0 ) )
Lub w MATLAB:
autocorr = ifft(abs(fft(inputData, 2*N-1)).^2)