音声分析の自己相関


11

私はAutocorrelationについて読んでいますが、それがどのように機能し、どのような出力を期待する必要があるかを正確に理解できていません。私は自分の信号をAC機能に入力し、スライディングウィンドウを入力する必要があると思いますか。各ウィンドウ(たとえば、1024サンプル)は、-1と1の間の係数を出力します。符号は、ラインが上向きか下向きかを示し、値は相関の強さを示します。簡単にするために、オーバーラップはなく、ウィンドウを毎回1024サンプルだけ移動するとします。44100のサンプルでは、​​43の係数を取得しますが、それらすべてを保持する必要がありますか?

200秒の信号に対してこれを実行すると、8600の係数が得られます。これらの係数を使用して繰り返しとテンポを検出するにはどうすればよいですか?それらをグループ化するためにある種のニューラルネットワークを作成する必要がありますか、それともやりすぎですか?

助けてくれてありがとう。


4
あなたの仮定サンプルである。AC関数が返すものを教えてください。可能な回答は次のようになります"が返すが返すまたは」an"番号ここで、 "または"数値を返すここで、 "。提案されている3つの回答はすべて、自己相関の概念と互換性があります。1024バツ[1]バツ[2]バツ[1024]Σ=11024バツ[]21024R[k]R[k]=i=11024kx[i]x[i+k]1024R[k]R[k]=Σi=11024kバツ[]バツ[+k]+Σ=1kバツ[1024k+]バツ[]
Dilip Sarwate、2011年

ちょっとディリップ、助けてくれてありがとう。私はまだAC機能を実装していません。最初に理論を理解しようとしています。最初の方程式が最も簡単に見えますが、データを事前に正規化する必要がありますか?
XSL

1
ここでは例です:gist.github.com/255291#L62
endolith

回答:


23

自己相関の考え方は、特定の遅延での信号とそれ自体の間の類似性の尺度を提供することです。これにはいくつかの方法がありますが、ピッチ/テンポ検出の目的では、検索手順と考えることができます。つまり、サンプルごとに信号をステップ実行し、参照ウィンドウと遅延ウィンドウの間で相関を実行します。参照をそれ自体の逐語的コピーと比較しているため、「遅延0」での相関はグローバル最大値になります。前進すると、相関は必然的に減少しますが、周期的な信号の場合は、ある時点で再び増加し始め、極大に達します。「ラグ0」とその最初のピークの間の距離は、ピッチ/テンポの推定値を提供します。私のやり方

サンプルごとの相関の計算は、高いサンプルレートでは計算コストが非常に高くなる可能性があるため、通常はFFTベースのアプローチを使用します。対象のセグメントのFFTを取り、その複素共役を掛けてから、逆FFTを行うと、周期的な自己相関が得られます。コード内(numpyを使用):

freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))

効果は、周期的な成分(定義上、それら自体と同様)と比較して、信号内のノイズ(それ自体とは相関のない)の量を減らすことになります。逆変換を行う前に自己相関(つまり、共役乗算)を繰り返すと、ノイズがさらに減少します。白色波が混入した正弦波の例を考えてみましょう。次のプロットは、440Hzの正弦波、ノイズによって「破壊された」同じ正弦波、ノイズの多い波の周期的な自己相関、および二重の周期的な自己相関を示しています。

自己相関

両方の自己相関信号の最初のピークが、元の信号の最初のサイクルの終わりに正確に位置していることに注意してください。それが周期性(この場合はピッチ)を決定するために探しているピークです。最初の自己相関信号はまだ少し「ぎこちない」ので、ピーク検出を行うには、ある種の平滑化が必要になります。周波数領域で2回の自己相関を行うと、同じ結果が得られます(比較的高速です)。「ぼんやり」とは、ズームインしたときに信号がどのように見えるかを意味し、プロットの中央で発生するディップではないことに注意してください。周期的自己相関の後半は常に前半の鏡像になるため、このような「ディップ」が一般的です。アルゴリズムを明確にするために、コードは次のようになります。

freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)

複数の自己相関を行う必要があるかどうかは、信号内のノイズの量によって異なります。

もちろん、このアイデアには微妙なバリエーションがたくさんありますが、ここではそれらすべてについては説明しません。私が(ピッチ検出のコンテキストで)確認した最も包括的なカバレッジは、RabinerとSchaferによる音声信号のデジタル処理です


次に、自己相関がテンポ検出に十分かどうかについて説明します。答えはイエスとノーです。(ソース信号に応じて)テンポ情報を取得できますが、すべての場合にそれが何を意味するのかを理解するのは難しい場合があります。たとえば、次はブレイクビートの2つのループのプロットであり、その後にシーケンス全体の周期的自己相関のプロットが続きます。

ブレイクビート自己相関

参考までに、対応する音声は次のとおりです。

案の定、ループポイントに対応する真ん中に素晴らしいスパイクがありますが、それは非常に長いセグメントの処理に起因します。その上、それが正確なコピーではなかった場合(たとえば、それを備えたインストルメンテーションがあった場合)、そのスパイクはそれほどクリーンではありません。自己相関は間違いなくテンポ検出に役立ちますが、複雑なソース素材にはそれだけでは十分ではない可能性があります。たとえば、スパイクを見つけた場合でも、それが完全な小節、4分音符、2分音符などのどれであるかをどのようにして知るのでしょうか。この場合、それは完全な測定値であることは十分明確ですが、常にそうであるとは限りません。内部の仕組みが明らかになるまで、より単純な信号でACをいじってみてから、一般にテンポ検出について別の質問をすることをお勧めします(「大きい」ため)


2
ちょっと待ってください、それはオーディオ信号自体の自己相関ですか?それは確かにデジタルループ以外の何かのテンポ検出にはあまり役に立ちません。一部のRMSエンベロープの自己相関は、一般に、複数の周波数帯域が別々にある場合に、より適切に機能するはずです。
leftaroundabout

1
音楽に何らかのビートがある限り、時間方向のSTFTの自己相関はかなりうまく機能します。これは基本的に、多くの周波数帯域の自己相関を実行し、それらを合計することと同じです。
Endolith

2
@leftroundaboutそう、自己相関以外にも、テンポ検出(前処理、後処理)を行うために必要なことがいくつかあります。私は主にOPの質問の最初の文(つまり、「自己相関はどのように機能するか」)に応答し、他のプロセスが関与するため、テンポ検出について別の質問をするよう提案します。
データガイスト

@endolithどういう意味Autocorrelation of the STFT in the time directionですか?具体的には、時間方向の部分
popctrl '11年

1
STFTの各列の自己相関を計算する意味@popctrl
endolith

3

自己相関を使用してビート検出を実行したいようです。これは可能ですが、オーディオを大幅にダウンサンプリングすることをお勧めします。1〜3 Hz(60 bpm〜180 bpm)の信号を探しているので、44100 Hzの解像度は必要ないか、必要ありません。適切に計算および正規化された自己相関は、遅れ0で1.0です(信号はそれ自体と完全に相関します)。周期的な信号の場合、ACはゼロ未満に低下し、基本周波数に対応するラグでピークに戻り、高調波ではピークが小さくなります。このピークを検索するための妥当な範囲を選択する必要があります。ノイズの場合、自己相関は低下し、基本的にゼロ付近の波線のフラットラインになります。経験則として、正規化ACに0.5を超えるピークがある場合、周期的な信号があります。


1

自動相関は、信号とそれ自体の相互相関です。それを計算する簡単な方法は、元の信号と信号の時間反転バージョンの間でたたみ込みを行うことです。1000サンプル長の信号がある場合、その自動相関には1999(2 * N-1)個の非ゼロサンプルがあります。自動相関(実際の信号の場合)は常に時間的に対称であるため、これらのサンプルのうち1000個のみが一意です。つまり、ac [n] = ac [-n]です。

連続信号は有限のセグメントに分割する必要があります。これはフーリエ変換と似ています。技術的には-infから+ infに統合する必要がありますが、セグメントに分割する(必要に応じてオーバーラップやウィンドウ処理を行う)ことでも有用な結果が得られます。ウィンドウの長さ、形状、オーバーラップの選択は、アプリケーションによって異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.