Я реализовал простую процедуру автокорреляции для некоторых аудиосэмплов со скоростью 44100,0 с размером блока 2048.
Общая формула, которой я придерживаюсь, выглядит следующим образом:
r[k] = a[k] * b[k] = ∑ a[n] • b[n + k]
и я реализовал его в виде вложенного цикла методом грубой силы следующим образом:
for k = 0 to N-1 do
for n = 0 to N-1 do
if (n+k) < N
then r[k] := r[k] + a(n)a(n+k)
else
break;
end for n;
end for k;
Я ищу максимальную величину в r и определяю, сколько она отсчетов, и вычисляю частоту.
Чтобы облегчить настройку результатов тюнера, я использую кольцевой буфер и каждый раз возвращаю медиану.
Расчеты методом грубой силы немного медленны - есть ли известный, более быстрый способ их выполнения?
Иногда тюнер не настолько точен, как это необходимо.Какой тип эвристики я могу применить здесь, чтобы помочь уточнить результаты?
Иногда OCTAVE неверен - есть ли способ немного точнее отточить правильную октаву?