Приложих проста процедура за автокорелация срещу някои аудио проби със скорост 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 и определям на колко семпли разстояние е и изчислявам честотата.
За да помогна за смекчаване на резултатите от тунера, използвам кръгъл буфер и връщам медианата всеки път.
Изчисленията с груба сила са малко бавни - има ли известен, по-бърз начин да ги направите?
Понякога тунерът просто не е толкова точен, колкото е необходимо. Какъв тип евристика мога да приложа тук, за да помогна за прецизиране на резултатите?
Понякога ОКТАВАТА е неправилна - има ли начин да усъвършенствате правилната октава малко по-точно?