2012-01-12 129 views
3

我正在使用AudioRecord.read將PCM數據捕獲爲字節。 但是,我發現它限制使用至少3904個緩衝區初始化AudioRecord對象。如果採樣率爲44100. 由於我需要對數據執行FFT,所以我將樣本數增加到了4096.因此,回調每40-60ms運行一次setPositionNotificationPeriod爲500.由於進一步減少持續時間並不會導致數據丟失,不做任何改變。 我是wondoring,如果它是下面的配置最快的回調時間?Android中的實時音頻處理

採樣率:44100

通道:單聲道

編碼:PCM 16位

BUFFERSIZE:4096

(如果林不知道它是4096或2048,因爲我讀了4096個字節每次只能填充2048個2字節緩衝區)

甚至40-60ms是可以接受的,然後我執行FFT,最終阻止每個回調大約200-300ms。還有很多影響精度的噪音。我使用這些源代碼:FFT in JavaComplex class

是否有任何其他選擇執行快速,可靠和消耗更少的內存處理FFT? 我發現上面的類新增了太多的對象,並彈出了大量的gragarbage集合的消息。

在最後,我有3個問題:

  1. 是初始緩衝區大小等於我可以從.read方法讀取的緩衝區?
  2. 40-60ms是以44100採樣率捕捉音頻數據的限制嗎?
  3. 您能否推薦一些FFT庫,以便在處理FFT時可以獲得更好的性能? (我認爲如果使用C代碼庫更好?)

對不起,我的英語不好,也謝謝你花在我的問題上的時間。

P.S我在iOS上嘗試過它,它可以只需要44100採樣率的512個採樣。所以每個回調只需要大約10ms。

+0

接近我的問題:http://stackoverflow.com/questions/3069617/android-signal-analysis-some-filters – 2012-01-12 10:01:51

+0

@丹,好問題。我正在嘗試做一些信號處理以及實時。採樣率和其他輸入配置是相同的。我的問題是,我處理傳入樣本的時間太長,即兩次後續讀取之間的時間非常短。我想知道你是否有類似的問題,以及你如何解決這個問題。 TIA – 2012-03-04 07:54:07

+0

您的意思是您的計算耗時過長,因此您無法在兩個回調中完成該過程? 我相信音頻處理方法不應該花太長的時間,否則你可能無法處理每個回調中的每個緩衝區。 此外,儘可能少的對象,你可以。所以你可以消除CPU繼續處理內存管理過程。 – Dan 2012-03-22 10:46:23

回答

0

關於問題3:可能不如原生庫那麼快,但我已經開始使用這些類,並且它們似乎適用於實時工作(儘管我從文件而不是麥克風讀取) :FFTPack

最常見的本地庫是KissFFT,您可以在libGDX中找到它爲Android編譯。