自相关教程?

use*_*792 15 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;
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 10

这是我希望的简单解释.

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

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