NAudio を使用するオーディオ プレーヤーがあり、各周波数帯域のリアルタイムの強度を表示したいと考えています。
1024 サンプルのブロックごとにトリガーされるイベントがあります。
public void Update(Complex[] fftResults)
{
// ??
}
私が欲しいのは、各周波数帯域の強度を示す数値の配列です。ウィンドウを 16 のバンドに分割したいとします。
たとえば、より多くの低音周波数がある場合、次のようになります。
░░░░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓▓░░░░░░░░░░░░
▓▓▓▓▓░░░░░░░░░░░
▓▓▓▓▓▓▓▓░░░▓░░▓░
そのデータでこれが可能である場合、そのイベント ハンドラーに何を入れるべきですか?
入ってくるデータ (Complex[]) は既に FFT で変換されています。ステレオストリームです。
初挑戦:
double[] bandIntensity = new double[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public void Update(Complex[] fftResults)
{
// using half fftResults because the others are just mirrored
int band = 0;
for (int n = 0; n < fftResults.Length/2; n++)
{
band = (int)((double)n / (fftResults.Length / 2) * bandIntensity.Length);
bandIntensity[band] += Math.Sqrt(fftResults[n].X * fftResults[n].X + fftResults[n].Y * fftResults[n].Y);
bandIntensity[band] /= 2;
}
}
上記は何かを行っていますが、最初の 2 つのバンドには入りすぎていると思います。私はシャキーラを演奏していますが、低音はあまりありません。
ありがとう!