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