matlab code for musical note recognition based on frequency

조회 수: 130 (최근 30일)
i am working on a project to identify the musical note based on frequencies using window methods i need help to write the code and understanding it . ihave a code but its to advanced to understand......
clear;
clc;
close all;
% Note Recognition
%% Note Initialization
mainNames = char('C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B');
names = char('A0', 'A#0' ,'B0');
A0 = 27.5;
ind = 4;
for i = 0:87
data(i+1) = A0 * (2^(1/12))^i;
if i>2
a = [mainNames( rem((ind - 4), 12)+1,:) num2str(fix((ind - 4)/12)+1)];
names = char(names, a);
ind = ind + 1;
end
end
% Band Initialization
bands(1) = 20;
for i = 1:87
bands(i+1) = +7+(data(i) + data(i+1))/2;
end
bands(89) = 4500;
%%
fileName = 'c.wav'; % File name
[y, Fs] = audioread(fileName); % Read audio file
y = (y(:,1) + y(:,2))*4; % Decrease 2 channels to 1
%y = (y(:,1));
y(1:2:end) = 0; %from big vector take only odd index values % Do decimation(decreace the no of samples)
frameLength = 4410*2; % 2 Güzel oldu
endPart = frameLength*ceil(length(y)/frameLength); % complete the last frame %ceil is to round off to nearest integer
y(length(y)+1 : endPart) = 0;
f = linspace(1,Fs,frameLength); %creates linearly spaced vector
%%
harmonics = 0;
for i = 1:round(length(y)/frameLength) % For each frame
% Divide audio into frames
frames(i, 1:frameLength) = y( (frameLength*(i-1)+1):(frameLength*i) )';
frame = y( (frameLength*(i-1)+1):(frameLength*i) )';
frame = frame .* hamming(length(frame))'; % Hamming Window
fframe = abs(fft(frame)); % FFT
fp = sum(fframe);
p = sum(abs(frame));
b = true;
if(p < 200 || fp < 1000) % Put a threshold for processing
b = false;
end
% Bands
for i=1:88
freqBand(i) = mean(fframe( round(bands(i)/(Fs/frameLength) ):round(bands(i+1)/(Fs/frameLength))))^2;
end
% Plotting
subplot(3,1,1)
stem(freqBand)
subplot(3,1,2)
plot(fframe)
xlim([0,500])
subplot(3,1,3)
plot(fframe)
ylim([-1 1])
hold off
pause(0.1)
sound(fframe,Fs)
% Desicion
m = find(freqBand == max(freqBand(:)));
if(b) disp(names(m,:)); % Print the result
else disp('.'); end
if(b)
index = 1;
for i = 1:88
if(freqBand(i) > 2000)
harmonics(index) = i;
index = index+1;
end
end
end
end
this is the code.....

채택된 답변

Thiago Henrique Gomes Lobato
Thiago Henrique Gomes Lobato 2020년 6월 14일
To really undestand the method, first try to define how exactly you gonna get the frequencies. Your main steps are :
  1. Define your notes and which frequency do they have (Line 5-23)
  2. Read your sound data and define the window size to evaluate the sound (Line 24-33). Here your code has some flaws. Ex: Decimation change the sampling rate, so you can't simply do it to "decrease number of samples" and don't compensate it afterwards. If you want a mono channel from a stereo recording you normally take the mean, not the sum times 4.
  3. For each evaluation window, take the FFT and check which note has the frequency closest to the maximum amplitude (Line 34-86). In your code the FFT is summed in bands so each note has its "own" band and then you can just check the strongest band.
The algorithm is quite simple, but the way it was implemented in your code is indeed not so optimal. I would suggest you to try to implement it yourself in a more clean way based in those main steps. This should also help you to better internalize it.
  댓글 수: 1
varun taliparambe vitel
varun taliparambe vitel 2020년 6월 14일
thank you
i will try implementing myself but i dont know why those formulas used

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Geetesh Mokhare
Geetesh Mokhare 2021년 3월 29일
endPart = frameLength*ceil(length(y)/frameLength
WHAT IS THE MEANING OF THIS?
  댓글 수: 2
varun taliparambe vitel
varun taliparambe vitel 2021년 3월 29일
We are trying to define the last part of the frame
Geetesh Mokhare
Geetesh Mokhare 2021년 3월 29일
One more help Can you tell me the application of this code in 5-6 lines ? Please request

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Using audio files에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by