взаимная корреляция двух аналоговых значений на arduino?
Я работаю над окончательным проектом под названием локализация источника звука с использованием Arduino Uno. Я хочу использовать два звуковых датчика для захвата звука. Характер звука - хлопок или речь. Я хочу использовать метод взаимной корреляции, чтобы оценить временную задержку между микрофонами, а затем найти положение и угол. Мой руководитель сказал мне, что вы должны хранить значения в AnalogRead в двух массивах, а затем выполнять перекрестную корреляцию элементов двух массивов. Но я борюсь с перекрестной корреляцией. Буду признателен за любую помощь от вас, ребята.
#define LED_NORTH 2
#define LED_SOUTH 4
#define MIC_NORTH A0
#define MIC_SOUTH A2
/* let's said we want to read 100 samples */
const unsigned int numReadings = 100;
unsigned int analogVals[numReadings];
unsigned int i = 0;
void setup() {
Serial.begin(115200);
pinMode(LED_NORTH, OUTPUT);
digitalWrite(LED_NORTH, LOW);
pinMode(LED_SOUTH, OUTPUT);
digitalWrite(LED_SOUTH, LOW);
}
void loop() {
int north = analogRead(MIC_NORTH);
Serial.println(north);
int south = analogRead(MIC_SOUTH);
Serial.println(south);
/* take numReadings # of readings and store into array */
for(unsigned int i = 0; i < numReadings; i++)
{
analogVals[i] = analogRead(A0);
delay(1000);
}
@yaya, 👍-1
Обсуждение1 ответ
Я не буду прямо отвечать на вопрос, так как думаю, неправильный. Прежде чем задавать вопрос здесь, вы должны сделать ваши исследования и приходят с очень конкретными проблемами, которые вы не можете решить самостоятельно. Я могу ошибаться, но мне кажется, что вы находитесь в очень предварительная стадия, когда вы едва начали думать о проект.
Итак, вместо того, чтобы пытаться ответить на слишком широкий вопрос, я попытаюсь дать некоторые рекомендации, задавая вопросы обратно к вам. Ниже приведен список некоторых проблем и вызовов, которые вам придется рассмотреть для продвижения ваш проект. Возможно, он неполный: это только то, что я могу придумать макушка моей головы. Мы надеемся, что это поможет вам решить правильные проблемы.
Нестерео сэмплирование
Ваш Arduino не поддерживает стереосэмплирование. Так как он имеет только один АЦП, он может сэмплировать только один канал за раз. Это означает, что вам придется попеременно сэмплировать левый канал, затем правый канал, затем левый канал... Так как левый и правый семплы не берутся в то же время это повлияет на то, как вы интерпретируете результат взаимной корреляции. Вы думали о том, как вы будете справиться с этим? Это приемлемо? Придется ли вам вместо этого использовать внешний Чипы АЦП для реального стереосэмплирования?
Низкая частота дискретизации
Если вы используете analogRead()
в тесном цикле, вы берете не более одной выборки
каждые 112 мкс. И так как вы чередуете каналы,
на каждом канале вы получаете одну выборку каждые 224 мкс. это выборка
частота 4,46 кГц и частота Найквиста 2,23 кГц. Это
достаточно быстро для вашего приложения?
За 224 мкс звук распространяется примерно на 76 мм, т. е. пространственное разрешение вашей кросс-корреляции. Как это переводится в угловое разрешение? Удовлетворительно ли это разрешение? Вы планируете использовать методы интерполяции, чтобы попытаться улучшить его?
Если временное разрешение недостаточно хорошее, можно ускорить АЦП на коэффициент 2 или 4 за счет снижения точности. Вам придется копать дальше таблицу данных MCU (или Интернет...), чтобы узнать, как это сделать.
Несовместимая частота дискретизации
При использовании analogRead()
время между последовательными выборками может
зависит от кода, который вы запускаете между последовательными вызовами
аналоговое чтение()
. Это также может зависеть от того, как ваш код прерывается,
скажем, прерывание таймера или прерывание UART, если вы отправляете данные
вне. Непостоянная частота дискретизации — это то, чего следует избегать при
делать взаимные корреляции.
Можно попытаться смягчить эту проблему, выполнив сбор данных с помощью
прерывания отключены. Однако единственный способ гарантировать периодическую
выборка осуществляется путем настройки автоматического запуска АЦП либо
по таймеру или сам по себе (автономный режим). Прохождение этого пути будет
требуют, чтобы вы отказались от удобства библиотеки Arduino (analogRead()
настолько прост в использовании...), и внимательно изучите техническое описание, которое
потребовало бы очень значительных затрат времени.
Есть ли у вас время и энергия для этого? Если вы в конечном итоге выучите все эти низкоуровневые подробности о конфигурации АЦП, будет ли это обучение будет иметь отношение к курсу, для которого это проект?
Конечные массивы данных
Математически взаимная корреляция обычно определяется для бесконечных серии образцов. В вашем эксперименте вам придется иметь дело с конечными массивы, и это имеет тонкое значение. Вы думали о том, как вы будет иметь дело с конечностью массивов? Вы собираетесь обнулять? Удалить среднее значение перед заполнением нулями? Применить оконную функцию?
Надеюсь, теперь стало ясно, что «взаимная корреляционная часть» — это только одна из многих проблем, с которыми вам придется столкнуться. предлагаю обсудить все эти вопросы с вашим руководителем. Возможно, он сможет дать вам совет как с ними бороться, стоит ли, где можно срезать углы...
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
что ты уже испробовал? Покажи нам свой код. Каково его ожидаемое поведение? Каково фактическое поведение?, @Edgar Bonet
спасибо, Эдгар Бонет, я обновляю свой вопрос и публикую свой код, который я сделал до сих пор., @yaya
Код, который вы разместили, неполный. Его нельзя ни скомпилировать, ни протестировать., @Edgar Bonet
Я немного изменю код. Теперь я предполагаю, что могу скомпилировать, @yaya
Не предполагай. Пытаться., @Edgar Bonet
Как только вы узнаете, как работает взаимная корреляция (https://en.m.wikipedia.org/wiki/Cross-correlation), ответ на этот вопрос может вам помочь: https://arduinoprosto.ru/q/11754/ 38721, @Sim Son
вам действительно нужно подумать о том, что вам нужно сделать ... ваш код указывает, что вы еще этого не сделали ... в блоке loop () вы читаете значение с северного микрофона, затем тратите время на печать, затем вы читаете значение с южного микрофона, потом тратите некоторое время на печать .... зачем вы это делаете? ....... в цикле for вы считываете значение с северного микрофона и сохраняете значение, затем делаете паузу на одну секунду и повторяете .... почему вы делаете паузу? ....почему ты не читаешь южный микрофон одновременно?, @jsotola
Если вам нужно найти направление звука на полных 360 градусов, вам понадобится как минимум 3 микрофона. В противном случае вы не сможете определить, находится ли источник звука прямо спереди или сзади., @MatsK