2015-04-01 2 views
1

Я новичок в MATLAB, и я работаю над программой, которая занимается частотой человеческого голоса на основе микрофонного ввода. Самая большая проблема, с которой я сталкиваюсь, заключается в том, что музыкальные ноты (что я имею в виду в этом проекте) увеличивают частоту экспоненциально, приблизительно 1.059463^x для каждого полутона в музыкальном масштабе.
В программе, с которой я имею дело, мне нужно как масштабировать график так, чтобы обнаруженная частота была близка к номеру ноты, которой она соответствует, а также масштабировала данные, чтобы я мог работать с номерами нот в терминах заметок и музыкальные центы, поэтому частотный график можно легко преобразовать в MIDI-данные.
Единственный другой вариант, который я нашел, - это создать библиотеку частот для записанных частот, которые нужно сравнить, но это излишне сложно и требует много времени.
Итак, в сущности, я пытаюсь масштабировать данные так, чтобы А2 с частотой 110 Гц соответствовал его номеру ноты 45. Есть ли способ сделать это?MATLAB semilog scaling

+0

[This] (http://newt.phys.unsw.edu.au/jw/notes.html) может быть полезным –

+0

Я действительно использовал это как ссылку, но я не знаю, как для масштабирования данных в масштабе MIDI. –

+0

См. Мой ответ –

ответ

0

Я думаю, что это делает то, что вы хотите:

f = 110; %// frequency in Hz 
n = log10(f/440)/log10(2)*12+69; %// 440 Hz (note A4) is note 69 
note = round(n); 
cents = round((n-note)*100); 

Примеры: f = 110 дает

note = 
    45 
cents = 
    0 

f = 345 дает

note = 
    65 
cents = 
    -21 

в соответствии с this reference и this converter.

+0

Спасибо. Есть ли способ масштабировать весь граф, используя это? Например, если вы используете микрофонный вход в реальном времени, есть ли способ, чтобы обнаруженная частота отображалась и записывалась с точки зрения номера ноты и центов, а не только частоты? –

+0

"_the __detected__ частота, которая должна быть __displayed__ и __recorded___". Извините, я не понимаю, что вы имеете в виду. Записанный аудиофайл содержит звуковые фрагменты, представляющие форму волны. Обнаружение частот из этого (а затем их отображение) - это другое дело. –

+0

У меня есть алгоритм определения высоты тона, который я могу использовать, но мне нужен способ легко преобразовать частоту, которую программа обнаруживает в номере ноты MIDI. По сути, если я получаю 4 точки данных f = 110, f = 116.541, f = 123.471 и f = 103.826, я хотел бы, чтобы полученный граф отображал номер ноты, а не частоту, давая мне точки данных n = 45, n = 46, n = 47 и n = 44. –