2012-01-12 24 views
3

AudioRecord.readを使用してPCMデータをバイトにキャプチャしています。 しかし、少なくとも3904のバッファでAudioRecordオブジェクトを初期化することが制限されていました。サンプリングレートが44100の場合 データのFFTを実行する必要があるので、サンプルを4096に増やす必要があります。 結果として、コールバックはsetPositionNotificationPeriodで40-60msごとに500に実行されます。変更を加えないでください。 以下の設定で最も速いコールバック時間ですか?Androidでのリアルタイムオーディオ処理

サンプリングレート:44100

チャンネル:モノラル

エンコード:PCM 16ビット

たBufferSize:4096

(それは私が4096のバイトを読んで以来、4096または2048であるイムかわからない場合毎回2048バイトのバッファを満たすことができます)

でも40-60msであっても、FFTを実行して最終的に各コールバックをブロックします約200~300ms。また、精度に影響するノイズはまだまだたくさんあります。 私は、これらのソースコードを使用しています:FFT in JavaComplex class

は、高速で信頼性が高く、少ないメモリ処理FFTを消費を実行し、他の選択肢はありますか? 私は、上記のクラスが新しいオブジェクトを大量に追加し、グーグル・リビッド・コレクションのメッセージのロードをポップアップすることがわかりました。

では、私は3つの質問があり、結論:

  1. 私は.readメソッドから読み取ることができ、バッファに等しい初期bufferSizeのはありますか?
  2. 44-サンプリングレートでオーディオデータをキャプチャするのに40-60msの制限がありますか?
  3. FFT処理のパフォーマンスが向上するようにFFTライブラリを提案してもらえますか? (私はCコードライブラリを使用する方が良いと思う?)

私の悪い英語のために申し訳ありません、また私の質問に時間を費やしていただきありがとうございます。

P.S iOSで試したところ、44100のサンプリングレートで512サンプルしか使用できませんでした。したがって、すべてのコールバックには約10msしかかかりません。

+0

私の質問に近いです:http://stackoverflow.com/questions/3069617/android-signal-analysis-some-filters –

+0

@ダン、良い質問。私はリアルタイムでいくつかの信号処理もしようとしています。サンプルレートとその他の入力設定は同じです。私の問題は、着信サンプルを処理するには時間がかかりすぎる、つまり、2回の後続の読み取りの間の時間が非常に短いということです。私は、あなたが似たような問題を抱えていて、これを解決する方法を知りたいと思っていました。 TIA –

+0

計算が長すぎると、2回のコールバックで処理を完了できないことになりますか? 私は、音声処理の方法が長すぎるとは限りません。そうしないと、すべてのコールバックですべてのバッファを処理できないことがあります。 また、あなたができるほどオブジェクトとして新しい。したがって、CPUがメモリ管理プロセスを処理し続けることを排除できます。 – Dan

答えて

0

質問3:ネイティブライブラリほど高速ではないかもしれませんが、これらのクラスを使用し始めましたが、リアルタイム作業ではうまくいくようです(マイクではなくファイルから読み込んでいますが) :FFTPack

最も一般的なネイティブライブラリは、libGDXの一部としてAndroid用にコンパイルされたKissFFTです。

関連する問題