自相关教程?

时间:2011-07-23 12:33:19

标签: algorithm signal-processing correlation

我最近一直在考虑使用自相关进行音高检测。但是,我发现很难找到学习自相关的好地方,我的意思是这些资源可以让你逐步理解自相关。

我不是一个非常优秀的程序员,也不是很重要的公式,所以我找到的来源真的很难理解。

基本上,我现在知道的是自相关的概念就像是信号的比较和对比方法?但如果我能更好地理解自相关算法,我将非常感激。

非常感谢!

更新:这是我从网站获得的示例代码。也许你可以用它作为参考。我已经测试了这段代码并确实正确地返回了正确的音高(尽管这里有一些不正确的音调)

maxOffset = sampleRate / minFreq;
minOffset = sampleRate / maxFreq;

for (int lag = maxOffset; lag >= minOffset; lag--)
{
   float corr = 0; // this is calculated as the sum of squares
   for (int i = 0; i < framesize; i++)
   {
      int oldIndex = i - lag;
      float sample = ((oldIndex < 0) ? prevBuffer[frames + oldIndex] : buffer[oldIndex]);
      corr += (sample * buffer[i]);
   }

   if (corr > maxCorr)
   {
      maxCorr = corr;
      maxLag = lag;
   }
}

return sampleRate / maxLag;

1 个答案:

答案 0 :(得分:10)

我希望这是一个简单的解释。

首先考虑声纳如何工作 - 发出已知信号,然后将接收信号与原始信号进行比较 - 在​​一系列可能的延迟上比较信号,最佳匹配对应于反射信号的往返时间。

好的 - 现在想想一个周期性的信号,比如钢琴上持续的中间C音符。如果您在一系列不同的延迟中将音符与其自身进行比较,您将获得与音符的音高周期相对应的任何延迟的匹配。这基本上就是自相关:在一系列可能的延迟上比较信号与自身,并在信号与其自身的延迟版本匹配的任何地方获得峰值。对于大多数音符,第一个这样的峰值恰好对应于一个音高周期,因此您可以从中推断出音高(音高或频率=延迟的倒数)。