ブロックサイズが2048の44100.0のレートで、いくつかのオーディオサンプルに対して単純な自己相関ルーチンを実装しました。
私が従う一般式は次のようになります。
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が正しくない場合があります-正しいオクターブにもう少し正確に焦点を合わせる方法はありますか?