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

标签 android fft audiorecord

因此,我设置了 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/

相关文章:

javascript - 使用 Javascript 检测 websocket 支持的最佳方法是什么?

android - 访问 MediaPlayer 中的音频缓冲区

android - 麦克风输入的处理

java - 如何刷新recyclerview?

android - 升级到Android Studio 1破坏了Robolectric测试

python - 为什么这个经过过滤的噪声信号的表现不像我预期的那样?

python - 如何从python中的fft信号中找到感兴趣频率的bin号?

android - 从 AudioRecord 计算耗时

android - Android Emulator 可以拾取音频吗?

java - 我是否应该为每个 Activity 创建演示者和模型?