Как мне реализовать полосовой фильтр в C (Цель: обнаружение основного тона)? - PullRequest
2 голосов
/ 05 ноября 2010

Я недавно задавал этот вопрос :

Я ищу алгоритм для определения высоты тона. один из ответов предполагал, что я использую начальное БПФ, чтобы получить базовую частотную характеристику, выяснить, какие частоты озвучиваются, и проследить за ней с помощью полосового фильтра в каждой интересующей области:

Немного продвинутый алгоритм может сделать что-то вроде этого:

  1. Приблизительно определить частоту основного тона (можно сделать с помощью DFT).
  2. Полосовой сигнал для фильтрации частоты основного тона.
  3. Подсчет количества выборок между двумя пиками в отфильтрованных сигналах.

Теперь я могу сделать первый шаг, хорошо (я кодирую для iOS, и у Apple есть платформа (ускоренная среда) для выполнения FFT и т. Д.

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

Так что я пытаюсь обдумать этот ответ выше, но я не понимаю, как я могу применить концепцию полосового фильтра к коду.

Может кто-нибудь помочь?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Дизайн фильтра довольно сложный.Есть много техник.Сначала вы должны решить, какой фильтр вы хотите создать.Конечный импульсный отклик (FIR)?Бесконечный импульсный отклик (БИХ)?Затем вы выбираете алгоритм для создания фильтра этого типа.Алгоритм Ремеза часто используется для проектирования FIR-фильтров.Перейдите сюда, чтобы увидеть сложность, о которой я говорил: http://en.wikipedia.org/wiki/Remez_algorithm

Лучше всего для создания фильтра следует использовать существующую библиотеку обработки сигналов.Быстрый поиск в Google привел меня сюда: http://spuc.sourceforge.net/

Учитывая, что ваше приложение, вы можете прочитать о соответствующих фильтрах.Я не уверен, актуальны ли они здесь, но они могут быть.http://en.wikipedia.org/wiki/Matched_filter

1 голос
/ 16 сентября 2014

хорошо в Википедии, проверка на фильтр нижних частот и hi-pass, затем присоединитесь к ним, чтобы сделать полосовой фильтр. В Википедии есть реализации кода для этих двух фильтров.

http://en.wikipedia.org/wiki/Low-pass_filter http://en.wikipedia.org/wiki/High-pass_filter

...