Android Получение расстояния с помощью звука между двумя устройствами

Идея заключается в том, что телефон А отправляет звуковой сигнал и сигнал Bluetooth одновременно, а телефон Б вычисляет задержку между двумя сигналами.

На практике я получаю противоречивые результаты с задержками от 90 до 160 мс. Я попытался максимально оптимизировать оба конца.

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

На принимающей стороне:
Снова два отдельных потока
Системное время записывается перед каждым AudioRecord.read

Спецификации выборки:
44,1 кГц
Чтение всего буфера
Выборка 100 выборок за раз с использованием fft
Принимая во внимание, сколько выборок было преобразовано с момента первоначального чтения()


person user624056    schedule 04.03.2013    source источник
comment
Вероятно, вы получите лучший ответ, если уточните и расширите свой вопрос. Трудно сказать, что именно вы спрашиваете.   -  person FoamyGuy    schedule 05.03.2013
comment
Звук распространяется со скоростью 331 метр/1000 мс или 3,31 м/10 мс. Что заставляет вас думать, что вы можете синхронизировать приход сигнала Bluetooth и аудиосигнала с коммерческим устройством?   -  person Morrison Chang    schedule 05.03.2013
comment
Тот факт, что это коммерческое устройство имеет рабочую частоту 1,4 ГГц и будет выполнять 4 такта процессора, прежде чем свет пройдет 1 фут. Циклы не равны командам, но я измеряю задержку звука, которая очень медленная (1 мс на фут) ~ 1400000 циклов процессора.   -  person user624056    schedule 05.03.2013


Ответы (2)


Ваш метод основан на практически нулевой задержке во всем конвейере, что практически невозможно. Вы просто не можете синхронизировать его с такой степенью точности. Если бы вы могли уменьшить задержки до 5-6 мс, это могло бы быть возможно, но вы убьете свою голову в клавиатуру, прежде чем это произойдет. Даже тогда точность могла быть только до 1,5 метра или около того.

Рассмотрите нижний предел задержек, которые вы получаете. За 90 мс звук может пройти чуть более 30 м. Это самый конец продаваемого диапазона Bluetooth, даже не учитывая, что вы, вероятно, будете в неидеальных условиях передачи.

Вот тема, посвященная звуку с низкой задержкой в ​​Android. TL;DR в том, что это отстой, но становится лучше. С последними API и новейшими устройствами вы можете сократить время до 30 мс или около того, если вы запускаете некоторые аудиофункции, настроенные вручную. Здесь нет простого AudioTrack. Даже тогда это все еще хорошая вероятность круговой ошибки на 10-метровом расстоянии.

Изменить:

Лучшим подходом, предполагающим, что вы можете синхронизировать часы устройств, было бы встроить метку времени в аудиосигнал, используя простую модуляцию am/fm или последовательность импульсов. Тогда вы могли бы расшифровать его на другом конце и узнать, когда оно было отправлено. Вам по-прежнему приходится иметь дело с проблемой задержки, но это все упрощает. Bluetooth вообще не нужен, так как в любом случае это ненадежные часы, поскольку можно считать, что у них есть собственные проблемы с задержкой.

person Geobits    schedule 04.03.2013
comment
Спасибо за ответ. Звук записывается постоянно, и я рассчитал время записи звука, которое занимает 44-48 мс, чтобы прочитать 2048 сэмплов, что очень близко к 46 мс, которые должны быть. FFT занимает 0-1 мс. Я не понимаю, откуда берется задержка в 90 мс. В настоящее время я отправляю биты через звук, поэтому я могу отправить метку времени, но я хочу избежать синхронизации часов. Я думаю, что этот подход был бы необходим, если бы оборудование/накладные расходы Bluetooth были слишком медленными, но они очень быстрые. - person user624056; 05.03.2013
comment
Сколько времени проходит между тем моментом, когда ваш код говорит, что воспроизводится, и звуком, который физически исходит из динамика? То же самое со стороны микрофона. Это один из самых больших источников задержки в большинстве аудиоприложений, и, поскольку он обычно непостоянен, его трудно компенсировать. Тот факт, что вы записываете 2048 сэмплов за ~46 мс, не имеет большого значения, если вы не уверены, когда эти сэмплы попали в телефон. С этим придется бороться при любом подходе, но общеизвестно, что задержка звука на Android — это плохо. - person Geobits; 05.03.2013
comment
используя setPlaybackPositionUpdateListener, я получаю задержку около 14 мс перед вызовом функции. У меня нет способа измерить задержку, кроме этой функции. - person user624056; 05.03.2013
comment
Если вы получаете 14 мс, то я не думаю, что это надежный способ измерения задержки. Я провел довольно много исследований по этому поводу в отношении приложения и никогда не видел отчета о такой низкой задержке на любом потребительском устройстве Android. - person Geobits; 05.03.2013
comment
+1: Хороший ответ и хорошо аргументированный. (Встроенная временная метка особенно умна.) - person tom10; 22.03.2013

Это дает вам довольно хороший подход к http://netscale.cse.nd.edu/twiki/pub/Main/Projects/Analyze_the_frequency_and_strength_of_sound_in_Android.pdf

Вы должны создать звук частотой 1 кГц с некоторой амплитудой (измеряемой в дБ) и попытаться измерить амплитуду звука, поступающего на другое устройство. Из успокоительного вы могли бы измерить расстояние.

Насколько я помню: a0 = 20*log (4*pi*расстояние/лямбда), где a0 — седативный эффект, а лямбда дается (можно считать от 1 кГц). Но в такой чувствительной среде шум может все испортить. , просто идея, как бы я поступил на твоем месте.

person Jani Bela    schedule 04.03.2013
comment
Я думаю, что это было бы так же неточно, как использование мощности сигнала Bluetooth. - person user624056; 05.03.2013
comment
Возможно. Но вам не нужно беспокоиться о задержке, так как вам просто нужно начать постоянно издавать звук с частотой 1 кГц и измерять седативный эффект в течение определенного времени. Усреднение может быть хорошей идеей. - person Jani Bela; 05.03.2013