Android中的实时音频处理

时间:2012-01-12 09:44:56

标签: java android audio fft

我正在使用AudioRecord.read将PCM数据捕获到字节。 但是,我发现它限制为使用至少3904个缓冲区初始化AudioRecord对象。采样率为44100。 由于我需要对数据执行FFT,因此我将样本增加到4096。 因此,回调每隔40-60ms由setPositionNotificationPeriod运行到500.由于进一步减少持续时间不会进行任何更改。 如果这是以下配置的最快回拨时间,我很擅长?

采样率:44100

频道:Mono

编码:PCM 16 BIT

BufferSize:4096

(我不确定它是4096还是2048,因为我每次读取4096个字节,它只能填充2048个2字节缓冲区)

甚至40-60ms是可以接受的,然后我执行FFT,最终阻止每个回调大约200-300ms。并且仍然存在许多影响准确性的噪声。 我正在使用这些源代码:FFT in JavaComplex class

还有其他选择可以执行快速,可靠且消耗较少的内存处理FFT吗? 我发现上面的类新增了太多的对象并弹出了gragarbage collection的消息。

总之,我有3个问题:

  1. 初始bufferSize是否等于我可以从.read方法读取的缓冲区?
  2. 采用44100采样率捕获音频数据的时间是40-60ms吗?
  3. 你能建议一些FFT库,以便在处理FFT时有更好的表现吗? (我想如果使用C代码库更好?)
  4. 抱歉我的英文不好,也谢谢你把时间花在我的问题上。

    P.S我在iOS上尝试过,它可以采用512个样本,采样率为44100。所以每次回调只需要大约10ms。

1 个答案:

答案 0 :(得分:0)

关于问题3:可能没有本机库那么快,但我已经开始使用这些类,它们似乎适合实时工作(虽然我正在读取文件,而不是麦克风): FFTPack

最常见的本机库是KissFFT,您可以在libGDX中找到为Android编译的。