ノイズの多い.wavファイルでドラムbpmを検出する


12

次の問題を解決するためのアルゴリズムを探しています:ノイズの多い.wavサウンドキャプチャ(マイクの風+摩擦音)がある場合、ソフトドラムビートのBPMを検出する方法は?

対象をグーグルで検索しようとしましたが、分析と指紋ID生成の両方のためのmp3関連ソフトウェアが大量にあるため、結果はかなり貧弱です。それらのどれも実際にそれを行う方法に関する情報を提供しません。

ノイズを除去するアルゴリズムは知っていますが、それでもBPMを検出する問題が残ります。また、BPMの問題の解決方法によっては、ノイズを除去する必要さえない可能性があります(ドラムは低周波数になり、ノイズは高周波数になる傾向があるため、単純なローパスで十分な前処理が可能です)。


回答:


13

比較的強いドラムビートがある場合に機能する1つの方法は、波形のSTFTの大きさを取得し、それを時間次元のみで自動相関させることです。自己相関関数のピークは、ビート、またはその約数になります。

これは、信号を多数の異なる周波数帯域に分割し、それぞれの振幅エンベロープを見つけ、各エンベロープを自己相関させてから合計することと同等です。ノイズと音楽の他の部分は、相互相関演算によって平均化されます。

これは、ドラムビートは多くの周波数(垂直線)で短命の音を生成し、音楽の他の部分は少数の周波数(水平線)でのみ長寿命であり、ノイズはすべての周波数で長寿命ですがランダムであるためです。STFTを見ると、ビートの繰り返しを確認できます。

ここに画像の説明を入力してください

音楽ファイル全体で単一のBPM値を見つけるための学校プロジェクトでこれを思いつきましたが、BPMを変更することでオーディオストリームに適応させることもできます。探しているBPMの期間の少なくとも2倍の長さのチャンクを処理する必要があります。


FFTは、周期的な信号を見つけるための一般的に有用な手法です。信号があなたが望むほど完全に規則的でない場合、少しトリッキーになることがあります:ドラマーは、歌の過程で、意図的にまたは意図せずに、スピードを上げたり遅くしたりできます。周波数領域で。
12

1
@Rethunk:BPMが時間とともに変化する場合は、これをまとめて実行し、それぞれのBPMを見つける必要があります。
エンドリス

ビートは一般的に音楽に関連付けられていることに注意してください。また、この図には音楽の別の部分が表示されています。水平線はビートの高さを変更します。したがって、基本的に3つのエネルギーの寄与があります:ビート(垂直)、音(水平)、ノイズ(残り)。
MSalters

@MSalters:ノートものの、あまりにも、相関させることができます
endolith

4

自己相関は確かにそのための良い基本的な方法です。これをさらに強化するためにできることはいくつかあります。

  1. ドラムの周波数スペクトルがわかっている場合は、ドラムに関連する周波数のみが残るように信号をバンドパスフィルターします。ドラムによっては、これは非常に狭くなる可能性があり、ノイズの大部分を取り除く必要があります。
  2. 次に、ドラムビートの長さにほぼ一致する時定数を使用して、信号の時間領域エンベロープを計算します(これを行う最も簡単な方法は「損失ピーク」です)。
  3. 次に、自己相関を行います
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.