私はNAudioを使用したオーディオプレーヤーを持っており、各周波数帯域に対してリアルタイムの強度を表示したいと考えています。 Iイベントが1024個のサンプルのブロック毎にトリガ有するNAudio周波数帯域強度
:私がしたいどの
public void Update(Complex[] fftResults)
{
// ??
}
は、各周波数帯の強度を表す数値の配列です。ウィンドウを16のバンドに分割したいとします。より低音域がある場合、それはこのようになります。例えば
:これはそのデータで可能であるならば、私はそのイベントハンドラに何を
░░░░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓▓░░░░░░░░░░░░
▓▓▓▓▓░░░░░░░░░░░
▓▓▓▓▓▓▓▓░░░▓░░▓░
を置く必要がありますか?
データ到着(複合[])は既に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つのバンドに入ると思うし、私はあまり低音を持っていないシャキーラをプレイしています。
ありがとうございます!
あなたは私のヒーローです。笑。 –
ウィンドウについては、BlackmannHarrisWindowが使用されていることがわかります。しかし、私はまだ10xLog10()を試していませんでしたが、グラフがどのように変化するかを見ていきます。そして0HzのDCビンを取り除きます。 –
オクターブビンをバンドコレクションに適用した後でも、まだ奇妙な数字が残っていますが、左側にはまだ多すぎます...私はyスケールの数値をdBに変換しました –