Как обнаружить закономерности в выводе БПФ?

У меня есть вывод БПФ с микрофона, и я хочу обнаружить по нему вой определенного животного (оно воет в характерном частотном спектре). Есть ли способ реализовать алгоритм распознавания образов в Arduino для этого? Спасибо!

, 👍1

Обсуждение

Мы можем помочь вам с языком программирования и аппаратной частью. Мы не можем помочь вам с неясными алгоритмами. Может быть, сайты SE по математике или физике подошли бы для этого лучше., @Majenko

Ну это облом. Пожалуй, тогда я закрою тему. Спасибо!, @rubemnobre

Как только у вас появится представление о том, что вы хотите выбрать, мы можем помочь вам закодировать его., @Majenko

Вы можете применить простую версию машинного обучения; измерение, фильтрация, нормализация и последнее совпадение (как расстояние до собранной статистики)., @Mikael Patel


1 ответ


Лучший ответ:

0

Это зависит.

Сначала вам нужно разбить проблему на этапы:

  1. Если вы можете сделать статический анализ, то шанс есть. То есть, если вы можете записать моментальный снимок воя, а затем потратить некоторое время на его обработку.
  2. Если вам нужно обработать его (почти) в реальном времени, то я почти уверен, что Arduino слишком медленный для этого. В следующих шагах будет понятно, почему, а в остальном вы можете использовать следующие шаги, чтобы получить некоторое представление о том, как проводить анализ.
  3. Предположим, что вы можете сделать снимок звука, а затем сохранить его. У Arduino всего 2 КБ SRAM, что слишком мало. Я предполагаю, что вам нужна приличная частота (скажем, 40 кГц) монофонических (1-канальных) сэмплов, что составляет 40 КБ памяти.
  4. Вам нужно записать это (вероятно, любой звуковой датчик будет достаточно быстрым) и сохранить его на каком-либо устройстве, будь то внешняя SRAM (самая быстрая, самая дорогая), внешняя EEPROM (где-то посередине) или SD-карта (может быть медленный). EEPROM/SD не могут быть записаны «вечно», поэтому если вы хотите обрабатывать выборку каждую секунду, у вас могут возникнуть проблемы.
  5. Затем вам нужно запустить свой алгоритм на статических данных. Я не знаю этого алгоритма, если вам придется повторять много раз, забудьте об использовании SD, используйте SRAM или EEPROM. В противном случае прочитайте несколько блоков (обычно 2 или 3, чтобы получить 1 или 1,5 КБ) и обработайте их. Я надеюсь, что вы можете сохранить результат также в Arduino, в противном случае запишите его (если вы много пишете, вероятно, SRAM - единственное приемлемое решение).

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

Обратите внимание, что могут быть и другие решения:

  • Если вам нужно больше скорости, попробуйте Arduino Due.
  • Если вам нужно больше (внутренней) SRAM, попробуйте Mega (8 КБ) или Due (48 КБ)
,

Спасибо за ответ! Что касается проблем с памятью, на которые вы указали, я думаю, что мне это сойдет с рук, потому что спектр, который я пытаюсь проанализировать, полностью ниже 1 кГц, а это означает, что нет необходимости иметь такую высокую частоту дискретизации (я знаю, что гармоники могут все испортить, но у меня есть аппаратная фильтрация)., @rubemnobre

И мне действительно не нужно делать это в реальном времени., @rubemnobre

по-прежнему 1 кГц составляет 1024 байта, у Arduino есть 2048 свободных байтов, и вам может потребоваться сохранить промежуточные результаты., @Michel Keijzers

Не в реальном времени делает это намного проще., @Michel Keijzers

Мне действительно нужно только 128 выборок за цикл. Частота дискретизации влияет только на скорость работы Arduino., @rubemnobre

Память -> разрешение., @rubemnobre

В этом случае вы можете получить хорошие результаты. 128 сэмплов очень хорошо управляемы. Возможно, вы даже сможете записывать новые данные во время расчета предыдущих данных (используя два буфера, один для хранения новых данных, другой для обработки)., @Michel Keijzers

Если вы считаете, что этот ответ полезен, проголосуйте за него, пожалуйста, и, если ответ отвечает на ваш вопрос, примите его как ответ., @Michel Keijzers

Спасибо за помощь! Я не могу принять это как ответ, потому что хотел узнать, какие алгоритмы я могу использовать., @rubemnobre

добро пожаловать (вы можете проголосовать, нажав стрелку вверх рядом с моим ответом), а ниже есть кнопка, чтобы принять его. Удачи с вашим проектом., @Michel Keijzers