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 JavaとComplex class
は、高速で信頼性が高く、少ないメモリ処理FFTを消費を実行し、他の選択肢はありますか? 私は、上記のクラスが新しいオブジェクトを大量に追加し、グーグル・リビッド・コレクションのメッセージのロードをポップアップすることがわかりました。
では、私は3つの質問があり、結論:
- 私は.readメソッドから読み取ることができ、バッファに等しい初期bufferSizeのはありますか?
- 44-サンプリングレートでオーディオデータをキャプチャするのに40-60msの制限がありますか?
- FFT処理のパフォーマンスが向上するようにFFTライブラリを提案してもらえますか? (私はCコードライブラリを使用する方が良いと思う?)
私の悪い英語のために申し訳ありません、また私の質問に時間を費やしていただきありがとうございます。
P.S iOSで試したところ、44100のサンプリングレートで512サンプルしか使用できませんでした。したがって、すべてのコールバックには約10msしかかかりません。
私の質問に近いです:http://stackoverflow.com/questions/3069617/android-signal-analysis-some-filters –
@ダン、良い質問。私はリアルタイムでいくつかの信号処理もしようとしています。サンプルレートとその他の入力設定は同じです。私の問題は、着信サンプルを処理するには時間がかかりすぎる、つまり、2回の後続の読み取りの間の時間が非常に短いということです。私は、あなたが似たような問題を抱えていて、これを解決する方法を知りたいと思っていました。 TIA –
計算が長すぎると、2回のコールバックで処理を完了できないことになりますか? 私は、音声処理の方法が長すぎるとは限りません。そうしないと、すべてのコールバックですべてのバッファを処理できないことがあります。 また、あなたができるほどオブジェクトとして新しい。したがって、CPUがメモリ管理プロセスを処理し続けることを排除できます。 – Dan