FFTスペクトルを使用して類似の音楽を見つける


16

さまざまなジャンルの音楽を含むライブラリ内の類似の曲を一致/検索する方法を見つけるために、数週間実験してきました。

私の最初の試みは、テンポなどの機能または曲に含まれるベースの数を検出してグループを形成することでしたが、歌のビートの約20%をカウントする必要がないため、このアプローチ(ボリューム変更ベースのビート検出)にはあまり行きませんでした常に、時にはそれらの1/2または1/3であり、私はそれを実装できませんでした。

数週間失敗した後、私はこの投稿で後述する新しいアイデアを得ました。簡単に言うと、ファイルのスペクトルサンプルを取得して、ファイルの「平均スペクトル」のようなものを作成して比較します。背後にあるアイデアは、たとえば、Hardstyleには通常のロックミュージックよりもはるかに多くのベースがあるということでした。また、Audacityのいくつかのスペクトラムを見て、これを確認しました。

  • ファイル1:完全なファイルFFTスペクトルの取得(2048サンプルサイズatm、振幅ログ、スケーリング)
  • すべてのスペクトル配列を合計し、各ビンの平均を取る
  • 同じいくつかの他のファイルを実行し、すべての結果を保存します
  • ファイル1と他のファイル間のFFT値の差異リストを作成する
  • ファイル1とファイルXの差を平均化する
  • これらの平均で昇順で並べ替え
  • 「差異値」が最も低い曲は類似していると見なされます。

これが私のアイデアを実装するための正しい/良い方法であるかどうか、良い知識を持っているあなたの一部は私に言うことができますか?


1
テンポを検出しようとしている場合は、信号を2乗してからフーリエ変換を試してください。1 Hzのオーダーの周波数は、フィルターで除去されるため、通常の(2乗されていない)FFTスペクトルには存在しません。関連するアイデアは、ピッチ検出に使用され、「ケプストラム」と呼ばれます。グーグルで調べることができます。ポップとジャズをクラシックと区別するために、ドラムキットの音を検出してみてください。ビブラートは機械で検出可能でなければなりません。機械で計算できる不協和音の尺度があります。

1
たぶん、あなたはdsp.SEにこれを移動するためにモデレータに依頼する必要があります
ディリップSarwate

私は質問をSEのDSPに移動するように要求しました。入力を分類するためにDrumkitが存在するかどうかを検出できましたか?自乗信号がどのようにテンポにつながるか説明できますか?

3
特に最近では、スペクトルの広がりを最大化するような方法で音楽が録音およびマスタリングされます。完全な長さのスペクトルが音楽を分類するための良い基準になるとは思いません。
フォノン

2
スペクトルの代わりに、スペクトログラムを見るべきです。スペクトルには、曲全体の周波数コンテンツのみが一度に表示されます。スペクトログラムは、周波数コンテンツが時間とともにどのように変化するかを示します。
エンドリス

回答:


17

あなたがやろうとしていることは何百人もの研究者によって何度も試行されてきており、これについては非常に多くの仕事があります。ISMIR会議の議事録を確認してください。最新ではない場合でも、エリアスパンパルクの論文をお読みくださいhttp ://www.ofai.at/~elias.pampalk/publications/pampalk06thesis.pdf

正しい方向にすばやく方向付けるには:

音楽は、多くの側面で似ている可能性があります。a)音色/テクスチャ/ジャンル。b)リズミカルなパターン。c)メロディ/コード進行...など!あなたのメッセージから、何を測定したいのか明確ではありません!

  • 興味がある場合、見たい機能はMFCC(メル周波数ケプストラム係数)です、およびそれらの次元が低いため(13係数対2048)。
  • b)に興味がある場合は、「変動パターン」(Pampalk、いくつかの帯域で0.1 .. 10 Hzの範囲の信号の短い自己相関)と呼ばれる機能を見てください。またはホイットマンの「ペニー」機能(時間軸に沿ったMFCCのFFT)。
  • c)に興味がある場合は、クロマグラムを見てください。Ellisのクロマグラムコード(http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/)から開始し、さらに堅牢なものが必要な場合は、Mauchの実装に移行します(http://isophonics.net/nnls-chroma )。

これが機能です。次に、これらの機能のシーケンスとして表現された曲を比較するためのより良い方法を考える必要があります。シーケンス間のペアワイズの差を計算することはそれほどスマートではありません。たとえば、ある曲と同じ曲を無音でオフセットして比較すると、まったく同じでも差が生じます。むしろ、それらの機能の分布を比較します。たとえば、曲Aの特徴の平均/標準偏差と曲Bの特徴の平均/標準偏差を計算し、確率距離(KL、Bhattacharyyaを超える)を取ります。

最後の点ですが、後で問題になります。最も近い一致を見つけるために曲とコーパスの残りの部分との間の距離を計算することは、非常に非効率的です。大規模なコレクションを扱う場合、LSHやボールツリーなどの手法を使用すると、コーパス全体と明示的に比較することなく、そのような最近傍クエリを実行できます。

余談ですが、テンポ検出はまったく別の問題です。あなたがそれを調べたい場合、このトピックに関する最高のパフォーマンス/アクセシビリティの論文は、動的プログラミングによるエリスのビート追跡です。http://www.ee.columbia.edu/~dpwe/pubs/Ellis07-beattrack.pdf。それは信じられないほどシンプルですが、最先端のアルゴリズムに近いです。


あなたの詳細な回答をありがとう、私はすでにこの文脈でMFCCについて何度も聞いたことがあり、FFTの結果をそのまま使用しないのが妥当と思われます。現在の「知識の状態」と開発環境(C#、Bass LibraryのFFT結果)で実装するのはかなり複雑に思えますが、試してみます。
-gfg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.