Finden Sie ähnliche Musik mit FFT-Spektren

16

Ich habe einige Wochen lang experimentiert, um einen Weg zu finden, ähnliche Songs in einer Bibliothek mit verschiedenen Musikrichtungen zu finden.

Mein erster Versuch war, Features wie Tempo oder wie viel Bass in Songs vorhanden sind, um Gruppen zu bilden, aber ich bin mit diesem Ansatz (Volume Changes Based Beat Detection) nicht weit gekommen, da ungefähr 20% der Songs Beat nicht gezählt werden müssen immer, manchmal 1/2 oder 1/3 von ihnen und ich konnte das nicht umsetzen.

Nach einigen Wochen fehlgeschlagenen Versuchs kam mir eine neue Idee, die später in diesem Beitrag beschrieben wird. Einfach ausgedrückt funktioniert es, indem Sie Spectrum Samples of Files nehmen und so etwas wie ein "Average Spectrum" von Files erstellen, um sie zu vergleichen. Die Idee dahinter war, dass Hardstyle zum Beispiel viel mehr Bass als durchschnittliche Rockmusik hat.

  • Datei 1: Alle FFT-Spektren der Datei aufnehmen (2048 Sample Size atm, Amplituden-Log. Skaliert)
  • Summiere alle Spektrum-Arrays und nimm Durchschnittswerte von jedem Bin
  • Machen Sie dasselbe mit einigen anderen Dateien und speichern Sie alle Ergebnisse
  • Liste der FFT-Wertunterschiede zwischen Datei 1 und anderen Dateien erstellen
  • Ermitteln Sie den Durchschnitt der Unterschiede zwischen Datei 1 und Datei X.
  • Nach diesen Durchschnittswerten aufsteigend sortieren
  • Songs mit dem niedrigsten "Differenzwert" gelten als ähnlich.

Können mir einige von Ihnen, die über gute Kenntnisse verfügen, sagen, ob dies der richtige / gute Weg wäre, meine Idee umzusetzen?

gfg
quelle
1
Wenn Sie versuchen, das Tempo zu ermitteln, können Sie versuchen, das Signal zu quadrieren und dann eine Fourier-Transformation durchzuführen. Frequenzen in der Größenordnung von 1 Hz sind in einem normalen (nicht quadratischen) FFT-Spektrum nicht vorhanden, da sie herausgefiltert werden. Eine verwandte Idee, die zur Tonhöhenerkennung verwendet wird, heißt "Cepstrum". Sie können es herausfinden, indem Sie googeln. Um Pop und Jazz von Klassik zu unterscheiden, können Sie versuchen, die Klänge eines Drum-Kits zu erkennen, die nicht gestimmt sind. Vibrato sollte maschinenlesbar sein. Es gibt Dissonanzmaße, die maschinell berechnet werden können.
1
Vielleicht solltest du die Moderatoren bitten, dies auf dsp.SE
Dilip Sarwate
Ich habe meine Frage mit der Bitte, sie in DSP of SE zu verschieben, gekennzeichnet. Sie meinen, ich könnte feststellen, ob ein Drumkit vorhanden ist oder nicht, um den Eingang zu klassifizieren? Können Sie erklären, wie das quadrierte Signal zum Tempo führt?
3
Musik wird auf solche Weise aufgenommen und gemastert, um ihre spektrale Verbreitung zu maximieren, insbesondere heutzutage. Ich glaube nicht, dass Spektren in voller Länge ein gutes Kriterium für die Klassifizierung von Musik darstellen.
Phonon
2
Anstelle von Spektren sollten Sie sich Spektrogramme ansehen. In den Spektren wird nur der Frequenzinhalt des gesamten Songs auf einmal angezeigt. Spektrogramme zeigen, wie sich der Frequenzgehalt mit der Zeit ändert.
Endolith

Antworten:

17

Was Sie versuchen, wurde immer wieder von Hunderten von Forschern ausprobiert, und es gibt eine ziemlich große Menge an Arbeiten dazu. Überprüfen Sie die Protokolle der ISMIR-Konferenz. Auch wenn es nicht auf dem neuesten Stand ist, lesen Sie die These von Elias Pampalk: http://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

Um Sie schnell auf dem richtigen Weg zu orientieren:

Musik kann in vielen Dimensionen ähnlich sein: a) Timbre / Textur / Genre; b) rhythmisches Muster; c) Melodie / Akkordfolge ... und mehr! Aus Ihrer Nachricht geht nicht hervor, was Sie messen möchten!

  • Wenn Sie an a) den Funktionen interessiert sind, die Sie sich ansehen möchten, sind MFCC (Mel Frequency Cepstrum Coefficients), da sie die Funktionsweise des menschlichen Gehörs irgendwie erfassen (Frequenzverzerrung, logarithmische Skalierung), da sie dekorreliert sind (was das Modellieren erleichtert). und da sie eine geringere Dimensionalität haben (13 Koeffizienten gegenüber 2048).
  • Wenn Sie sich für b) interessieren, schauen Sie sich ein Feature namens "Fluctuation Patterns" an (Pampalk, eine kurze Autokorrelation des Signals im Bereich von 0,1 bis 10 Hz über einige Bänder). oder Whitmans "Penny" -Funktionen (FFT des MFCC entlang der Zeitachse).
  • Wenn Sie sich für c) interessieren, schauen Sie sich die Chromagramme an. Beginnen Sie mit Ellis 'Chromagrammcode (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/) und fahren Sie mit Mauchs Implementierung fort, wenn Sie etwas Robusteres benötigen (http://isophonics.net/nnls-chroma) ).

Das ist für die Funktionen. Jetzt müssen Sie sich einen besseren Weg ausdenken, um Ihre Songs zu vergleichen, sobald sie als Folge dieser Funktionen dargestellt wurden. Das Berechnen paarweiser Unterschiede zwischen Sequenzen ist nicht sehr intelligent - z. B. ergibt der Vergleich eines Songs mit demselben Song, der durch eine gewisse Stille versetzt ist, einen Unterschied, obwohl er genau gleich ist! Sie möchten lieber die Verteilung dieser Funktionen vergleichen. Berechnen Sie zum Beispiel den Mittelwert / die Standardabweichung der Merkmale über Lied A und den Mittelwert / die Standardabweichung der Merkmale über Lied B und nehmen Sie dann einen probabilistischen Abstand (KL, Bhattacharyya über diesen).

Letzter Punkt, der jedoch später von Bedeutung sein wird: Die Berechnung der Entfernung zwischen einem Lied und dem Rest des Korpus, um die nächsten Übereinstimmungen zu finden, ist recht ineffizient. Beim Umgang mit großen Sammlungen ermöglichen Techniken wie LSH oder Ball Trees, dass solche Abfragen des nächsten Nachbarn ohne expliziten Vergleich mit dem gesamten Korpus durchgeführt werden können.

Abgesehen davon ist die Tempoerkennung eine ganz andere Sache. Wenn Sie sich das ansehen möchten, ist Ellis 'Beat Tracking by Dynamic Programming das beste Papier zu Leistung und Barrierefreiheit. http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf . Es ist unglaublich einfach, kommt aber den neuesten Algorithmen sehr nahe.

Pichenetten
quelle
Vielen Dank für Ihre ausführliche Antwort. Ich habe in diesem Zusammenhang bereits mehrfach von MFCC gehört, und es erscheint vernünftig, keine bloßen FFT-Ergebnisse zu verwenden. Die Implementierung mit meinem aktuellen "Wissensstand" und meiner Entwicklungsumgebung (C #, FFT-Ergebnisse der Bass Library) erscheint recht komplex, aber ich werde es versuchen.
GFG