使用FFT实现吉他调音器时,缓冲区大小的最佳值是多少?我得到一个输出,但似乎显示的值不如我预期的那么准确。我认为这是我分配的缓冲区大小的问题。我使用8000作为缓冲区大小。还有其他建议可以检索更有效的结果吗?
答案 0 :(得分:2)
你可以稍微摆弄一下结果。自从我完成FFT工作已经有一段时间了,但如果我记得,使用8000的缓冲区,第N个桶将是(8000/2)/ N Hz(是吗?已经很长时间了)。所以第79到第81个桶是50.63,50和49.38赫兹。
然后,您可以使用略有不同数量的存储桶进行FFT。因此,如果你减少到6000个水桶,第59到第61个水桶将分别为50.84,50和49.18赫兹。
现在你已经有了一个可以用来在特定频率上回家的算法。我认为它是O((log M)*(N log N))其中N大致是每次使用的桶数,M是精度。
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 =输入[]中的索引(向上舍入) d =要使用的输入[j - 1]的百分比 1 - d =要使用的输入[j]的百分比