MATLAB полулоговое масштабирование

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

1 ответ

Решение

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

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

в соответствии с этой ссылкой и этим преобразователем.

Другие вопросы по тегам