Audioanalyse- Rhytmus eines Musikstückes erkennen.

  • Hallo, ich bin neu hier in diesen Forum. Diese wurde mir von einen Bekannten empfohlen. Ich versuche sozusagen den Rhythmus von einen Musikstück zu finden. Dabei liegt der Fokus auf klassische Musik. Die Stimmen im Musikstück, würden das Analysieren erschweren.
    Meine Überlegungen
    : Wenn man sich jetzt ein Spektrum anschaut – zum Beispiel; man schlägt mehrmals auf ein Schlagzeug, dann bekommt man einen Rhythmus raus, aber aus einem Frequenzspektrum kann man extrem wenig herauslesen. Aber daraus kann man lesen wie es sich von Spektrum zu Spektrum ändert.

    Man muss den zeitlichen Verlauf analysieren. Die Momentaufnahme von einem Spektrum sagt ja über ein Musikstück, zumindest über den Rhythmus, gar nix aus.

    Ich stell mir das so vor: Ich schlage einen Ton an.

    Wie schaut das Spektrum zu dem Zeitpunkt in dem der Ton angeschlagen wird aus?

    Da bekommt man sehr hohe Frequenzen, auch wenn das mit einem Instrument gespielt wird wo der Dauerton nur sehr niedrige Frequenzen liefert.

    Ich glaube deswegen, weil der Puls am Anfang, an dem das ganze beginnt: -Angenommen sie haben einen Rhythmus und der Ton wird angeschlagen, dann hat der eigentlich eine total niedrige Frequenz, aber immer dort wo der Anschlag gemacht wird, dort bekommt man extrem hohe Frequenzen, durch den Sprung. Das heißt, wenn man jetzt eine FFT in diesem Bereich (Sprung) macht, dann bekommt man nur sehr hohe Frequenzen, wenn man in dem Bereich (nach dem Sprung) eine FFT macht, dann bekommt man nur sehr niedrige Frequenzen.

    Das heißt man muss sich anschauen wie war der zeitliche Verlauf in verschiedenen (h,m,t) Bändern (Frequenzbänder, siehe Code u. Erklärungen), sonst bekommt man nie einen Rhythmus raus aus dem Spektrum.

    Das wichtigste ist, man muss den Rhythmus von dem Musikstück herausgewinnen. Letztendes wenn man da dann irgendeine Funktion hat, dann braucht man da die Höhen, die Mitten und die Tiefen; und man braucht eine Funktion davon wie das ausgeschaut hat

    > eine zeitliche Funktion, ein h(t), ein m(t) und ein t(t);

    > Höhen, Mitten, Tiefen

    > Wie ist der zeitliche Verlauf von den 3 Funktionen

    Und dann: wenn eine gewisse Kombination aus den 3 Funktionen stattfindet, dann denke ich, habe ich den Beginn von irgendeinem Rhythmus gefunden.

    Nämlich der Übergang von irgendeiner Kombination zu einer anderen Kombination, dann haben ich einen Anschlag von einem Musikinstrument.

    Das heißt der nächste Schritt wäre, dass man diese 3 Funktionen visualisieren kann und als Vektor vorliegen haben.

    Ich versuche dann zu schauen, ob man sich da irgendwelche Algorithmen überlegen kann und wie kann man solche Übergänge detektieren kann.
    Ich möchte versuchen, diese Funktionen zu visualieren. Ich habe einen Code, wo ich eine STFT auf ein Musikstück mache. So kriege ich alle 50ms ein Spektrum von meinen Musikstück.


    Ich habe jetzt die Samples, die man mit 44100 Hz (Abtastrate) abtastet- (also alle 22,7µs; Δt=22,7µs; das entspricht 144,1kHz) à man bekommt alle 27,7µsek ein Sample. Jetzt muss eine Funktion geschrieben werden, wenn man 4096 Samples nimmt, dann macht es 92,9ms.

    Das heißt, wenn das ganze jetzt 92,9 ms lang ist, dann ist das nächste Window um 30msek verschoben.

    Das heißt der Beginn muss immer um 30ms verschoben sein..


    Der Window shift sollte 30ms betragen.

    Man braucht dann nicht jedes einzelne ploten, weil das völlig sinnlos ist; sondern der nächste Schritt ist dann wenn man den Shift auf 30ms legt, dann muss man von jedem einzelnen FFT die Frequenzanalyse in die 3 Bereiche machen und dann bekommt man einen Wert pro hmt (hohe, mittlere und tiefe) alle 30m.


    Dann werden die Daten reduziert von FFT alle 30ms auf 3 Werte alle 30ms.

    Das heißt der Shift muss dann entsprechen den 30ms. Dann muss aus jeder einzelnen FFT die Frequenzanalyse in den Höhen, Mitten und Tiefen gemacht werden; da bekommt man dann nur noch 3 Werte und dann wird der Shift verschoben und bekommt man dann neue Werte.

  • du kannst natürlich versuchen, die Merkmale irgendwie händisch zu finden und dann so zu codieren, dass diese im Spektrum erkannt werden.
    Eventuell wäre es aber besser einen Machine Learning Ansatz zu wählen. Du gibts deinem Lern Algo also viele Trainingsdaten, welche genau so ein Spektrum von einem "Schlag" enthalten, und andererseits Spektren, welche eben nicht so einen Schlag enthalten. Dann soll der Lern Algo selbst rausfinden, woran man nun erkennen kann, dass ein Schlag stattgefunden hat. In Matlab gibts dafür eh viele fertige Funktionen, kannst ja mal mit SVM anfangen. Doku: https://de.mathworks.com/help/stats/sup…sification.html

    Und statt die STFT zu benutzen könntest du dir auch mal Wavelets ansehen, die eignen sich gut, wenn man neben dem Spektrum auch noch die Zeitinformation haben will. Das heißt, du bekommst nicht nur Koeffizienten für verschiedene Frequenzen, sondern auch für verschiedene Zeitpunkte. Wavelets für Matlab gibts hier: http://statweb.stanford.edu/~wavelab/

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!