2012-01-12 59 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编译。