У меня есть задача распознать ноту, сыгранную инструментом. Из того, что я прочитал в Интернете, хорошим подходом к этой проблеме является алгоритм БПФ. Он принимает входную волну и разбивает ее на несколько простых волн, которые, когда вы их суммируете, дают вам исходную волну (разложение). С этой частью все ясно.
Я скачал WAV-файл, содержащий ноту G на фортепиано, которую я хочу распознать. Я применяю алгоритм БПФ и, очевидно, получаю результат, на этом этапе я теряюсь.
Что мне нужно сделать дальше, чтобы распознать воспроизводимый звук? Я знаю, что должен преобразовать этот вывод в частоту в Гц (поскольку все ноты имеют частоту, уникальную, если я не ошибаюсь). Что я могу сделать так:
[y,fs] = wavread('foo.wav');
ydft = fft(y);
% I'll assume y has even length
ydft = ydft(1:length(y)/2+1);
% create a frequency vector
freq = 0:fs/length(y):fs/2;
Теперь у меня есть вектор с именем freq с частотами, идентифицированными с помощью fft. Как я могу получить частоту ноты из этого вектора?
[ymax, idx] = max(ydft)
, чтобы найти максимальное значение в БПФ (ymax
), и используйтеfreq(idx)
, чтобы найти соответствующую частоту. - person hbaderts   schedule 13.11.2016