我正在使用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 Java和Complex class
是否有任何其他選擇執行快速,可靠和消耗更少的內存處理FFT? 我發現上面的類新增了太多的對象,並彈出了大量的gragarbage集合的消息。
在最後,我有3個問題:
- 是初始緩衝區大小等於我可以從.read方法讀取的緩衝區?
- 40-60ms是以44100採樣率捕捉音頻數據的限制嗎?
- 您能否推薦一些FFT庫,以便在處理FFT時可以獲得更好的性能? (我認爲如果使用C代碼庫更好?)
對不起,我的英語不好,也謝謝你花在我的問題上的時間。
P.S我在iOS上嘗試過它,它可以只需要44100採樣率的512個採樣。所以每個回調只需要大約10ms。
接近我的問題:http://stackoverflow.com/questions/3069617/android-signal-analysis-some-filters – 2012-01-12 10:01:51
@丹,好問題。我正在嘗試做一些信號處理以及實時。採樣率和其他輸入配置是相同的。我的問題是,我處理傳入樣本的時間太長,即兩次後續讀取之間的時間非常短。我想知道你是否有類似的問題,以及你如何解決這個問題。 TIA – 2012-03-04 07:54:07
您的意思是您的計算耗時過長,因此您無法在兩個回調中完成該過程? 我相信音頻處理方法不應該花太長的時間,否則你可能無法處理每個回調中的每個緩衝區。 此外,儘可能少的對象,你可以。所以你可以消除CPU繼續處理內存管理過程。 – Dan 2012-03-22 10:46:23