スライディングウィンドウを使用してパワースペクトルを計算します。FFT:1024サンプルを取得します。
double[] signal = stream.Take(1024);
それをFFTアルゴリズムにフィードします。
double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);
実数部と虚数部が得られます。虚数部を捨てないでください。虚数と同じことを実数部に行います。虚数部が実数部とpi/2位相がずれていることは事実ですが、それでもスペクトル情報の50%が含まれています。
編集:
振幅ではなく電力を計算して、音量が大きい場合は数値を大きくし、音量が小さい場合は数値をゼロに近づけます。
for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];
架空の部分も同様です。
for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];
これで、最後の1024サンプルのパワースペクトルが得られました。ここで、スペクトルの最初の部分は低周波数であり、スペクトルの最後の部分は高周波数です。
ポピュラー音楽でBPMを見つけたい場合は、おそらく低音に焦点を当てる必要があります。パワースペクトルの下部を合計することで、低音の強さを拾うことができます。使用する数値は、サンプリング周波数によって異なります。
double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];
ここでもう一度同じことを行いますが、新しいスペクトルを計算する前にウィンドウを256サンプル移動します。これで、256サンプルごとにbassIntensityを計算することになります。
これは、BPM分析に適した入力です。低音が静かなときはビートがなく、音量が大きいときはビートがあります。
幸運を!