使用 FFT 实现吉他调音器时,缓冲区大小的最佳值是多少?正在获取输出,但显示的值似乎没有我预期的那么准确。我认为这是我分配的缓冲区大小的问题。我使用 8000 作为缓冲区大小。是否有任何其他建议来检索更有效的结果?
最佳答案
您可以稍微调整一下结果。我完成 FFT 工作已经有一段时间了,但如果我记得,缓冲区为 8000,第 N 个桶将是 (8000/2)/N Hz(对吗?已经很久了)。所以第 79 到第 81 个桶是 50.63、50 和 49.38 Hz。
然后您可以使用稍微不同的桶数进行 FFT。因此,如果您减少到 6000 个桶,第 59 到第 61 个桶将是 50.84、50 和 49.18 Hz。
现在您已经获得了一种算法,您可以使用该算法返回特定频率。我认为是 O((log M) * (N log N)),其中 N 大致是您每次使用的桶数,M 是精度。
更新:示例拉伸(stretch)
public byte[] stretch(byte[] input, int newLength) {
byte[] result = new byte[newLength];
result[0] = input[0];
for (int i = 1; i < newLength; i++) {
float t = i * input.length / newLength;
int j = (int) t;
float d = t - j;
result[i] = (byte) (input[j - 1] * d + input[j] * (1 - d))
}
return result;
}
您可能需要修复一些转换以确保获得正确的数字,但这看起来是正确的。
i = 结果中的索引[] j = input[] 中的索引(四舍五入) d = 要使用的输入 [j - 1] 的百分比 1 - d = 要使用的输入 [j] 的百分比
关于android - 最佳缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9799467/