Используя вывод БПФ в файле wav с одной нотой, узнайте частоту ноты (для ее определения)

У меня есть задача распознать ноту, сыгранную инструментом. Из того, что я прочитал в Интернете, хорошим подходом к этой проблеме является алгоритм БПФ. Он принимает входную волну и разбивает ее на несколько простых волн, которые, когда вы их суммируете, дают вам исходную волну (разложение). С этой частью все ясно.
Я скачал 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. Как я могу получить частоту ноты из этого вектора?


person Lucian Tarna    schedule 13.11.2016    source источник
comment
Для начала нужно знать, как настраивается инструмент. Точное сопоставление частоты с нотой сильно различается — см. Концертная высота   -  person greg-449    schedule 13.11.2016
comment
Я получаю их от здесь, поэтому я думаю, что это стандарт 440 для A   -  person Lucian Tarna    schedule 13.11.2016
comment
Обратите внимание, что музыкальная высота обычно намного сложнее, чем просто определение частоты одного компонента.   -  person Paul R    schedule 13.11.2016
comment
@LucianTarna Я согласен с Полом Р., что это нечто большее, чем просто поиск доминирующей частоты. Однако, если вы просто хотите попробовать это для начала, попробуйте [ymax, idx] = max(ydft), чтобы найти максимальное значение в БПФ (ymax), и используйте freq(idx), чтобы найти соответствующую частоту.   -  person hbaderts    schedule 13.11.2016
comment
но я никогда не говорил, что хочу максимальное значение. Мой ввод - нота фортепиано (всегда), я должен решить, какая это нота. Всегда ли максимальное значение, возвращаемое БПФ, представляет собой правильный ответ?   -  person Lucian Tarna    schedule 13.11.2016
comment
Нет, вам действительно нужно понять, что такое питч, а затем прочитать алгоритмы определения подачи. Вы также можете найти поучительным взглянуть на спектр мощности фортепианной ноты (постройте логарифмическую величину вашего выхода БПФ), чтобы увидеть, с чем вы столкнулись.   -  person Paul R    schedule 13.11.2016
comment
о, я вижу, так что читаю для меня, большое спасибо, Пол :)   -  person Lucian Tarna    schedule 13.11.2016
comment
Да, небольшое вложение в чтение сейчас, скорее всего, сэкономит вам много усилий по программированию позже... ;-)   -  person Paul R    schedule 14.11.2016