Per elaborare un po 'di più le risposte precedenti, calcolando l'auto-correlazione di un segnale di lunghezza ottiene un'auto-correlazione (campionata) di dimensione . Bene, in realtà, dovrebbe essere infinito, ma l'auto-correlazione al di fuori di equivale comunque a .N2N−1[−(N−1),N−1]0
Ora, desideri utilizzare la trasformata discreta di Fourier (DFT) per calcolarla, e la formula è davvero la DFT inversa della grandezza quadrata della DFT del tuo segnale. Ma pensaci: se lo facciamo al contrario e calcoliamo il DFT dell'autocorrelazione, ti ritroverai con uno spettro di dimensioni , se non vuoi perdere campioni in questo modo! Pertanto, tale spettro deve essere della dimensione , ed è per questo che è necessario azzerare il segnale del dominio del tempo fino a , calcolare il DFT (su punti ) e procedere con esso.2N−12N−12N−12N−1
Un altro modo di vedere questo è analizzare cosa succede se si calcola il DFT su punti: questo equivale a sottocampionare la trasformata di Fourier (DTFT) a tempo discreto (frequenza continua). Recuperare l'auto-correlazione, che dovrebbe essere di dimensione , con uno spettro sottocampionato di dimensione porta quindi all'aliasing temporale (di cui parlava la pichenette di circolarità), il che spiega perché hai questo modello simmetrico nella "destra lato "se l'output.N2N−1N
In realtà, funziona anche il codice fornito da Hilmar, perché fintanto che si esegue il pad zero fino a una dimensione superiore a (nel suo caso, calcola un FT di dimensione ), si "sovracampiona" il FT e ottieni comunque i tuoi campioni "utili" (gli altri dovrebbero essere s). Quindi, per efficienza, solo da zero pad a , questo è tutto ciò di cui hai bisogno (beh, forse sarebbe meglio zero-pad fino alla potenza successiva di 2 di , se usi gli FFT).N−1N2N−102 N - 12N−12N−1
In breve: avresti dovuto farlo (per adattarti al tuo linguaggio di programmazione):
autocorr = ifft( complex( abs(fft(inputData, n=2*N-1))**2, 0 ) )
O in MATLAB:
autocorr = ifft(abs(fft(inputData, 2*N-1)).^2)