Недавно я рассматривал возможность использования автокорреляции для определения высоты тона. Тем не менее, мне трудно найти хорошие источники, где можно изучить автокорреляцию, и я имею в виду источники, которые позволяют легко понять автокорреляцию шаг за шагом.
Я не очень хороший программист, но и не очень большой по формулам, поэтому источники, которые я нахожу, действительно трудно понять.
В принципе, что я знаю сейчас, понятие автокорреляции похоже на сравнительный и контрастный метод сигнала? Но я был бы очень признателен, если бы мог лучше понять алгоритм автокорреляции.
Большое спасибо!
UPDATE: Вот пример кода, который я получил с сайта. Возможно, вы можете использовать его как ссылку. Ive проверил этот код, и он правильно вернул правильную высоту (хотя здесь и есть некоторые неправильные)
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;