如何设置 Android AudioRecord 所以我的延迟很低,但 FFT 的样本量很大?

How do I set Android AudioRecord So I have low latency but have a large sample size for my FFT?

所以我设置了一个 AudioRecord,它使用 FFT 来确定音符确定的频率。

在设置过程中我要求

AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat)

然后我有一些 if 语句将其设置为 2 的下一个更大的幂。对于我的 phone,它通常是 2048(2^11)。目的是我执行的下一件事是 FFT,算法需要缓冲区长度是 2 的幂。

如果我错了请纠正我,但我的印象是您找到最小缓冲区大小的原因是因为它会减少延迟。

这一切都很好,直到我读到为了准确地确定特定的音符,尤其是那些频率较低的音符,您必须有更大的样本量才能提供给 FFT;最好样本量大于 16384 (2^14)。

我想我的问题是。当我创建 AudioRecord 时:

AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
                  rate, channelConfig, audioFormat, bufferSize1);

我可以使用一种缓冲区大小,较小的缓冲区以减少延迟,然后当我读取缓冲区时:

AudioRecord().read(thisbuffer, 0, bufferSize2);

在将其发送到 FFT 之前使用不同的缓冲区大小,长度更长?或者有更好的方法吗?

首先,FFT 不是 "note" 确定的一个糟糕选择,因为对于音符,人们通常想要估计音高,而不是频谱频率,由于心理声学,这是两个截然不同的东西。

对于 windowed FFT,频谱频率最准确地确定在 FFT 的中间附近 window。因此,使用较长的 FFT,即使在非常短的输入缓冲区大小后通过重叠重复它们,也会导致大约为 FFT 长度一半的延迟。

但是更频繁地重复 FFT(通过在短暂的输入缓冲区延迟后重叠它们)会给你更好的时间分辨率,如果不是更快的延迟的话。为了真正降低延迟,您需要使用更短的 FFT,并失去频率分辨率,或者使用其他频率或音高估计器,这也会有其他时间-频率-稳健性权衡。