Обнаружение высоты тона веб-аудио для тюнера

Итак, я сделал простой тюнер HTML5, используя API веб-аудио. У меня все настроено так, чтобы реагировать на правильные частоты, проблема, похоже, с получением реальных частот. Используя ввод, я создаю массив спектра, в котором я ищу самое высокое значение, и использую эту частоту в качестве частоты для ввода в тюнер. Проблема в том, что при создании анализатора в Web Audio он не может стать более конкретным, чем значение БПФ 2048. При использовании этого, если я играю ноту 440 Гц, ближайшая нота в массиве - это что-то вроде 430 Гц, и следующее значение кажется быть выше 440. Поэтому тюнер будет думать, что я играю эти ноты, когда на самом деле самая громкая частота должна быть 440 Гц, а не 430 Гц. Поскольку эта частота не существует в массиве анализатора, я пытаюсь найти способ обойти это, или я упускаю что-то очень очевидное.

Я очень новичок в этом, поэтому любая помощь будет очень признательна.

Спасибо


person elephant    schedule 27.06.2014    source источник
comment
Это демонстрационное приложение может быть полезной ссылкой: webaudiodemos.appspot.com/pitchdetect/index.html   -  person Jordan Eldredge    schedule 08.01.2015


Ответы (1)


Существует несколько подходов к реализации обнаружения высоты тона. В этом документе представлен их обзор. Их вывод состоит в том, что использование БПФ может быть не лучшим способом, однако неясно, что на самом деле делал их основанный на БПФ алгоритм.

Если вы просто настраиваете гитарные струны на фиксированные частоты, существуют гораздо более простые подходы. Создать полностью хроматический тюнер, который априори не знает ожидаемую частоту, сложно.

Подход БПФ, который вы используете, вполне возможен (я создал надежный тюнер музыкальных инструментов, используя этот подход, который используется рядом сторонних производителей). Однако вам потребуется значительный объем постобработки данных БПФ.

Для начала вы решаете проблему разрешения с помощью короткого таймера FFT (STFT) — или, точнее, их последовательности. Этот процесс хорошо описан в этой статье.

Если вы намереваетесь построить тюнер для гитары и бас-гитары (и будем откровенны, все, кто задает здесь вопрос), вам потребуется по крайней мере 4092-точечное ДПФ с перекрывающимися окнами, чтобы не нарушать скорость Найквиста на частоте нижняя струна E1 на частоте ~ 41 Гц.

У вас есть куча других алгоритмических и юзабилити-препятствий, которые нужно преодолеть. Не в последнюю очередь то, что воспринимаемая высота тона и спектральный пик не всегда совпадают. Получение спектрального пика из STFT не работает надежно (по этой же причине не работает базовый подход автокорреляции).

person marko    schedule 27.06.2014
comment
Большое спасибо! Я прочитаю то, что вы предоставили. Что касается частотного анализа, я собирался реализовать что-то для поиска обертонов, чтобы проверить правильную частоту. - person elephant; 01.07.2014
comment
да. Это правильная идея. Несколько вещей, на которые следует обратить внимание: i) величина бина БПФ фактически эквивалентна довольно слабому полосовому фильтру. В смежных с пиком бинах будет некоторый сигнал, и если частота упадет до середины, два бина будут иметь одинаковую амплитуду. ii) Согласие работает, потому что частичные выравниваются. Это может быть забавно, если у вас есть симпатический резонанс — например. из соседних открытых строк. Обычная ситуация со струнными инструментами. - person marko; 01.07.2014