Die Idee der Autokorrelation besteht darin, ein Maß für die Ähnlichkeit zwischen einem Signal und sich selbst bei einer bestimmten Verzögerung bereitzustellen. Es gibt verschiedene Möglichkeiten, sich dem anzunähern, aber zum Zwecke der Tonhöhen- / Tempoerkennung können Sie es sich als Suchverfahren vorstellen. Mit anderen Worten, Sie gehen das Signal Sample für Sample durch und führen eine Korrelation zwischen Ihrem Referenzfenster und dem verzögerten Fenster durch. Die Korrelation bei "Verzögerung 0" ist das globale Maximum, da Sie den Verweis mit einer wörtlichen Kopie von sich selbst vergleichen. Wenn Sie vorwärts gehen, nimmt die Korrelation notwendigerweise ab, aber im Fall eines periodischen Signals beginnt sie irgendwann wieder zuzunehmen und erreicht dann ein lokales Maximum. Der Abstand zwischen "Lag 0" und diesem ersten Peak gibt Ihnen eine Schätzung Ihrer Tonhöhe / Ihres Tempos. So wie ich '
Das Berechnen von Stichprobenkorrelationen kann bei hohen Abtastraten sehr rechenintensiv sein, daher wird typischerweise ein FFT-basierter Ansatz verwendet. Wenn Sie die FFT des interessierenden Segments nehmen, es mit seinem komplexen Konjugat multiplizieren und dann die inverse FFT nehmen, erhalten Sie die zyklische Autokorrelation . Im Code (mit numpy ):
freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))
Der Effekt besteht darin, das Rauschen im Signal (das nicht mit sich selbst korreliert ist) im Verhältnis zu den periodischen Komponenten (die sich per Definition ähnlich sind) zu verringern. Das Wiederholen der Autokorrelation (dh der konjugierten Multiplikation) vor der inversen Transformation reduziert das Rauschen noch mehr. Betrachten Sie das Beispiel einer Sinuswelle gemischt mit weißem Rauschen. Das folgende Diagramm zeigt eine 440-Hz-Sinuswelle, dieselbe durch Rauschen "verfälschte" Sinuswelle, die zyklische Autokorrelation der verrauschten Welle und die doppelte zyklische Autokorrelation:
Beachten Sie, wie sich die erste Spitze beider Autokorrelationssignale genau am Ende des ersten Zyklus des ursprünglichen Signals befindet. Dies ist der Peak, nach dem Sie suchen, um die Periodizität (in diesem Fall die Tonhöhe) zu bestimmen. Das erste Autokorrelationssignal ist immer noch ein wenig "wackelig", so dass für die Spitzenwerterfassung eine Art Glättung erforderlich wäre. Das zweimalige Autokorrelieren im Frequenzbereich bewirkt dasselbe (und ist relativ schnell). Beachten Sie, dass mit "wackelig" gemeint ist, wie das Signal beim Vergrößern aussieht, nicht das Eintauchen in der Mitte des Diagramms. Die zweite Hälfte der zyklischen Autokorrelation ist immer das Spiegelbild der ersten Hälfte, so dass diese Art von "Eintauchen" typisch ist. Um den Algorithmus klar zu machen, sieht der Code folgendermaßen aus:
freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)
Ob Sie mehr als eine Autokorrelation durchführen müssen, hängt davon ab, wie viel Rauschen im Signal vorhanden ist.
Natürlich gibt es viele subtile Variationen dieser Idee, und ich werde hier nicht auf alle eingehen. Die umfassendste Berichterstattung, die ich (im Zusammenhang mit der Tonhöhenerkennung) gesehen habe, ist die digitale Verarbeitung von Sprachsignalen von Rabiner und Schafer.
Nun, ob die Autokorrelation für die Tempoerkennung ausreicht. Die Antwort lautet ja und nein. Sie können einige Tempo-Informationen erhalten (abhängig vom Quellensignal), aber es kann in allen Fällen schwierig sein, zu verstehen, was dies bedeutet. Hier ist zum Beispiel eine Darstellung von zwei Schleifen eines Breakbeats, gefolgt von einer Darstellung der zyklischen Autokorrelation der gesamten Sequenz:
Als Referenz ist hier das entsprechende Audio:
Sicher genug, es gibt eine schöne Spitze genau in der Mitte, die dem Schleifenpunkt entspricht, aber sie stammt aus der Verarbeitung eines ziemlich langen Segments. Wenn es sich nicht um eine exakte Kopie handeln würde (z. B. wenn eine Instrumentierung vorhanden wäre), wäre dieser Spike nicht so sauber. Autokorrelation wird definitiv bei der Tempoerkennung nützlich sein, aber für komplexes Quellmaterial allein wird sie wahrscheinlich nicht ausreichen. Selbst wenn Sie beispielsweise eine Spitze finden, woher wissen Sie, ob es sich um einen vollen Takt oder eine Viertelnote, eine halbe Note oder etwas anderes handelt? In diesem Fall ist klar genug, dass es sich um eine vollständige Maßnahme handelt, aber das wird nicht immer der Fall sein. Ich würde vorschlagen, mit der Verwendung von Wechselstrom für einfachere Signale herumzuspielen, bis das Innenleben klar wird, und dann eine weitere Frage zur Tempoerkennung im Allgemeinen zu stellen (da es sich um eine "größere" handelt).