最佳缓冲区大小

时间:2012-03-21 06:14:02

标签: android

使用FFT实现吉他调音器时,缓冲区大小的最佳值是多少?我得到一个输出,但似乎显示的值不如我预期的那么准确。我认为这是我分配的缓冲区大小的问题。我使用8000作为缓冲区大小。还有其他建议可以检索更有效的结果吗?

1 个答案:

答案 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]的百分比