2

ブロックサイズが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が正しくない場合があります-正しいオクターブにもう少し正確に焦点を合わせる方法はありますか?

4

3 に答える 3

4

自己相関を行う効率的な方法は、FFTを使用することです。

  • 時間領域信号のFFT
  • 複素FFT出力を振幅とゼロ位相(つまりパワースペクトル)に変換します
  • 逆FFTを取る

これは、時間領域での自己相関が周波数領域でのパワースペクトルと同等であるために機能します。

そうは言っても、ベアボーン自己相関は、一般に(正確な)ピッチ検出を実装するための優れた方法ではないため、アプローチ全体について再考する必要があるかもしれません。

于 2011-09-20T20:13:01.903 に答える
0

質問を完全には理解していませんが、あなたが使用できるかもしれない1つのトリックを指摘することができます。あなたは最大の大きさであるサンプルを探すと言います。残りの計算で役立つ場合は、そのサンプル数をサブサンプルの精度で計算できます。

サンプル5に0.9のピークがあり、隣接するサンプルに0.1と0.8があるとします。実際のピークは、おそらくサンプル5とサンプル6の間のどこかにあります。

(0.1 * 4 + 0.9 * 5 + 0.8 * 6) / (0.1 + 0.9 + 0.8) = 5.39
于 2011-09-20T19:16:07.120 に答える
0

この「ブルートフォース」自己相関法を改善する簡単な方法の1つは、kの範囲を制限し、前の平均期間の近く、たとえば最初は+-0.5半音以内のラグ(またはピッチ期間)のみを検索することです。相関関係が見つからない場合は、長三度以内など、わずかに広い範囲を検索してから、調整対象の機器の予想される周波数範囲内であるが、より広い範囲を検索します。

より高いサンプルレートを使用することで、より高い周波数分解能を得ることができます(たとえば、必要に応じて、適切なフィルタリングを使用して、自己相関の前にデータをアップサンプリングします)。

ピッチラグ(周期)とそのラグの倍数の自己相関ピークが得られます。これらの分数調波をなんらかの方法で排除する必要があります(おそらく、楽器では不可能であるか、以前の周波数推定からのピッチジャンプの可能性が低いためです)。

于 2011-09-21T20:06:57.853 に答える