2012-03-27 92 views
3

我正在开发一个应用程序,用于采样音频并需要对此数据进行实时处理(FFT和谐波产品频谱)。Java频率分析性能

我需要使用44100Hz的采样率和需要的0.5Hz的频率分辨率,这意味着我需要88200个样品预FFT。由于采样率是采样率的两倍,因此需要大约2秒才能捕获;但是,在第一个样本之后,我通过使用循环缓冲区进行采样,并且从此时只读取了一半的样本,从而显着改善了情况。

不幸的是,表现还是相当低,有相当多的延迟。这是一个很大的问题,因为应用程序需要及时响应输入。

没有人有我如何改善这种性能有什么建议?我认为主要问题在于对大样本的要求,如果有某种方式可以减少读取多少音频,同时保持相同的准确度,那将是一件好事。线程可能有帮助吗?

编辑

如果它有助于了解,我想从电吉他输入做到实时F0估计,与和弦匹配多个F0估计一起。我有这样做的方法可以工作,而且相当准确,但是对于一个uni项目而言,我没有足够的时间去考虑FFT以外的其他方法。真的,我只是希望以某种方式加快抽样过程。

+0

可以提高并发级别吗?对于例如将文件拆分成更小的块(对于开始的2个块)并在不同的线程下运行它们的样本?如果你不依赖于硬件(CPU驱动,而不是声卡驱动),我认为这种分而治之的方法可能会有所帮助。 – questzen 2012-03-27 12:36:21

回答

1

,因为你需要开始捕捉音频的2S,这将设置一个下限延迟。即使你有50%的重叠,你仍然有1秒的最小延迟。 FFT和其他处理只会增加这一点,但希望不会大量增加(否则使用更快的FFT库)。你将能够减少这种延迟的唯一方法是牺牲频率分辨率。

+0

这是我担心的。我认为有些人尝试使用FFT输入的零插值来提高分辨率,但仍然使用更少的采样。我可以尝试一下,看看它是如何工作的,但我认为这不会是一个解决方案。 – nihilo90 2012-03-27 14:01:26

+1

用零填充不会给你更多的*准确性*,它只是插值你的频域数据,以便获得更明显的分辨率,但这实际上只是表面化的 - 它不会分离太靠近在一起以解决问题的峰根据你的采样率,即你无法从任何地方获取信息。如果你对你正在尝试做什么给出高层次的概念,这可能会有所帮助,因为可能有其他方法。 – 2012-03-27 14:17:51

+0

我已经编辑了关于我的项目的更多信息。就零填充而言,如果我只对某个频率范围感兴趣,它会有所作为吗?另外,将这些内插点的周围分箱平均值应该考虑什么? – nihilo90 2012-03-27 15:20:38

1

使用FFT方法给你的时间频率权衡。如果你想要更低的延迟,你将不得不使用更少的数据,而使用FFT(或者更短或者填充零)会给你一个不太准确的频率估计值。

零填充只会给你一个高品质的插值。但是,这可能会提供更好的峰值频率估计,而不仅仅是使用较短FFT的峰值中心。