In this code, i am doing a STFT on my audio file. I want to find the rhythm of file. Bascially the bass, which is located in the lower frequencies. I think i need to find the BPM of my file. The tempo of a song is measured by BPM, which is i need. There is a method,that if there's strong beat is to take the magnitude of the STFT of the waveform, and then auto-correlate it in only the time dimension. The peak of the auto-correlation function will be the beat, or a submultiple of it.
This is equivalent to breaking up the signal into a lot of different frequency bands, finding the amplitude envelope of each, autocorrelating each envelope, and then summing them. The noise and other parts of music are averaged out by the cross-correlation operation.
I tried to find this method, how excatly this can be performed. I was searching for an open-source-code or any kind of instructions, how this can be done. But i wasn't able to find anything. Does anyone can help me to reach the steps explained in the methods?
%% MATLAB
%% 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(50ms), 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