2

アイデアは、電話機 A が音声信号と Bluetooth 信号を同時に送信し、電話機 B が 2 つの信号間の遅延を計算するというものです。

実際には、90 ミリ秒から 160 ミリ秒の遅延で一貫性のない結果が得られます。可能な限り両端を最適化してみました。

出力側:
Bluetooth とオーディオ出力がそれぞれ独自のスレッドを持つと、トーンが生成されます
。Bluetooth は、AudioTrack.write と AudioTrack がストリーミング モードになった後にのみ出力されるため
、書き込みが完了する前に出力を開始する必要があります。

受信側:
ここでも 2 つの別個のスレッド
システム時間が各 AudioRecord.read の前に記録されます。

サンプリング仕様:
44.1khz
バッファ全体を読み取る fft を
使用して一度に 100 サンプルをサンプリング
最初の read() 以降に変換されたサンプル数を考慮に入れる

4

2 に答える 2

7

あなたの方法は、パイプライン全体で基本的にゼロ レイテンシーに依存していますが、これは現実的に不可能です。その程度の精度で同期することはできません。遅延を 5 ~ 6 ミリ秒に抑えることができれば、それは可能かもしれませんが、そうなる前にキーボードに頭をぶつけるでしょう。それでも、1.5 メートル程度の精度しかない可能性があります。

受信している遅延の下限を考慮してください。90ms で、音は30m をわずかに超えて移動します。これは、理想的ではない送信状態になる可能性があることを考慮しなくても、市販されているbluetooth の範囲の最後です。

これは、Android での低遅延オーディオについて議論しているスレッドです。TL;DRは、それが悪いということですが、良くなっています. 最新の API と最近のデバイスを使用すると、手動で調整されたオーディオ関数を実行すると仮定して、30 ミリ秒程度まで下げることができる場合があります。ここには単純な AudioTrack はありません。それでも、それでも 10 メートルの円形エラーの確率は良好です。

編集:

デバイスのクロックを同期できると仮定すると、より良いアプローチは、単純な am/fm 変調またはパルス列を使用して、タイムスタンプをオーディオ信号に埋め込むことです。次に、相手側でそれをデコードして、いつ送信されたかを知ることができます. レイテンシの問題に対処する必要はありますが、全体がうまく単純化されます。ブルートゥースは、それ自体に遅延の問題があると見なすことができるため、実際には信頼できるクロックではないため、Bluetooth はまったく必要ありません。

于 2013-03-04T22:44:24.587 に答える
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 は鎮静剤で、lambda が与えられます (1kHz から数えることができます)。 、ただのアイデア、私があなただったらどうするか.

于 2013-03-04T22:50:30.830 に答える