Autokorrelation in der Audioanalyse

11

Ich lese über Autokorrelation , bin mir aber nicht sicher, ob ich genau verstehe, wie es funktioniert und welche Ausgabe ich erwarten sollte. Habe ich Recht, wenn ich denke, dass ich mein Signal in die AC-Funktion eingeben und einen Schiebefendeingang haben sollte? Jedes Fenster (zum Beispiel von 1024 Stichproben) würde einen Koeffizienten zwischen -1 und 1 ausgeben. Das Vorzeichen gibt einfach an, ob die Linie nach oben oder unten verläuft, und der Wert gibt an, wie stark die Korrelation ist. Nehmen wir zur Vereinfachung an, ich habe keine Überlappung und verschiebe jedes Mal die Fenster-1024-Samples. Würde ich in einer Stichprobe von 44100 43 Koeffizienten erhalten und muss ich alle behalten?

Nehmen wir an, ich führe dies für ein 200-Sekunden-Signal durch und erhalte 8600 Koeffizienten. Wie würde ich diese Koeffizienten verwenden, um Wiederholungen und damit das Tempo zu erkennen? Sollte ich eine Art neuronales Netzwerk erstellen, um sie zu gruppieren, oder ist das übertrieben?

Vielen Dank für jede Hilfe.

XSL
quelle
4
Angenommen, Ihre Samples sind x [ 1 ] , x [ 2 ] , , x [ 1024 ] . Können Sie uns sagen, was Ihre AC-Funktion zurückgibt? Mögliche Antworten könnten sein: "Es gibt 1024 i = 1 ( x [ i ] ) 2 zurück " oder "Es gibt 1024 Zahlen R [ k ] zurück, wobei R [ k ] = 1024 - k1024x[1],x[2],,x[1024]]ich=11024(x[ich]])21024R.[k]]"oder" Es werden1024ZahlenR[k] zurückgegeben,wobeiR[k]= 1024 - k i = 1 x[i]x[i+k]+ k i = 1 x[1024-k+i]xR.[k]]=ich=11024- -kx[ich]]x[ich+k]]1024R.[k]] ". Alle drei vorgeschlagenen Antworten sind mit dem Begriff der Autokorrelation vereinbar.R.[k]]=ich=11024- -kx[ich]]x[ich+k]]+ich=1kx[1024- -k+ich]]x[ich]]
Dilip Sarwate
Hey Dilip, danke für die Hilfe. Ich habe die AC-Funktion noch nicht implementiert, ich versuche nur, mich zuerst mit der Theorie zu befassen. Die erste Gleichung scheint die einfachste zu sein, aber müssten die Daten vorher normalisiert werden?
XSL
1
Hier ist ein Beispiel: gist.github.com/255291#L62
Endolith

Antworten:

23

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:

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:

Breakbeat-Autokorrelation

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).

Datageist
quelle
2
Moment mal, ist das die Autokorrelation des Audiosignals selbst? Das ist sicherlich nicht sehr nützlich für die Tempoerkennung von etwas anderem als digitalen Loops. Die Autokorrelation einiger RMS-Hüllkurven sollte im Allgemeinen viel besser funktionieren, vorzugsweise für mehrere Frequenzbänder getrennt.
links um den
1
Autokorrelation der STFT in der Zeitrichtung funktioniert recht gut, solange die Musik hat eine gewisse Art von Beat. Dies ist im Wesentlichen dasselbe wie das Ausführen einer Autokorrelation vieler Frequenzbänder und das anschließende Summieren dieser.
Endolith
2
@leftroundabout Richtig, neben der Autokorrelation selbst gibt es eine Reihe von Dingen, die für die Tempoerkennung (vor, nach der Verarbeitung) erledigt werden müssten. Ich antworte hauptsächlich auf den ersten Satz der Frage des OP (dh "Wie funktioniert die Autokorrelation?") Und schlage dann vor, dass er eine weitere Frage zur Tempoerkennung stellt, da andere Prozesse beteiligt sein werden.
Datageist
@endolith was meinst du hier mit Autocorrelation of the STFT in the time direction? Speziell die Zeitrichtung Teil
popctrl
1
@popctrl Bedeutung, um die Autokorrelation jeder Zeile des STFT
Endolithen
3

Klingt so, als ob Sie die Autokorrelation verwenden möchten, um die Beat-Erkennung durchzuführen. Sie können dies tun, aber ich empfehle Ihnen, Ihr Audio massiv herunterzusampeln. Sie suchen nach einem Signal zwischen 1 und 3 Hz (60 bpm bis 180 bpm), sodass Sie keine Auflösung von 44100 Hz benötigen oder wollen. Eine richtig berechnete und normalisierte Autokorrelation beträgt 1,0 bei Verzögerung 0 (das Signal korreliert perfekt mit sich selbst). Für ein periodisches Signal fällt der Wechselstrom unter Null und steigt dann in einer Spitze mit der Verzögerung zurück, die der Grundfrequenz entspricht, mit kleineren Spitzen bei Harmonischen. Sie müssen einen angemessenen Bereich auswählen, in dem Sie nach diesem Peak suchen möchten. Bei Rauschen sinkt die Autokorrelation und im Grunde genommen flache Linien in Kringeln um Null. Als Faustregel gilt: Wenn Sie einen Peak> 0,5 im normalisierten Wechselstrom haben, haben Sie ein periodisches Signal.

Rechnung
quelle
1

Die Autokorrelation ist einfach die Kreuzkorrelation eines Signals mit sich selbst. Eine einfache Möglichkeit, dies zu berechnen, besteht darin, eine Faltung zwischen dem ursprünglichen Signal und einer zeitversetzten Version des Signals durchzuführen. Wenn Sie ein Signal haben, das 1000 Abtastwerte lang ist, hat seine Autokorrelation 1999 (2 * N-1) Abtastwerte ungleich Null. Nur 1000 dieser Abtastwerte sind eindeutig, da die Autokorrelation (für ein reales Signal) immer zeitlich symmetrisch ist, dh ac [n] = ac [-n].

Kontinuierliche Signale müssen in endliche Segmente zerlegt werden. Dies ähnelt der Fourier-Transformation: Technisch gesehen müssen Sie von -inf nach + inf integrieren, aber die Aufteilung in Segmente (mit Überlappung und / oder Fensterung nach Bedarf) liefert ebenfalls nützliche Ergebnisse. Die Wahl der Fensterlänge, -form und -überlappung hängt von der Anwendung ab.

Hilmar
quelle