2009-08-11 11 views
3

私はC#でリアルタイムオーディオから「1分あたりのビート」を判断しようとしています。それは私が検出している音楽ではなく、ちょうど一定のタップ音です。私の問題はこれらのタップ間の時間を決定することで、WaveIn.csクラスを使用して試した「1分あたりのタップ」を決定することができますが、サンプリングの仕方は分かりません。私は分析するために設定された数のサンプルを1秒間取得していません。私は実際にサンプルの正確な数をサンプルからサンプルまでの時間を知るために2番目に読み取る方法を知りません。C#のリアルタイムオーディオ解析のタイミング

私を正しい方向に導く助けがあれば幸いです。

答えて

2

「タップ」とサンプルを混同している可能性があります。

サンプルは、特定の瞬間における音波の高さを表す数値です。典型的なウェーブファイルは1秒間に44,100回サンプリングされるので、ステレオ用に2つのチャンネルがある場合は、毎秒88,200の16ビット数(サンプル)があります。

あなたがこれらの番号の全てを取得し、それらをグラフ化した場合、あなたはこのようなものでしょう:タップである

alt text

What you are looking for is this peak ------------^ 

を。

1

WaveLib.WaveInRecorderのコンストラクタはWaveLab.WaveFormatオブジェクトをパラメータとして取ります。これにより、オーディオフォーマットを設定することができます。サンプルのレート、ビットの深さなど。ピークのオーディオサンプルをスキャンするだけですが、「タップ」を検出してピーク間のサンプルの平均距離を記録しています。

オーディオストリームのサンプルレート(たとえば44100サンプル/秒)を知っているので、平均ピーク距離(サンプル)をとり、1 /(サンプルレート)を掛けてタップを60分で割ってタップ間の時間(分)を求め、反転してタップ/分を得る。

私はあなたが使用しているどのWaveIn.csクラスわからないんだけど、通常の音声記録コードで、あなたのいずれかA)は、後に、その後のいくつかの記録を開始するためのコードを教えてくれ、と

3

を役に立てば幸いあなたがコードを停止するように指示すると、この期間に記録されたデータを含む配列(通常はshort []型)が返されます。またはB)与えられたバッファーサイズで記録を開始するようにコードに指示し、各バッファーがいっぱいになると、コードは満たされたバッファーへの参照で定義したメソッドへのコールバックを行い、録音を停止します。

録音フォーマットがサンプルあたり16ビット(別名2バイト)、44100サンプル/秒、モノラル(1チャンネル)であるとします。 (A)の場合、録音を開始し、10秒後に録音を停止するとします。あなたは441,000(44,100 x 10)の長さの短い[]配列で終わるでしょう。私はあなたが "タップ"を検出するためにどのアルゴリズムを使用しているのかわかりませんが、この配列のタップを要素0、要素22,050、要素44,100、要素66,150などで検出するとしましょう。 5秒(22,050は44,100サンプル/秒の半分であるため)、これは秒当たり2タップ、したがって120 BPMを持つことを意味します。

(B)の場合、44,100サンプル(別名1秒)の固定バッファサイズで記録を開始するとします。各バッファが入ると、要素0と要素22,050でタップが見つかります。上記と同じロジックで、120 BPMを計算します。

これが役に立ちます。一般的にビート検出では、比較的長い時間録音し、大きなデータアレイでビートをカウントするのが最善です。 「瞬間」のテンポを推定しようとすると、録音の音程をフル・ノートで録音するよりリアルタイムで行うのが難しいように、エラーが発生しやすくなります。

+0

私がモノをしている場合、私の配列のそれらの数字のそれぞれは、1つのチャンネルの1つのサンプルを表していますか?もし私が2つのチャンネルをしたら、私の配列は88200倍になりますか?チャネル間の交替? – zac

+0

はい、ステレオは、毎秒2倍のサンプルを持ち、サンプルがインターリーブされている(左、右、左、右など)ことを意味します。したがって、要素0,2,4,6などは左チャンネルのデータを表し、要素1,3,5,7などは、右チャネルのデータを表す。 – MusiGenesis

+0

別の質問:振幅を得るためにfftを実行すると、元の配列の半分のサイズが返されます。私が読んだことは、それを実数部と虚数部に変換し、振幅を得るためにそれらの両方を使用するためです。この配列の各値が現在どのような役割を果たすのでしょうか? 2サンプル? – zac