Çapraz korelasyon ve evrişim yakından ilişkilidir. Kısacası, FFT’lerle evrişim yapmak için
- giriş sinyallerini sıfırlayın (dalganın en az yarısı "boş" olacak şekilde sonuna sıfır ekleyin)
- her iki sinyalin FFT'sini alın
- sonuçları bir araya getirin (element-bilge çarpma)
- ters FFT yapmak
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Sıfırlama işlemini yapmanız gerekir, çünkü FFT metodu aslında dairesel çapraz korelasyondur, yani sinyal uçlarda sarılır. Öyleyse, üst üste binmekten kurtulmak, sonsuza kadar sıfır bir sinyali simüle etmek için yeterince sıfır eklersiniz.
Evrişim yerine çapraz korelasyon elde etmek için , ya FFT yapmadan önce sinyallerden birini zamana tersine çevirmeniz ya da FFT'den sonra sinyallerden birinin karmaşık konjugatını almanız gerekir:
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)))
hangisi donanım / yazılımınızla daha kolaydır? Otokorelasyon için (bir sinyalin kendisiyle çapraz korelasyonu), karmaşık konjugatı yapmak daha iyidir, çünkü o zaman sadece bir kez FFT'yi hesaplamanız gerekir.
Sinyaller gerçekse, gerçek FFT'leri (RFFT / IRFFT) kullanabilir ve hesaplama zamanınızın yarısından fazlasını yalnızca spektrumun yarısını hesaplayarak kazanabilirsiniz.
Ayrıca , FFT'nin optimize ettiği daha büyük bir boyuta dolgulu olarak hesaplama süresinden tasarruf edebilirsiniz ( FFTPACK için 5 pürüzsüz bir sayı , FFTW için ~ pürüzsüz bir sayı veya basit bir donanım uygulaması için 2 gücü gibi).
İşte kaba kuvvet korelasyonuna kıyasla Python of FFT korelasyonuna bir örnek: https://stackoverflow.com/a/1768140/125507
Bu size ofset ve benzerlik ölçüsü olan çapraz korelasyon fonksiyonunu verecektir. Dalgaların birbirleriyle "sıralandığı" dengeyi sağlamak için, korelasyon fonksiyonunda bir tepe noktası olacaktır:
Zirvenin x değeri, negatif veya pozitif olabilen uzaklıktır.
Bunu yalnızca iki dalga arasındaki dengeyi bulmak için kullandım. Zirvede parabolik / kuadratik enterpolasyon kullanarak ofsetin daha kesin bir tahminini (örneklerin çözünürlüğünden daha iyi) alabilirsiniz .
-1 ile 1 arasında bir benzerlik değeri elde etmek için (sinyallerden birini diğerinin arttıkça azaldığını gösteren negatif bir değer), girişlerin uzunluğuna, FFT'nin uzunluğuna, özel FFT uygulamanıza göre genliği ölçeklendirmeniz gerekir. ölçekleme, vb. Bir dalganın kendisiyle özdeşleşmesi size mümkün olan maksimum eşleşmenin değerini verecektir.
Bunun sadece aynı şekle sahip dalgalar üzerinde çalışacağını unutmayın. Farklı bir donanımda örneklenmişlerse veya biraz gürültü eklenmişlerse, ancak yine de aynı şekle sahiplerse, bu karşılaştırma işe yarayacaktır, ancak dalga şekli filtreleme veya faz kaymalarıyla değiştirilmişse, aynı şekilde ses çıkarabilir ancak kazanabilir aynı zamanda korelasyon yok.