4

私はこれについて多くの調査を行ってきましたが、まだ問題が発生しているため、デジタル (オーディオ) 信号処理の深い知識を持つ人が私を正しい方向に向けてくれることを願っています.

正確なビート検出を実行できるライブラリを見つけるのがいかに難しいかに驚いています。私は DSP と FFT についてほとんど何も知りません。私が本当に欲しいのは、次のように簡単に言えるライブラリです。

BPMDetect detector = new BPMDetect();
float bpm = detector.GetBpm(filename);

しかし、どうやらこれは要求が多すぎるようです。私が得た最も近い方法は、SoundTouch ライブラリを使用することですが、最近、そこでの BPM 検出が非常に信頼できないことを発見しました。BPM 検出が正確な科学ではないことはわかっていますが、SoundTouch は私の音楽ファイルの 1 つが 170 BPM であると主張しましたが、abyssmedia の BPM カウンター プログラムは正確に 120 BPM であるとしています。だから私はそれが可能であることを知っています。スピードよりも正確さを重視しています。

私の質問は、DSP についてあまり知らなくてもこれを実行できる C# ライブラリはありますか?

4

1 に答える 1

4

FFT に頼ることなく、基本的なビート検出を行うことができるはずです。これを行うビート検出アルゴリズムを構築しました。

基本的な考え方は、音声信号を取得し、それを 10 ミリ秒程度の小さな時間バケットに分割することです。バケットごとに RMS パワーを計算します。バケット内のサンプル s[i] ごとに、-1.0...1.0 に正規化し、s[i]**2 の合計を計算します。

これで、わずかな時間のパワー (= ラウドネス) の配列が得られました。

次に、バケットからバケットへの変化率 (導関数) を取得します: d[i] = s[i+1] - s[i]。

導関数の配列は、粒から粒へとラウドネスがどれだけ速く増加しているかを示します。変化が速いほど、ビートが激しくなります。

ここで少し巧妙になります。これらの d[i] 値にしきい値を設定して、ビートを構成するのに十分なほど急な値を決定します。次に、自己相関を実行して、それらが安定しており、規則的なパターンで並んでいるかどうかを確認します。

于 2015-05-16T00:18:21.293 に答える