Автокорелационна евристика за тунер

Приложих проста процедура за автокорелация срещу някои аудио проби със скорост 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 и определям на колко семпли разстояние е и изчислявам честотата.

За да помогна за смекчаване на резултатите от тунера, използвам кръгъл буфер и връщам медианата всеки път.

Изчисленията с груба сила са малко бавни - има ли известен, по-бърз начин да ги направите?

Понякога тунерът просто не е толкова точен, колкото е необходимо. Какъв тип евристика мога да приложа тук, за да помогна за прецизиране на резултатите?

Понякога ОКТАВАТА е неправилна - има ли начин да усъвършенствате правилната октава малко по-точно?


person Luther Baker    schedule 20.09.2011    source източник
comment
Какво са * и •? Умножение? Конволюция? Точков продукт?   -  person Jean-François Corbett    schedule 20.09.2011
comment
a[k] * b[k] е точковият продукт, докато вътре в сумирането, a[n] • b[n+k] е умножение.   -  person Luther Baker    schedule 03.10.2011
comment
Трудно е да се избере отговор, тъй като поне два са били полезни.   -  person Luther Baker    schedule 03.10.2011


Отговори (3)


Един прост начин за подобряване на този метод на автокорелация на "груба сила" е да се ограничи обхватът на k и да се търсят само закъснения (или периоди на височина) близо до предишния среден период, да речем в рамките на +-0,5 полутона в началото. Ако не намерите корелация, тогава потърсете в малко по-широк диапазон, да речем, a в рамките на голяма терца, след това потърсете в по-широк диапазон, но в рамките на очаквания честотен диапазон на инструмента, който се настройва.

Можете да получите по-висока честотна разделителна способност, като използвате по-висока честота на дискретизация (да речем, увеличаване на данните преди автокорелацията, ако е необходимо, и с подходящо филтриране).

Ще получите пикове на автокорелация за изоставането (периода) и за кратни на това закъснение. Ще трябва да премахнете тези субхармоници по някакъв начин (може би като невъзможно за инструмента или може би като малко вероятен скок на височината от предишните честотни оценки.)

person hotpaw2    schedule 21.09.2011
comment
По отношение на фразата намери корелация, обикновено търся максимума - и това е, всъщност не сравнявам или тествам каквото и да е максималното сумиране. Използвайки модификацията, която предлагате, бих ли върнал резултантния max › 0 ... или имам нужда от някаква логика, за да знам, че преминах от лоша към валидна корелация. - person Luther Baker; 23.09.2011
comment
Например, бих ли искал да се уверя, че получавам сумиране ‹ 0 – и след това да търся максимума до следващата стойност ‹ 0, за да знам това? Това ли ще ми помогне да реша дали трябва да опитам срещу по-широк диапазон? Предполагам, че основно какво прави една корелация валидна или не - ако просто търся максималната стойност от "k" до "n", където k е моите 5 полутона по-малко от предишната ми честота? - person Luther Baker; 23.09.2011

Ефикасният начин за извършване на автокорелация е с FFT:

  • FFT сигналът във времевата област
  • преобразуване на комплексен FFT изход в величина и нулева фаза (т.е. спектър на мощност)
  • вземете обратно FFT

Това работи, защото автокорелацията във времевата област е еквивалентна на мощностния спектър в честотната област.

Имайки предвид това, автокорелацията на голи кости не е чудесен начин за внедряване на (точно) откриване на височина като цяло , така че може да искате да преосмислите целия си подход.

person Paul R    schedule 20.09.2011
comment
Резултатите от крайното обратно БПФ дават ли ми дължина на периода в извадки? - person Luther Baker; 21.09.2011
comment
Не, крайният изход на IFFT е само автокорелацията - все пак ще трябва да идентифицирате периода на височина в рамките на това. - person Paul R; 21.09.2011

Не разбирам напълно въпроса, но мога да посоча един трик, който може да използвате. Казвате, че търсите извадката, която е с максималната величина. Ако е полезно в останалите ви изчисления, можете да изчислите това число на пробата с точност на подпробата.

Да кажем, че имате пик от 0,9 при проба 5 и съседни проби от 0,1 и 0,8. Действителният пик вероятно е някъде между проба 5 и проба 6.

(0.1 * 4 + 0.9 * 5 + 0.8 * 6) / (0.1 + 0.9 + 0.8) = 5.39
person Fantius    schedule 20.09.2011
comment
Не съм сигурен, че мога да използвам това в моя алгоритъм за автокорелация. Автокорелацията не търси максималната величина на една проба. - person Luther Baker; 21.09.2011