【问题标题】:Tutorial on Autocorrelation? [closed]自相关教程? [关闭]
【发布时间】:2011-10-11 15:18:15
【问题描述】:

我最近一直在考虑将自相关用于音高检测。然而,我发现很难找到学习自相关的好资源,我的意思是让逐步理解自相关变得容易的资源。

我还不是一个很好的程序员,对公式也不是很了解,所以我发现的资源真的很难理解。

基本上,我现在知道的是自相关的概念就像信号的比较和对比方法?但如果我能对自相关算法有更多的了解,我将不胜感激。

非常感谢!

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

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;

【问题讨论】:

  • 自相关不是音高检测的最佳方法 - 您确定在您开始了解它的细节之前您想使用它吗?
  • 是的,因为我读过,尽管它不是最好的方法,但它是除 FFT 之外的简单方法之一。而且我不想深入研究 FFT,因为它看起来更复杂。

标签: algorithm signal-processing correlation


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!当我再次阅读我正在阅读的一些内容时,我会尝试将其纳入其中。
  • 嗨!我已经用示例代码更新了我的问题,所以我可能会学到更多。从代码中,我看到您所涉及的“延迟”与最大/最小偏移量有关,它构成了可能延迟的范围。但是,我在“在信号与自身延迟版本匹配的地方获得峰值”部分遇到了麻烦。根据我的理解,那是基于两个信号的某个点何时彼此相等?但是,在代码中,我看到正在使用两点的总和(一个来自原始点,另一个来自延迟点)。你能帮助我吗?谢谢!
  • 是的,延迟与延迟相同 - 这是代码示例中的外循环。对于每个给定的滞后,您将所有相应样本的 product 相加。如果有很强的相关性,那么这个和将是一个很大的正值。如果存在显着的负相关,那么您将获得很大的负值。否则,如果在此滞后时几乎没有相关性,那么您将获得接近于零的值,
  • 谢谢!我现在好了一点。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 2012-04-24
  • 2010-09-06
  • 2011-05-18
  • 2012-06-02
  • 2012-05-28
相关资源
最近更新 更多