%Function EdgeDetect % Takes in the entire signal and outputs a vector of values % representing the number of notes played within each 40000 sample % window. function [beatpersec] = EdgeDetect(guitar) %Use Gaussian filter function to create filter filter = GaussianFilter;%/norm(GaussianFilter,inf); %Low Pass Filter the guitar signal to remove unnecessary noise guitar = conv(guitar,ones(3000,1)); guitar = guitar(1500:(length(guitar)-1500)); %Use FFT convolution to apply gaussian edge-detector signal extendedfilter = [filter; zeros(length(guitar)-3001,1)]; fftfilter = fft(extendedfilter); fftsig = fft(guitar); multsig = fftfilter.*fftsig; fsig = abs(ifft(multsig)); normsig = fsig/norm(fsig,inf); %Ignore all of signal below threshold for n = 1:1:length(normsig) if normsig(n)>0.1 normsig(n) = normsig(n); else normsig(n) = 0; end end %Create vector of zeros with ones where peaks occur sigzeros = zeros(1,length(normsig)); for n = 2:1:length(normsig) if normsig(n) >= normsig(n-1) sigzeros(n) = 1; sigzeros(n-1) = 0; else sigzeros(n) = 0; end end %Count up number of beats within each 40000 sample window divbeats = zeros(floor(length(normsig)/40001) + 1, 1); n = 1; while (n <= length(sigzeros)) if (sigzeros(n) == 1) divbeats(ceil(n/40000)) = divbeats(floor((n/40001)) + 1) + 1; n = n + 7000; else n = n+1; end end %Output beatpersec = divbeats;