Определение частоты / шага для манекенов
В то время как у меня есть много вопросов на этом сайте, касающихся концепции определения высоты тона... Все они имеют дело с этим волшебным БПФ, с которым я не знаком. Я пытаюсь создать приложение для Android, которое должно реализовать определение высоты тона. Я абсолютно не понимаю алгоритмы, которые используются для этого.
Это не может быть так сложно, не так ли? В конце концов, на рынке Android есть около 8 миллиардов гитарных тюнеров.
Может кто-нибудь помочь?
2 ответа
Быстрое преобразование Фурье изменяет функцию от временной области к частотной области. Так что вместо f(t)
где f
это сигнал, который вы получаете от микрофона и t
это временной индекс этого сигнала, вы получаете g(θ)
где g
это БПФ f
а также θ
это частота. Когда у вас есть g(θ)
нужно просто найти какой θ
с самой высокой амплитудой, что означает "самую громкую" частоту. Это будет основной звук, который вы слышите.
Что касается фактической реализации БПФ, если вы воспользуетесь "примером кода быстрого преобразования Фурье", вы получите множество примеров.
БПФ на самом деле не лучший способ реализовать обнаружение высоты тона или отслеживание высоты тона. Одна проблема заключается в том, что самая громкая частота не всегда является основной частотой. Другое заключается в том, что БПФ само по себе требует довольно большого объема данных и обработки, чтобы получить разрешение, необходимое для настройки прибора, поэтому оно может показаться медленным (т.е. задержка). Еще одна проблема заключается в том, что результат работы с БПФ должен быть интуитивно понятным: вы получаете массив комплексных чисел и должны знать, как их интерпретировать.
Если вы действительно хотите использовать БПФ, вот один из подходов:
- Низкочастотный сигнал. Это поможет предотвратить шум и высшие гармоники от получения ложных результатов. Возможно, вы могли бы пропустить этот шаг и вместо этого взвесить результаты в сторону более низких значений БПФ. Для некоторых инструментов с сильными основными частотами это может не понадобиться.
- Окно ваш сигнал. Размер окон должен быть не менее 4096. Чем больше, тем лучше, потому что это дает вам лучшее разрешение по частоте. Если вы сделаете слишком большой, это приведет к увеличению времени вычислений и задержке. Функция Hann - хороший выбор для вашего окна. http://en.wikipedia.org/wiki/Hann_function
- БПФ оконный сигнал так часто, как вы можете. Даже перекрывающиеся окна хороши.
- Результаты БПФ являются комплексными числами. Найдите величину каждого комплексного числа, используя sqrt(действительное ^2 + imag^2). Индекс в массиве FFT с наибольшей величиной - это индекс с вашей максимальной частотой.
- Вы можете усреднить несколько БПФ для более последовательных результатов.
Как вы рассчитываете частоту по индексу? Хорошо, скажем, у вас есть окно размера N. После того, как вы БПФ, у вас будет N комплексных чисел. Если ваш пик равен девятому, а частота дискретизации равна 44100, то ваша максимальная частота будет близка к (44100/2)*n/N. Почему рядом? хорошо, у вас есть ошибка (44100/2)*1/N. Для размера корзины 4096 это составляет около 5,3 Гц - легко слышно на A440. Вы можете улучшить это: 1. принимая во внимание фазу (я только что описал, как принимать во внимание величину), 2. используя большие окна (что увеличит задержку и требования к обработке, поскольку FFT - это алгоритм N Log N), или 3. используйте лучший алгоритм, такой как YIN http://www.ircam.fr/pcm/cheveign/pss/2002_JASA_YIN.pdf
Вы можете пропустить этап создания окон и просто разбить аудио на отдельные фрагменты, сколько угодно сэмплов, которые вы хотите проанализировать. Это эквивалентно использованию квадратного окна, которое работает, но вы можете получить больше шума в ваших результатах.
Кстати: многие из этих лицензионных кодов приложений тюнеров формируют сторонние организации, такие как z-plane и iZotope.
Обновление: если вам нужен исходный код на C и полное руководство по методу FFT, я написал его. Код компилируется и запускается в Mac OS X и должен быть легко преобразован в другие платформы. Это не предназначено, чтобы быть лучшим, но это разработано, чтобы быть легким для понимания.