1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Community
  3. Smalltalk

Audioanalyse- Rhytmus eines Musikstückes erkennen.

    • Problem
  • BukkakePower
  • 8. Januar 2017 um 20:52
  • Unerledigt
  • BukkakePower
    2
    BukkakePower
    Mitglied
    Punkte
    25
    Beiträge
    3
    • 8. Januar 2017 um 20:52
    • #1

    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.

    Code
    %% MATLAB-PROGRAMMIERUNG:
    %% STFT = SHORT TIME FOURIER-TRANSFORMATION
    %___________________________________________
    clear all;
    [y,fs]=audioread('UnchainMyHeart.wav');
    % audioread = Reading the WAV-File 
    % y = A vector, which contains our audio signal
    % fs = Sampling frequency
    % 'UnchainMyHeart' = Name of the WAV-File
    
    
    %PARAMETER FOR THE CODE
    %_________________________________________________________________________
    t_seg=0.09; %Length of the segment, on which we use the STFT
    
    
    fftlen = 4096; 
    % Length of the fft
    
    
    % L,M,H bands
    % Start & Stop frequency defenition of bands
     fL = [  1,  300 ]; % Low frequencies
     fM = [  301,  5000 ]; % Medium frequencies
     fH = [ 5001, 22050 ]; % High frequencies
     
    %_________________________________________________________________________
    
    
    segl =floor(t_seg*fs); 
    % Length of the segment(90ms), which is being multiplied by the sampling frequency 
    % The result is rounded off with the function "floor"
    
    
    windowshift=segl/3; 
    % Defining the size of the window, which goes to next segment and so on, until to the 
    % end of the audio signal
    
    
    window=hann(segl); 
    % Hanning Function, which is being stored in a vraiable
    % Matlab usually works better with variables than actual numbers. Hence the
    % workspace. This way, you can avoid errors.  
    
    
    window=window.'; 
    % transpose vector from a line vector to a row vector
    % In the workspace, you can see, what kind of vector it is
    
    
    si=1; 
    % Start index
    
    
    ei=segl; 
    % End index
    
    
    AOS=floor( length(y)/windowshift - 1);
    % Determining the numbers of segments in my audio signal
    
    
    
    
    f1=figure;
        % New figure is being openend
        n=0:1:fftlen-1;
        f=n/(fftlen-1)*fs;
        % Definig frequency vector
    
        Ya=zeros(1,fftlen);
        % The values between "1" and "fftlen" are being filled with zeros
    
    for m= 1:1:AOS
    
        y_a = y(si:ei);
        y_a= y_a.*window;
        Ya=fft(y_a, fftlen);
        YA=abs(Ya);
    
        drawnow; 
        % Updates the graphical objects
    
            % indices of bands
        LI = find((f>=fL(1))&(f<=fL(2))); 
        MI = find((f>=fM(1))&(f<=fM(2)));
        HI = find((f>=fH(1))&(f<=fH(2)));
        % mean values of bands
        ML = mean(YA(LI));
        MM = mean(YA(MI));
        MH = mean(YA(HI));
    
        figure(f1);
        plot(f, 20*log10(YA));    
        ylim([-90 50]);
        xlim([0 fs/2]);
    
        % Limiting the length of my y-axis
        title('Spectrum of audio signal');
        % Title
        xlabel('f(Hz)');
        % Name of x-axis
        ylabel('abs(Ya)/dB');
        % Name of y-axis
        grid on;
        % Generating grid raster
    
        si=si+windowshift; 
        %Start index is being updated
        ei=ei+windowshift; 
        %End index is being updated
    
    end
    Alles anzeigen


    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.

  • stackoverflow
    5
    stackoverflow
    Mitglied
    Reaktionen
    8
    Punkte
    258
    Beiträge
    49
    • 8. Januar 2017 um 23:18
    • #2

    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/

  • Maximilian Rupp 27. Dezember 2024 um 00:15

    Hat das Thema aus dem Forum Off-Topic nach Off-Topic verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung