我正在编写一个java程序,该程序将从1024个样本块中的吉他中读取音频,并应用自动相关来查找音高。我有自动相关的代码,它工作正常,但对于1024个样本输入,它需要524800次迭代!有没有办法优化它,因为最终目标是几乎实时地使系统检测音高(现在它需要16毫秒来完成)。
我可能会将外环更改为600个循环,因为最低音符E(82Hz)在一个完整周期内需要大约537个样本,但即便如此,这总体上也是180300个环路。
代码:
public double[] autoCorrelate(double[] audioIn)
{
double sum = 0;
double[] output = new double[audioIn.length];
int n = 0;
long startTime = System.currentTimeMillis();
for (n = 0; n < audioIn.length; n++) //shift sample to left after each inner loop
{
for (int i = n; i < audioIn.length; i++)
{
sum = sum + (audioIn[i] * audioIn[i - n]); //computes product of signal and n shifted copy
}
output[n] = sum;
sum = 0; //reset for next output value
}
long stopTime = System.currentTimeMillis();
long totalTime = stopTime-startTime;
System.out.println(totalTime);
return output;
}