Локализация звука с помощью двух микрофонов, Arduino Uno на MATLAB
Я уже давно пытаюсь добиться этого с помощью метода ITD и просматриваю различные статьи в сети.
Я хочу знать, возможно ли на самом деле добиться локализации звука с помощью Arduino Uno и двух микрофонов MEMS с высоким коэффициентом усиления (https://www.sparkfun.com/products/9868).
Я пробовал это в MATLAB, используя команду a = arduino() и команду readVoltage, но основная проблема, с которой я сталкиваюсь, заключается в том, что для конкретного звука (например, хлопки) разница во времени между двумя микрофонами не всегда одинакова, что приводит к разным прогнозам направления.
Нам удалось увеличить низкое разрешение Arduino, удалив ненужные операции. Теперь мы можем получить массив размером 750 в течение 10 секунд с разрешением 0,01 секунды. Я не уверен, что этого достаточно.
В основном у меня есть 3 массива, один из которых хранит время дискретизации, а два других - амплитуды двух аналоговых входов в это конкретное время в первом массиве.
Теперь я ищу пик в одном, а затем соответствующий ближний пик во втором, а затем вычисляю разницу во времени. После этого я могу вычислить угол, используя скорость звука и расстояние между микрофонами.
Пожалуйста, дайте мне знать, как я могу сделать эту работу или где я ошибаюсь.
@geek101, 👍1
Обсуждение2 ответа
Предположим, что расстояние между микрофонами составляет 0,5 м (что может быть достаточно мало для вас). В нормальных условиях звук распространяется со скоростью около 300 м /с. Допустим также, что вам нужна хотя бы точность измерения угла в 15°.
Как говорится в проекте Mikael linkedin, важно, чтобы расстояние до источника звука было достаточно большим (чтобы волны можно было рассматривать как плоские). Тогда у вас есть следующая ситуация:
Нас интересует разница в расстоянии, которую волны должны пройти до двух микрофонов. Его можно вычислить по дельте s = d * sin (альфа)
. При 15°
получаем дельту s = 0,13м.
Разница во времени рассчитывается по формуле delta t = delta s/v
, где v
- скорость звука. Мы получаем дельту t = 0,43 мс
, что соответствует частоте дискретизации 2,32 кГц. Поскольку мы используем два микрофона, которые должны быть отобраны последовательно, частота дискретизации должна быть удвоена. В итоге мы имеем частоту дискретизации
4,64 кГц
. Так что вашего времени выборки в 0,01 с
для этого будет недостаточно.
Самая большая разница во времени в этой настройке (с источником звука на одной линии с микрофонами) составит 1,6 мс
, так что ваше время дискретизации будет слишком большим даже для этого.
Что касается передачи с бодрейтом, скажем, 115200 бод, то это не должно быть проблемой.
Но фактическая скорость вашей настройки сильно зависит от вашего кода, который вы не показали. Может быть, этот пост на форуме поможет вам продвинуться дальше.
Да, но использование Arduino для сэмплирования звука от имени ПК только добавляет дополнительную сложность, в то время как * резко снижает качество и объем информации * по сравнению с внутренней звуковой картой., @Chris Stratton
@chrisl Спасибо за подробный и хорошо объясненный ответ. Я попробую процедуру по ссылке. Пожалуйста, скажите мне, если вы используете лучший микроконтроллер (например, серия NRF52 https://www.sparkfun.com/products/13990 ) помощь в получении лучшего разрешения., @geek101
кроме того, есть ли способ как-то ускорить чтение напряжения в Matlab, чтобы заставить это работать, возможно, с меньшей точностью 30-90 градусов и d = 1-1,5 м., @geek101
Я ничего не знаю о функциях matlab. Но Крис прав, что этого будет легче достичь при прямом подключении микрофона к ПК., @chrisl
Вы должны использовать функцию прерывания Arduino. Это приведет его к 4 микронам. Вы не можете использовать задержку при подсчете Arduino в микронах, которые необходимы. Вы можете иметь около 10 см между микрофонами, делая следующее:
Вы можете использовать акселерометр вместо микрофона. Серийное чтение, не работает, слишком медленно. Используйте ISR.. вместе с Arduino тактовая частота составляет 16 МГц. Дает ошибку в +- 10 микрон. Учитывая, что можно получить угол в пределах 0,5 градуса, если использовать синус / косинус. Но триггеры появляются в разных местах синуса волн, что дает вам дополнительные ошибки при низкой частоте.
Не сдавайся. Это работает:
- Присоедините прерывание (ISR) к 2 контактам. Сделайте все переменные, используемые в ISR, изменчивыми.
- Используйте внутренние часы с micros() для остановки при прерывании, отметьте переменную true, если она растет / падает / изменяется.
- Используйте разницу во времени от триггеров для расчетов.
- Вычисления делаем в цикле, а не ISR вычисляем с помощью радианов.
- Не пытайтесь читать или писать что-либо во время ISR или перед вычислениями, это испортит часы!
- Используйте бодрат 11500.
- Если в цикле или ISR = true, то отключите прерывание по переменной состояния.
Я исправил кучу вещей в этом посте. Пожалуйста, исправьте больше и избегайте текстовых стенографий., @timemage
- Как подключить ардуино к разъему для наушников?
- Как использовать звуковой датчик LM393 + динамик в Arduino
- Распознавание звука
- Статус выхода 1 ошибка компиляции для платы arduino/genuino uno при использовании кода тона
- Почему мой код обрабатывает звуковой датчик так, как будто он всегда ВЫСОКИЙ?
- При нажатии кнопки мне нужно воспроизвести вступительный звуковой файл, затем один из 50 других звуков по порядку при каждом нажатии кнопки
- Цифровой звуковой датчик
- Аналоговый выход обеспечивает близкий диапазон значений
Рассчитайте минимальное расстояние с учетом ваших настроек. Что вы получаете? А какой параметр определяет это и приращение/разрешение? Также проверьте свои требования к памяти. Помните, что Uno имеет в общей сложности 2K SRAM (и это должно содержать стек, кучу, глобальные переменные)., @Mikael Patel
Что вы подразумеваете под минимальным расстоянием? Разрешение улучшается при меньшем количестве операций и отсутствии операторов задержки. Я попытался изменить скорость передачи данных в бодах, но это ничего не изменило., @geek101
Как далеко распространяется звук (при нормальной комнатной температуре и давлении воздуха) за 0,01 сек и/ или время выполнения analogRead()? Разработка программного обеспечения - это тоже "делать цифры"., @Mikael Patel
@MikaelPatel Вы хотите сказать, что я должен поместить источник звука на расстояние не менее ~ 3,43 метра (или кратное этому), чтобы была измеримая разница во времени?, @geek101
Как насчет расстояния между микрофонами? Это дельта между источником и микрофонами, которую вы хотите измерить, чтобы определить угол?, @Mikael Patel
Да, мне очень жаль, что я это имел в виду. Но разве нет лучшего выхода: около 4 метров - это большое расстояние между двумя микрофонами...может быть, как-то увеличить разрешение? пропорционально ли разрешение тактовой частоте микроконтроллера @MikaelPatel?, @geek101
Давайте [продолжим это обсуждение в чате] (https://chat.stackexchange.com/rooms/77122/discussion-between-jai-mahajan-and-mikael-patel )., @geek101
Вот некоторая информация, которая может помочь вам с проектированием: https://ese.wustl.edu/ContentFiles/Research/UndergraduateResearch/CompletedProjects/WebPages/fl09/rms3/Introduction.htm Пожалуйста, помните, что максимальная частота дискретизации Arduino составляет ок. 9 K выборок в секунду при сборе всех выборок на Arduino перед обработкой., @Mikael Patel
Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что ограничения Arduino означают, что он не является полезной частью практического решения проблемы. Кроме того, плата MCU здесь совершенно не нужна; вместо того, чтобы использовать Arduino, вы должны просто направить два микрофона на стереомикрофонные входы ПК, и, конечно же, у Matlab есть какая-то возможность или плагин, который может захватывать звук оттуда. Если ваш компьютер не имеет стереомикрофонных входов, найдите подходящее решение этой проблемы, например стерео USB аудио АЦП (будьте осторожны, дешевые из них моно, и вы не можете использовать два для этого)., @Chris Stratton
@ChrisStratton Я хотел создать что-то пригодное для носки для локализации исходного кода. Кроме того, я не думаю, что смогу подключить микрофоны MEMs к ноутбуку., @geek101
Если вы создаете носимый компьютер, вы не можете использовать matlab для обработки. Iit не работает на Arduino. или вам придется использовать встроенную систему (которая может сработать). Выполнение обработки на Arduino может быть более серьезной проблемой, в зависимости от логики., @chrisl
Вы можете абсолютно точно подключить аналоговые выходные MEMS-микрофоны к ноутбуку с аналоговым стереовходом; для цифровых выходов вам понадобится подходящий чип USB-интерфейса. MCU ARM более высокого класса мог бы это сделать, но не Arduino на базе ATmega. Даже если ваша цель - сделать что-то пригодным для носки, сначала вы должны получить опыт работы с * алгоритмами * на ПК. Затем перенесите алгоритм на SoC типа смартфона или, возможно, на высококачественную голую металлическую часть РУКИ (или, если это ваши предпочтения, возможно, на dsPIC)., @Chris Stratton
@ChrisStratton спасибо за совет. Не могли бы вы подсказать мне подходящее и разумное аналоговое стереовходное устройство / разъем, который я могу купить для двух микрофонов mems (https://www.sparkfun.com/products/9868 )., @geek101
Выбор периферийных устройств ПК на самом деле не по теме. Просто убедитесь, что вы получаете что-то, что имеет фактический стереовход; дешевые ключи, как правило, являются только монофоническим входом, либо с каналами, закороченными вместе, либо только с одним подключенным (но будут иметь "стерео" в названии, как и их выходная сторона). Вы можете попробовать аудио-ориентированные форумы для получения рекомендаций., @Chris Stratton
@ChrisStratton Я задал вопрос в sound stackexchange - https://sound.stackexchange.com/questions/44280/connecting-two-mems-mics-to-laptop-for-sound-source-localization, @geek101