Otokorelasyon fikri, belirli bir gecikmede bir sinyal ile kendisi arasındaki benzerlik ölçüsünü sağlamaktır. Yaklaşmanın birkaç yolu vardır, ancak perde / tempo algılaması amacıyla, bunu bir arama prosedürü olarak düşünebilirsiniz. Başka bir deyişle, örnek örnek sinyalinde ilerlersiniz ve referans pencereniz ile gecikmeli pencere arasında bir korelasyon gerçekleştirirsiniz. "Lag 0" daki korelasyon global maksimum olacaktır, çünkü referansı kendisinin birebir kopyasıyla karşılaştırıyorsunuz. İlerledikçe, korelasyon mutlaka azalır, ancak periyodik bir sinyal durumunda, bir noktada tekrar artmaya başlar, ardından yerel bir maksimuma ulaşır. "Gecikme 0" ile ilk zirve arasındaki mesafe, adım / temponuz hakkında bir tahmin verir. Benim yolum
Numune-örnek korelasyonlarının hesaplanması, yüksek numune oranlarında çok hesaplamalı olarak pahalı olabilir, bu nedenle tipik olarak FFT tabanlı bir yaklaşım kullanılır. İlgili segmentin FFT'sini almak, karmaşık konjugatı ile çarpmak , sonra ters FFT'yi almak size döngüsel otokorelasyon verecektir . Kodda ( numpy kullanarak ):
freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))
Etki, sinyaldeki (kendisiyle ilintisiz) gürültü miktarını periyodik bileşenlere (tanım gereği kendilerine benzer) göre azaltmak olacaktır. Ters dönüşümü almadan önce otokorelasyonun (yani eşlenik çarpma) tekrarlanması gürültüyü daha da azaltacaktır. Beyaz gürültüyle karıştırılmış bir sinüs dalgası örneğini düşünün. Aşağıdaki grafik 440hz sinüs dalgasını, aynı sinüs dalgasının gürültü ile "bozulduğunu", gürültülü dalganın döngüsel otokorelasyonunu ve çift döngüsel otokorelasyonunu göstermektedir:
Her iki otokorelasyon sinyalinin ilk zirvesinin tam olarak orijinal sinyalin ilk çevriminin sonunda bulunduğuna dikkat edin. Periyodikliği belirlemek için aradığınız zirve budur (bu durumda adım). İlk otokorelasyon sinyali hala biraz "wiggly" dir, bu nedenle pik tespiti yapmak için bir tür düzleştirme gerekecektir. Frekans alanında iki kez otokorelasyon aynı şeyi başarır (ve nispeten hızlıdır). "Kıpır kıpır" ile sinyalin yakınlaştırıldığında nasıl göründüğünü kastediyorum, arsa merkezinde meydana gelen eğimi değil. Döngüsel otokorelasyonun ikinci yarısı her zaman ilk yarının ayna görüntüsü olacaktır, böylece bu tür bir "daldırma" tipiktir. Sadece algoritma hakkında net olmak için, kodun nasıl görüneceği aşağıda açıklanmıştır:
freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)
Birden fazla otokorelasyon yapmanız gerekip gerekmediği, sinyalde ne kadar gürültü olduğuna bağlıdır.
Tabii ki, bu fikir üzerinde birçok ince varyasyon var ve bunların hepsine burada girmeyeceğim. Gördüğüm en kapsamlı kapsam (perde algılama bağlamında) Rabiner ve Schafer tarafından yapılan Konuşma Sinyallerinin Dijital İşlenmesi .
Şimdi, otokorelasyonun tempo algılaması için yeterli olup olmayacağı. Cevap evet ve hayır. Bazı tempo bilgilerini (kaynak sinyaline bağlı olarak) alabilirsiniz, ancak her durumda bunun ne anlama geldiğini anlamak zor olabilir. Örneğin, burada bir breakbeat'ın iki döngüsünün bir grafiği ve ardından tüm dizinin döngüsel otokorelasyonunun bir grafiği:
Referans için, ilgili ses şöyledir:
Elbette, ortada döngü noktasına karşılık gelen güzel bir artış var, ancak oldukça uzun bir segmentin işlenmesinden geldi. Bunun da ötesinde, eğer tam bir kopya olmasaydı (örneğin onunla enstrümantasyon varsa), bu artış o kadar temiz olmazdı. Otokorelasyon, tempo algılamasında kesinlikle yararlı olacaktır, ancak muhtemelen karmaşık kaynak malzemeler için kendi başına yeterli olmayacaktır. Örneğin, bir artış bulsanız bile, bunun tam bir ölçü mü, çeyrek nota mı, yarım nota mı yoksa başka bir şey olduğunu nasıl anlarsınız? Bu durumda, bunun tam bir önlem olduğu yeterince açıktır, ancak bu her zaman böyle olmayacaktır. İç çalışmalar netleşene kadar daha basit sinyallerde AC ile oynamayı, sonra genel olarak tempo algılama hakkında başka bir soru sormayı öneririm (çünkü "daha büyük"