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