このページでは、入出力レイテンシーを測定する一般的な方法について説明します。
出力遅延を測定する
以下に説明するように、精度や実行の容易さの程度はさまざまですが、出力レイテンシを測定するために利用できる手法がいくつかあります。テスト環境の例については、 「テスト回路」も参照してください。
LEDとオシロスコープのテスト
このテストでは、デバイスの LED インジケーターに関連する遅延を測定します。実稼働デバイスに LED が搭載されていない場合は、プロトタイプのフォーム ファクター デバイスに LED を取り付けることができます。回路が露出したプロトタイプデバイスの精度をさらに高めるには、1 つのオシロスコーププローブを LED に直接接続して、光センサーの遅延をバイパスします。
実稼働デバイスまたはプロトタイプ デバイスに LED を取り付けることができない場合は、次の回避策を試してください。
- 同じ目的に汎用入出力 (GPIO) ピンを使用します。
- JTAG または別のデバッグ ポートを使用します。
- 画面のバックライトを使用します。バックライトには無視できない遅延があり、遅延の読み取りが不正確になる可能性があるため、これは危険である可能性があります。
このテストを実施するには:
- 音声を出力すると同時に LED を定期的にパルスするアプリを実行します。
注:有益な結果を得るには、テスト アプリで正しい API を使用し、高速オーディオ出力パスを実行することが重要です。バックグラウンドの遅延を削減するための設計を参照してください。
- LEDの隣に光センサーを配置します。
- デュアルチャンネル オシロスコープのプローブを有線ヘッドフォン ジャック (ライン出力) と光センサーの両方に接続します。
- オシロスコープを使用して、ライン出力信号と光センサー信号の観測間の時間差を測定します。
LED 遅延と光センサー遅延が両方ともゼロであると仮定した場合、時間の差はおおよそのオーディオ出力遅延です。通常、LED と光センサーの遅延はそれぞれ 1 ミリ秒以下のオーダーで比較的低く、無視できるほど十分に低いです。
往復遅延を測定する
往復遅延は、出力遅延と入力遅延の合計です。
ラーセンテスト
最も簡単な遅延テストの 1 つは、オーディオ フィードバック (ラーセン効果) テストです。これは、インパルス応答ループのタイミングを計ることにより、出力と入力の遅延を組み合わせた大まかな測定値を提供します。このテストは、テストの性質上、それ自体では詳細な分析にはあまり役に立ちませんが、他のテストを調整したり、上限を確立したりする場合には役立ちます。
この方法はコンポーネント時間を分解しません。これは、出力レイテンシと入力レイテンシが独立している場合に重要です。したがって、この方法は、正確な出力レイテンシまたは入力レイテンシの値を単独で測定する場合には推奨されませんが、大まかな推定値を確立する場合には役立つ可能性があります。
デバイス上のスピーカーへの出力遅延は、ヘッドセット コネクタへの出力遅延よりも大幅に長くなる可能性があります。これはスピーカーの補正と保護によるものです。
このテストを実施するには:
- マイクから音声をキャプチャし、キャプチャしたデータをすぐにスピーカーで再生するアプリを実行します。
- マイクのそばで鉛筆をたたくなど、外部で音を作成します。このノイズによりフィードバック ループが発生します。あるいは、ソフトウェアを使用してループにインパルスを注入することもできます。
- フィードバック パルス間の時間を測定して、出力レイテンシ、入力レイテンシ、アプリケーション オーバーヘッドの合計を取得します。
ラーセン テスト用のアプリを入手するためのリソースは次のとおりです。
- Dr. Rick O'Rang ループバック アプリは、オーディオ フィードバック テスト用の Android アプリです。アプリは Google Play からダウンロードするか、 GitHub からソース コードを取得できます。
- 実装例もslesTestFeedback.cppで公開しました。これはコマンドライン アプリであり、プラットフォーム ビルド環境を使用して構築されます。ただし、コードを他の環境に採用するのは簡単です。
audio_utils
ライブラリにあるノンブロッキングFIFO コードも必要です。
オーディオループバックドングル
Dr. Rick O'Rang オーディオ ループバック ドングルは、ヘッドセット コネクタ上の往復遅延を測定するのに便利です。以下の画像は、ループにインパルスを 1 回注入し、フィードバック ループを発振させた結果を示しています。振動の周期は往復遅延です。特定のデバイス、ソフトウェア リリース、およびテスト条件はここでは指定されていません。示された結果を外挿すべきではありません。
ノイズを減らすためにUSBケーブルを取り外し、安定した発振を得るために音量レベルを調整する必要がある場合があります。
入力レイテンシーを測定する
入力レイテンシは、出力レイテンシよりも測定が困難です。次のテストが役に立つかもしれません。
1 つのアプローチは、まず LED とオシロスコープの方法を使用して出力レイテンシーを決定し、次にオーディオ フィードバック (Larsen) テストを使用して出力レイテンシーと入力レイテンシーの合計を決定することです。これら 2 つの測定値の差は入力レイテンシーです。
もう 1 つの手法は、プロトタイプ デバイスで GPIO ピンを使用することです。外部では、デバイスにオーディオ信号を送信すると同時に GPIO 入力をパルスします。 GPIO 信号とオーディオ データの到着時間の差を比較するアプリを実行します。
レイテンシの短縮
低いオーディオ遅延を達成するには、システム全体で、スケジューリング、割り込み処理、電源管理、およびデバイス ドライバーの設計に特別な注意を払ってください。目標は、プラットフォームのどの部分もSCHED_FIFO
オーディオ スレッドを数ミリ秒以上ブロックしないようにすることです。このような体系的なアプローチを採用することで、オーディオの遅延を短縮し、全体的なパフォーマンスがより予測可能になるという副次的な利点を得ることができます。
オーディオアンダーランが発生した場合、多くの場合、特定の条件下でのみ、またはトランジションでのみ検出可能です。新しいアプリを起動したり、さまざまなディスプレイをすばやくスクロールしたりして、システムに負荷をかけてみてください。ただし、テスト条件によっては、設計目標を超えてしまうほどストレスがかかるものがあることに注意してください。たとえば、バグレポートを取得するとシステムに非常に大きな負荷がかかるため、その場合アンダーランが発生することは許容される場合があります。
アンダーランをテストする場合:
- 追加の遅延が最小限になるように、アプリ プロセッサの後に DSP を構成します。
- 画面のオンまたはオフ、USB の接続または取り外し、WiFi のオンまたはオフ、Bluetooth のオンまたはオフ、電話とデータ無線のオンまたはオフなど、さまざまな条件下でテストを実行します。
- 聞き慣れた、アンダーランが聞き取りやすい比較的静かな音楽を選択してください。
- 感度を高めるには有線ヘッドフォンを使用してください。
- 「耳の疲れ」を感じないよう、休憩をとりましょう。
アンダーランの根本的な原因が見つかったら、これを利用するためにバッファーの数とサイズを減らします。アンダーランを分析してアンダーランの原因を解決する前に、バッファーの数とサイズを減らすという熱心なアプローチは、フラストレーションを招くだけです。
ツール
systrace
、システムレベルのパフォーマンスの不具合を診断するための優れた汎用ツールです。
dumpsys media.audio_flinger
の出力には、「単純な移動統計」と呼ばれる便利なセクションも含まれています。これには、各オーディオ ミックスと I/O サイクルの経過時間の変動がまとめられています。理想的には、すべての時間測定値が平均または公称サイクル タイムとほぼ等しい必要があります。最小値が非常に低い、または最大値が高い場合は、問題が発生していることを示しています。スケジューリングの遅延または割り込み無効化時間が長い可能性があります。出力の末尾部分は、+/- 3 標準偏差を超える変動を強調表示するため、特に役立ちます。