因此,我设置了 AudioRecord 并使用 FFT 来确定音符确定的频率。
在设置过程中我要求
AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat)
然后我有一些 if 语句将其设置为 2 的下一个更大的幂。对于我的手机,它通常是 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 是一个糟糕的选择,因为对于音符,人们通常想要估计音高,而不是频谱频率,由于心理声学,这是两个截然不同的东西。
对于加窗 FFT,频谱频率最准确地确定在 FFT 窗口的中间附近。因此,使用较长的 FFT,即使在非常短的输入缓冲区大小后通过重叠重复它们,也会导致大约为 FFT 长度一半的延迟。
但更频繁地重复 FFT(通过在短暂的输入缓冲区延迟后重叠它们)将为您提供更好的时间分辨率,即使不是更快的延迟。要真正降低延迟,您需要使用更短的 FFT,并失去频率分辨率,或者使用其他频率或音高估计器,这也会有其他时间-频率-稳健性权衡。
关于android - 如何设置 Android AudioRecord 所以我的延迟很低但 FFT 的样本量很大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29286851/