2013-03-04 3 views
2

아이디어는 전화 A가 동시에 소리 신호와 블루투스 신호를 보내고 전화 B가 두 신호 간의 지연을 계산한다는 아이디어입니다.Android 두 장치 사이의 거리를 사용하여 거리 얻기

실제로 90ms-160ms의 지연으로 일관성없는 결과가 나타납니다. 가능한 한 양 끝을 최적화하려고했습니다. 출력단에서

:
톤 한번 발생 블루투스 오디오 출력 각각은
가 기록되기 전에 출력하기 시작해야하므로 AudioTrack.write 및 AudioTrack 스트리밍 모드에 있고 자신의 스레드
블루투스 만 출력이 심지어 완료되었습니다. 수신단에서

:
다시 두 개의 스레드
시스템 시간마다 AudioRecord.read

샘플링 사양 전에 기록된다
44.1kHz의

샘플링 100 샘플 한번에 전체 버퍼 읽기 fft 사용
초기 읽기() 이후 변환 된 샘플 수를 고려하십시오.

+0

질문을 명확히하고 확장하면 더 나은 응답을 얻을 수 있습니다. 정확히 무엇을 묻고 있는지 말하기는 어렵습니다. – FoamyGuy

+1

소리는 331 미터/1000ms 또는 3.31 미터/10ms로 이동합니다. 무엇이 상용화 된 장치로 블루투스 신호와 오디오 신호를 수신 할 수 있다고 생각하니? –

+0

이 상용 장치는 1.4GHz의 작동 주파수를 가지고 있으며 빛이 1 피트를 여행하기 전에 4CPU 사이클을 실행합니다. 사이클은 똑같은 명령을하지는 않지만 매우 천천히 (발 당 1ms) ~ 1400000CPU주기의 타이밍을 내고 있습니다 – user624056

답변

6

Y 우리의 방법은 전체 파이프 라인에 걸쳐 기본적으로 대기 시간을 사용하지 않기 때문에 현실적으로 불가능합니다. 그 정도의 정확도로는 동기화 할 수 없습니다. 지연 시간을 5-6ms로 줄일 수 있다면 가능할 수도 있지만, 그렇게되기 전에 머리를 키보드로 두 드릴 것입니다. 심지어 1.5 미터 정도의 정확도 일 수도 있습니다.

수신하는 지연의 하단을 고려하십시오. 90ms에서 소리는 slightly over 30m을 여행 할 수 있습니다. 블루투스 제품인 의 끝 부분인데, 심지어 비 이상적인 전송 조건에 놓여있을 가능성도 고려하지 않은 채 블루투스 범위 인 범위입니다.

Here's a thread Android에서 낮은 대기 시간 오디오에 대해 논의합니다. TL, DR은 짜증나지만 나아지고 있습니다. 최신 API 및 최신 장치를 사용하면 은 손으로 조정 한 오디오 기능을 실행한다고 가정 할 때 30ms 정도까지 내려갈 수 있습니다. 간단한 AudioTrack은 여기에 없습니다. 그럼에도 불구하고, 그것은 여전히 ​​좋은 10m 원형 오류 확률입니다.

편집 : 간단한 AM/FM 변조 또는 펄스 트레인을 사용하여 오디오 신호에 타임 스탬프를 포함하는 것, 디바이스의 클럭을 동기화 할 수 있습니다 가정

더 나은 방법. 그런 다음 상대방을 해독하여 전송 시점을 알 수 있습니다. 여전히 대기 시간 문제를 처리해야하지만, 모든 것을 멋지게 단순화합니다. 블루투스가 필요하지 않습니다. 어쨌든 실제로는 신뢰할 수있는 시계가 아니기 때문에 대기 시간 문제가있는 것으로 간주 될 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 소리가 끊임없이 녹음되고 있으며 2048을 읽으려면 44-48ms가 걸립니다. 샘플은 46ms에 매우 가깝습니다. fft는 0-1ms가 소요됩니다. 나는 90ms 대기 시간이 어디서 오는지 알지 못한다. 현재 사운드를 통해 비트를 보내고 있으므로 타임 스탬프를 보낼 수 있지만 시계를 동기화하지 않으려합니다. 블루투스 하드웨어/오버 헤드가 너무 느리지 만 매우 빠르면이 접근법이 필요하다고 생각합니다. – user624056

+1

코드가 "재생"되고 실제로 소리가 스피커에서 나올 때까지 얼마나 걸리나요? 마이크 쪽과 동일합니다. 이는 대부분의 오디오 응용 프로그램에서 가장 큰 지연 원인 중 하나이며 일반적으로 일관성이 없으므로이를 보완하기가 어렵습니다. 사실 468ms에서 2048 샘플을 기록한다고해서 그 샘플이 언제 전화에 도착했는지 확신 할 수 없다면별로 의미가 없습니다. 어떤 접근 방식이든이를 극복해야하지만 안드로이드에서는 오디오 지연이 악명 높습니다. – Geobits

+0

setPlaybackPositionUpdateListener 사용하기 함수가 호출되기 전에 약 14ms의 지연이 발생합니다. 나는 그 기능 외에 지연을 측정 할 방법이 없다. – user624056

1

이 당신에게 아주 좋은 방법 http://netscale.cse.nd.edu/twiki/pub/Main/Projects/Analyze_the_frequency_and_strength_of_sound_in_Android.pdf

을 제공합니다 당신은 (dB에서 측정) 약간의 진폭과 1 kHz의 사운드를 만들고 소리의 진폭이 다른 장치에 도착 측정하려고합니다. 진정 작용으로 거리를 측정 할 수 있습니다.

내가 기억하는 것처럼 : a0 = 20 * log (4 * pi * distance/lambda) 여기서 a0는 진정 작용이 있고 람다가 주어집니다 (1kHz에서 계산할 수 있습니다). 그런 민감한 환경에서, 모든 것을 망칠 수도 있고, 단지 생각 일 수도 있습니다. 내가 당신이라면 어떻게 할 것입니다.

+2

나는 이것이 블루투스 신호 강도를 사용하는 것보다 부정확 할 것이라고 생각합니다. – user624056

+0

아마도 그렇습니다. 그러나 대기 시간에 대해 걱정할 필요가 없습니다. 단지 1kHz의 주파수 사운드를 끊임없이 내보내고 특정 시간 동안 진정을 측정해야하기 때문입니다. 평균화는 좋은 생각 일 수 있습니다. –