Распознавание пика в определенной частотной области

Мне интересно, можно ли прикрепить микрофон к плате arduino и заставить arduino распознавать пик громкости в определенном диапазоне частот.

Я хочу, чтобы он обнаруживал определенный пик (например, 0,1 дБ) в диапазоне от 1000 Гц до 5000 Гц.

Заранее спасибо.

, 👍3


3 ответа


0

Вы можете сэмплировать звук с микрофона, а затем применить быстрое преобразование Фурье (БПФ).

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

Для этого на ардуино есть несколько примеров и библиотек, таких как EasyFFT и arduinoFFT.

ПС. Ответ Эдгара Бонета лучше; возможно, я стал немного ленивым в придумывании вычислительно эффективных способов ведения дел из-за того, что использовал исключительно "мускулистые" ардуино.

,

1

Вы можете отфильтровать сигнал и посмотреть на мощность, которая находится в интересующем вас диапазоне частот. Для этого можно использовать БПФ, но это довольно дорого с точки зрения вычислений. Если вы пойдете на БПФ, вы , вероятно, закончите выборку микрофона небольшими порциями (несколько миллисекунд каждые несколько десятков миллисекунд), так как Arduino будет тратить большую часть своего времени на обработку данных.

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

raw_sample = sample_the_microphone_somehow();
filtered_signal = bandpass_filter(raw_sample);
instantaneous_power = filtered_signal * filtered_signal:
smoothed_power = low_pass_filter(instantaneous_power);

Но вам все равно понадобится мускулистый Arduino, если вы хотите иметь возможность получать и обрабатывать сэмплы с разумной скоростью: по крайней мере, в два раза выше самой высокой частоты, которая исходит из микрофона.

Еще лучшим вариантом может быть фильтрация в аналоговой области, прежде чем сигнал достигнет Arduino. Если вы можете, по крайней мере, удалить частотные компоненты выше 5 кГц, то Arduino нужно будет только сделать выборку со скоростью 10 кС / с и запустить цифровой фильтр высоких частот, чтобы удалить часть сигнала ниже 1 кГц. Это должно быть достаточно легко даже для Arduino на базе AVR.

Для реализации фильтров вы можете попробовать этот онлайн -конструктор фильтров

,

1

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

Но он может быть более практичным и требовать менее интенсивной обработки. Хотя он предназначен только для обнаружения одной частоты, он, конечно, даст результаты, близкие к заданной частоте, в зависимости от частоты дискретизации и пороговых значений обнаружения.

Ранее я использовал библиотеку алгоритмов Arduino Goertzel, но на данный момент через менеджер библиотек ничего не доступно; однако веб-поиск показывает некоторые хиты.

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

Я бы попробовал реализовать один или несколько детекторов Гертцеля в вашем диапазоне (например, один на частоте 3 кГц или два на частоте 2 кГц и 4 кГц), чтобы увидеть, достаточно ли они чувствительны.

,