1

С одной стороны с моим Android-смартфоном Я записываю аудиопоток с помощью AudioRecord.read(). Для записи я использую следующие функцииCross Correlation: Android AudioRecord создает образцы данных для TDoA

  • SampleRate: 44100 Гц
  • одноканальной
  • ИКМ-16Bit
  • размер массива я использую для AudioRecord.read(): 100 (короткий массив)
    • , используя этот небольшой размер, позволяет читать каждые 0,5 мс (среднее значение), поэтому я могу использовать эту временную метку позже для мультилатерации (по крайней мере, я так думаю :-)). Может быть, это будет устаревшим, если я смогу использовать кросс-корреляцию, чтобы определить TDoA?!? (Смотри ниже)

С другой стороны, у меня три громкоговорителя излучающих различные звуки, используя WebAudio API и следующие характеристики

  • FREQ1: 17500 Гц
  • Freq2: 18500 Гц
  • freq3: 19500 Гц
  • сигнала длина: 200 мс + замирание и исчезать из узла усиления 5 мс, так что в сумме 210ms

Моя цель - определить разницу во времени прибытия (TDoA) между излучаемыми звуками. Поэтому на каждой итерации я прочитал 100 байт из буфера AudioRecord, а затем хочу определить разницу во времени (если я нашел один из моих звуков). До сих пор я использовал простой частотный фильтр (используя fft), чтобы определить TDoA, но это действительно неудивительно в реальном мире.

До сих пор я выяснил, что я могу использовать взаимную корреляцию, чтобы определить значение TDoA еще лучше (http://paulbourke.net/miscellaneous/correlate/ и некоторые темы здесь, на SO). Теперь моя проблема: на данный момент я думаю, что мне нужно сопоставить записанный сигнал (мой короткий массив) с генерируемым сигналом каждого из моих трех звуков выше. Но я изо всех сил пытаюсь создать этот сигнал. Используя код, найденный в (http://repository.tudelft.nl/view/ir/uuid%3Ab6c16565-cac8-448d-a460-224617a35ae1/ раздел B1.1. GenTone()), не ясно решает мою проблему, потому что это приведет к тому, что массив будет больше, чем мои записанные образцы. И до сих пор я знаю, что для кросс-корреляции нужны два массива одинакового размера для работы. Итак, как я могу сгенерировать массив образцов?

Другой вопрос: размышление о том, как определить TDoA до сих пор правильно?

ответ

0

Вот некоторые уроки, которые я узнал в последние дни:

  • можно либо использовать кросс-корреляции (xcorr) или метод распознавания частоты для определения РВП. Последнее гораздо более неточно. Поэтому я сосредотачиваюсь на xcorr.
  • Я могу достичь TDoA, применив xcorr на мой записанный сигнал и два опорных сигнала. Например. моя запись имеет длину 1000 образцов. С xcorr я распознаю звук A на образце 500 и звук B на образце 600. Поэтому я знаю, что они имеют разницу во времени в 100 отсчетах (которые могут быть преобразованы в секунды в зависимости от частоты дискретизации).

Для этого я генерирую линейный чирп (чириканье лучше, чем простые волны sin (см. Литературу)), используя this code found on SO.Для легкого примера и проверки того, работает ли мой эксперимент, я сохраняю свою запись так же, как и мои сгенерированные звуковые сигналы, такие как .wav-файлы (есть много примеров кода, как это сделать). Затем я использую MatLab как простой способ вычисления xcorr: see here

Еще один момент: «Ввод xcorr должен быть того же размера?» Я совершенно не уверен в этой части, но я думаю, что это нужно сделать. Мы можем достичь этого путем нулевого заполнения двух сигналов на одну длину (предпочтительнее мощность двух, поэтому мы можем использовать эффективную реализацию FFT Radix-2), а затем использовать FFT для вычисления xcorr (см. Еще одну ссылку из SO)

Надеюсь, это пока правильно и охватывает некоторые вопросы других людей :-)