Korelasi-silang dan konvolusi terkait erat. Singkatnya, untuk melakukan konvolusi dengan FFT, Anda
- zero-pad sinyal input (tambahkan nol sampai akhir sehingga setidaknya setengah dari gelombang "kosong")
- ambil FFT dari kedua sinyal
- gandakan hasilnya bersama-sama (perkalian elemen-bijaksana)
- lakukan FFT terbalik
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Anda perlu melakukan zero-padding karena metode FFT sebenarnya adalah korelasi silang lingkaran , yang berarti sinyal membungkus ujung-ujungnya. Jadi, Anda menambahkan angka nol yang cukup untuk menghilangkan tumpang tindih, untuk mensimulasikan sinyal yang nol hingga tak terhingga.
Untuk mendapatkan korelasi silang alih - alih konvolusi, Anda perlu membalikkan salah satu sinyal sebelum melakukan FFT, atau mengambil konjugat kompleks dari salah satu sinyal setelah 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)))
mana yang lebih mudah dengan perangkat keras / lunak Anda. Untuk autokorelasi (korelasi silang dari sinyal dengan dirinya sendiri), lebih baik melakukan konjugasi kompleks, karena Anda hanya perlu menghitung FFT satu kali.
Jika sinyal nyata, Anda dapat menggunakan FFT nyata (RFFT / IRFFT) dan menghemat separuh waktu perhitungan Anda dengan hanya menghitung setengah dari spektrum.
Anda juga dapat menghemat waktu perhitungan dengan menambahkan ukuran FFT yang lebih besar untuk dioptimalkan (seperti angka 5-halus untuk FFTPACK, angka ~ 13-halus untuk FFTW , atau kekuatan 2 untuk implementasi perangkat keras yang sederhana).
Berikut ini adalah contoh dalam korelasi FFT Python dibandingkan dengan korelasi brute-force: https://stackoverflow.com/a/1768140/125507
Ini akan memberi Anda fungsi korelasi silang, yang merupakan ukuran kesamaan vs offset. Untuk mendapatkan offset di mana gelombang "berbaris" satu sama lain, akan ada puncak dalam fungsi korelasi:
Nilai x puncak adalah offset, yang bisa negatif atau positif.
Saya hanya melihat ini digunakan untuk menemukan offset antara dua gelombang. Anda bisa mendapatkan perkiraan offset yang lebih tepat (lebih baik daripada resolusi sampel Anda) dengan menggunakan interpolasi parabola / kuadrat pada puncaknya.
Untuk mendapatkan nilai kesamaan antara -1 dan 1 (nilai negatif yang menunjukkan salah satu sinyal berkurang dengan meningkatnya lainnya) Anda perlu skala amplitudo sesuai dengan panjang input, panjang FFT, implementasi FFT khusus Anda penskalaan, dll. Autokorelasi gelombang dengan dirinya sendiri akan memberi Anda nilai kecocokan maksimum yang mungkin.
Perhatikan bahwa ini hanya akan bekerja pada gelombang yang memiliki bentuk yang sama. Jika mereka telah disampel pada perangkat keras yang berbeda atau menambahkan beberapa noise, tetapi jika tidak, masih memiliki bentuk yang sama, perbandingan ini akan berfungsi, tetapi jika bentuk gelombang telah diubah oleh penyaringan atau pergeseran fasa, mereka mungkin terdengar sama, tetapi menang juga berkorelasi.