利用手機揚聲器發射特定頻率聲波(如 8-9kHz,非 Hz),另一手機麥克風接收,通過飛行時間差 (TOF, Time of Flight) 計算距離:
距離 = 聲速 × 時間差 / 2 (往返需除 2;單向同步時鐘則不除)
| 環節 | 挑戰 | 解決方案 |
|---|---|---|
| 發射端 | 精確生成頻率、避免音頻壓縮失真 | AudioTrack 原始 PCM 數據生成正弦波/Chirp 信號 |
| 傳播環境 | 多徑效應、背景噪音、多普勒頻移 | 相關性檢測、頻域濾波、Chirp 調頻信號抗多徑 |
| 接收端 | 精確檢測到達時間、同步時鐘 | 互相關峰值檢測、NTP/同步信號校準、雙向測距消除時鐘偏移 |
| 跨設備 | 不同手機揚聲器/麥克風頻響差異大 | 校準流程、自適應閾值、信噪比評估 |
// 發射:AudioTrack (MODE_STATIC 或 MODE_STREAM)
AudioTrack track = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(44100)
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.build())
.setBufferSizeInBytes(bufferSize)
.setTransferMode(AudioTrack.MODE_STREAM)
.build();
// 寫入生成的正弦波/Chirp 字節數組
track.write(audioData, 0, audioData.length, AudioTrack.WRITE_BLOCKING);
track.play();
// 接收:AudioRecord
AudioRecord recorder = new AudioRecord.Builder()
.setAudioSource(MediaRecorder.AudioSource.MIC)
.setAudioFormat(format)
.setBufferSizeInBytes(minBufferSize)
.build();
recorder.startRecording();
// 讀取數據進行互相關運算...
| 技術 | 精度 | 距離 | 功耗 | 適用性 |
|---|---|---|---|---|
| UWB (超寬頻) | 10-30cm | 200m | 中 | 高精度定位、AirTag/智能鎖 |
| Bluetooth RSSI | 1-5m | 50m | 低 | 粗略近距感知 |
| WiFi RTT (802.11mc) | 1-2m | 100m | 中高 | 室內定位 |
| 聲波 (雙手機) | 0.5-2m | 10m | 高(持續錄音) | 特定近距交互、教學演示 |
聲波測距在雙手機場景下技術可行但工程落地極難,精度難以滿足實際產品需求。建議:
chirp-android