Untuk menguraikan sedikit lebih banyak pada jawaban sebelumnya, menghitung korelasi-otomatis dari sinyal panjang menghasilkan korelasi-otomatis (sampel) ukuran . Sebenarnya, seharusnya tidak terbatas, tetapi korelasi otomatis di luar sama dengan .N[ - ( N - 1 ) , N - 1 ] 02N−1[−(N−1),N−1]0
Sekarang, Anda ingin menggunakan transformasi Fourier diskrit (DFT) untuk menghitungnya, dan rumusnya memang DFT terbalik dari besarnya kuadrat dari DFT sinyal Anda. Tetapi pikirkanlah: jika kita mengambil sebaliknya dan menghitung DFT dari korelasi-otomatis, Anda berakhir dengan spektrum ukuran , jika Anda tidak ingin kehilangan sampel di jalan! Spektrum itu harus berukuran , dan itulah alasan mengapa Anda perlu memberi sinyal nol pada domain waktu Anda hingga , menghitung DFT (pada poin ), dan melanjutkannya.2 N - 1 2 N - 1 2 N - 12N−12N−12N−12N−1
Cara lain untuk melihat ini adalah dengan menganalisis apa yang terjadi jika Anda menghitung DFT pada titik : ini setara dengan downsampling (frekuensi kontinu) waktu diskrit Anda Fourier transform (DTFT). Mengambil korelasi-otomatis, yang seharusnya dari ukuran , dengan spektrum yang kurang-sampel dari ukuran karena itu mengarah ke waktu aliasing (pichenettes sirkularitas bicarakan), yang menjelaskan mengapa Anda memiliki pola simetris ini di "kanan sisi "jika output Anda.2 N - 1 NN2N−1N
Sebenarnya, kode yang disediakan oleh Hilmar juga berfungsi, karena selama Anda nol-pad hingga lebih dari ukuran (dalam kasusnya, ia menghitung FT ukuran ), Anda "mengambil-sampel" FT Anda , dan Anda masih mendapatkan sampel "bermanfaat" (yang lainnya harus s). Jadi, untuk efisiensi, hanya nol-pad ke , itu yang Anda butuhkan (well, mungkin Anda lebih baik zero-pad hingga kekuatan 2 dari , jika Anda menggunakan FFT).N 2 N - 1 0 2 N - 1 2 N - 1N−1N2N−102N−12N−1
Singkatnya: Anda harus melakukan ini (disesuaikan dengan bahasa pemrograman Anda):
autocorr = ifft( complex( abs(fft(inputData, n=2*N-1))**2, 0 ) )
Atau di MATLAB:
autocorr = ifft(abs(fft(inputData, 2*N-1)).^2)