5

Android用に開発しようとしているアプリケーションは、48Khz (PCM 16bits & mono) でフレームを記録し、ネットワークに送信します。また、8Khz でオーディオの入力ストリームがあります。そのため、8Khz のサンプル フレームを受信して​​再生します (私の AudioTrack オブジェクトは 8Khz に設定されています) が、それらを再生するとすべてが機能しますが、遅延が非常に大きくなります。何かが聞こえるまで約3秒かかります。

受信したフレームを 8Khz から 48Khz にアップサンプリングして再生すれば、それほど大きな再生遅延は発生しないと思います。実際、フレームを同じレートで記録して再生すると、レイテンシーは非常に低くなります。悪い点は、48Khz で送信し、8Khz で受信するという方法を余儀なくされていることです。

前に説明したように、サウンド フレーム (16 ビット PCM) を 8Khz から 48Khz にアップサンプリングしようとしています。これを行うJavaのルーチン/ライブラリ/ APIを知っている人はいますか???

目立たない信号のアップサンプリングの基本は知っていますが、独自の FIR フィルターを設計して実装し、それをオーディオ ストリームとたたみ込むのは、やりすぎだと思います。また、それは私の知識を超えています。

それで...誰かがこれで私を助けることができますか?? 私が使用できるJavaのライブラリ/ルーチンを知っている人はいますか?? 提案や代替案はありますか??

4

4 に答える 4

5

迅速で汚い解決策は線形補間です。常に6倍のサンプリングを行っているので、これは非常に簡単です。

これは多少このように機能します(Cコードであり、テストされていません。最後の反復を適切に処理していませんが、私が思う考えを示しています)。

void resample (short * output, short * input, int n)
{
  // output ought to be 6 times as large as input (48000/8000).

  int i;
  for (i=0; i<n-1; i++)
  {
    output[i*6+0] = input[i]*6/6 + input[i+1]*0/6;
    output[i*6+1] = input[i]*5/6 + input[i+1]*1/6;
    output[i*6+2] = input[i]*4/6 + input[i+1]*2/6;
    output[i*6+3] = input[i]*3/6 + input[i+1]*3/6;
    output[i*6+4] = input[i]*2/6 + input[i+1]*4/6;
    output[i*6+5] = input[i]*1/6 + input[i+1]*5/6;
  }

線形補間では優れた音質は得られませんが、安価で高速です。必要に応じて、3次補間を使用してこれを改善できます。

高速で高品質のリサンプリングが必要な場合は、Android-NDKを使用してlibresampleなどのacリサンプリングライブラリをコンパイルし、JNIを使​​用してJavaから呼び出すことをお勧めします。それははるかに速くなります。JNIコードを書くことは、ほとんどの人が敬遠することですが、それは非常に簡単です。NDKにはこのための例がたくさんあります。

http://www.mega-nerd.com/SRC/index.html

于 2010-07-15T23:02:23.347 に答える
2

線形補間はアーティファクトをもたらします。高品質のリサンプリングを備えた素晴らしいJavaライブラリがあります-JSSRC(http://jssrc.khadkevich.org/)。

コードはGithubで利用できるようになりました: https ://github.com/hutm/JSSRC

于 2013-02-28T15:33:24.297 に答える