如何设置 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,并失去频率分辨率,或者使用其他频率或音高估计器,这也会有其他时间-频率-稳健性权衡。
所以我设置了一个 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,并失去频率分辨率,或者使用其他频率或音高估计器,这也会有其他时间-频率-稳健性权衡。