サンプルレート変換

この記事では、リサンプリングとも呼ばれる Android のサンプルレート変換について説明します。サンプルレート変換関連の用語については、用語をご覧ください。

サンプルレート変換とは、サンプル ストリームを特定のサンプルレートから別のサンプルレートに変更するプロセスです。サンプルレート変換を行うモジュールを、サンプルレート コンバーター(あるいはリサンプラー)と呼びます。リサンプラーでは、元のストリームはソース信号と呼ばれ、リサンプリングされたストリームはシンク信号と呼ばれます。

リサンプラーは、Android のさまざまな場所で使用されます。たとえば、MP3 ファイルは 44.1 kHz のサンプルレートでエンコードされますが、内部で 48 kHz の音声をサポートする Android デバイスで再生する必要があります。この場合リサンプラーは、MP3 出力オーディオを、Android デバイス内で使用される 44.1 kHz のソース サンプルレートから 48 kHz のシンク サンプルレートにアップサンプルします。

リサンプラーの特性は、次のような指標で表すことができます。

  • 信号の全体的な振幅の保持度
  • シンク サンプルレートの制限を受ける信号の周波数帯域幅の保持度
  • リサンプラーを通じた全体的なレイテンシ
  • 周波数に対する一貫した位相と群遅延
  • CPU サイクルまたは電力消費量で表される計算複雑性
  • サンプルレートのソースとシンクの許容比率
  • サンプルレート比率を動的に変更する機能
  • サポートされているデジタル オーディオ サンプル フォーマット

ソース信号の振幅と周波数帯域幅を正確に保持(シンク サンプルレートの制限に従う)し、遅延が最小限で一貫しており、計算複雑性が最小で、任意の動的な変換率を受け入れ、すべての一般的なデジタル オーディオ サンプル形式をサポートするリサンプラーが理想です。実際はこういったリサンプラーは存在せず、これらの特性の中で妥協することになります。たとえば、品質目標の理想値は、短い遅延や低い複雑性といった特性に相反します。

Android にはさまざまなオーディオ リサンプラーが含まれているため、アプリのユースケースと負荷に応じて適度に妥協できます。利用可能なリサンプラーについては、リサンプラーの実装をご覧ください。

リサンプラーの実装

利用可能なリサンプラーの実装は頻繁に変更され、また OEM によりカスタマイズされることもあります。デフォルトのリサンプラーを次に示します(信号歪みで降順、計算複雑性で昇順)。

  • リニア
  • キュービック
  • 元の係数による sinc
  • 係数を修正した sinc

通常、高品質の音楽を再生するには sinc リサンプラーが適しており、品質が重要でない場合(キーのクリック音など)は他のリサンプラーを使用します。

特定のリサンプラーを選択した場合の実装は、ユースケース、負荷、システム プロパティ af.resampler.quality の値に応じて異なります。詳細については、AudioFlinger のオーディオ リサンプラーのソースコードをご覧ください。