Как устроены гитарные тюнеры?

Когда-то давно на WindowsMobile у меня была программка, которая определяла частоту звука, поступающего в микрофон и выводила ноту и указание «выше/ниже», если звук в ноту не попадает. Можно было с помощью нее настраивать аккустическую гитару или просто учиться петь. Так как же устроены подобные приложения? Как определить частоту звука на микрофоне или LineIn?
  • Вопрос задан
  • 5076 просмотров
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Захватить аудио с микрофона или lineIn особо проблемы не составляет, а дальше… цифровой звук представляет собой последовательность сэмплов, количество этих сэмплов определяется частотой дискретизации. Каждый сэмпл представляет собой число, описывающее амплитуду в данный момент времени. Частоту звука можно определить по расстоянию между двумя одинаковыми пиками. Ну тобиш как на обычном графике.
Ответ написан
@MichaelBorisov
Применяется частотный анализ (основанный на преобразовании Фурье или Wavelet и др). Музыкальный звук в частотной области представляет собой набор пиков. Первый пик на самой нижней (базовой) частоте, а остальные — на кратных ей частотах. В простейшем случае алгоритм таков:

1) Записываем кусок звукового сигнала
2) Вычисляем спектральную плотность мощности (СПМ) методом Уолша (Welch) или другим.
3) Ищем на СПМ первый пик, берем его частоту.
4) Вычисляем номер ноты по формуле:
N = 12*log2(f/440), где f — частота, в Гц, где находится первый пик
номер ноты получается в полутонах относительно ля первой октавы (эта нота имеет частоту 440Гц, отсюда и константа в формуле).

Если N получается близким к целому — значит подстройка выполнена точно на ту ноту, которой соответствует N. Если дробная часть N больше 0.1 или меньше 0.9 — значит подстройка неточная.

Поиск пика по СПМ — нетривиальная задача, потому что локальных максимумов там много из-за шума, а глобальный максимум не обязательно является первой гармоникой (он может быть на кратной базовой частоте). Поэтому можно, например, найти сначала глобальный максимум, а потом поискать, нет ли локальных максимумов на частотах, близких к дольным от частоты глобального максимума, и при этом имеющих амплитуду, скажем, не менее 1/2 от амплитуды глобального максимума.
Ответ написан
Немного о создании такого приложения на Хабрахабре.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы