У меня есть аудиоплеер, использующий NAudio, и я хотел бы отображать интенсивность в реальном времени для каждой полосы частот.
У меня есть событие, запускаемое для каждого блока из 1024 отсчетов:
public void Update(Complex[] fftResults)
{
// ??
}
Я бы хотел иметь массив чисел, указывающих интенсивность каждой полосы частот.Предположим, я хотел бы разделить окно на 16 полос.
Например, когда басовых частот больше, это может выглядеть так:
░░░░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓▓░░░░░░░░░░░░
▓▓▓▓▓░░░░░░░░░░░
▓▓▓▓▓▓▓▓░░░▓░░▓░
Что я должен поместить в этот обработчик событий, если это возможно с этими данными?
Поступающие данные (Complex []) уже были преобразованы с помощью БПФ . Это стереопоток.
Первая попытка:
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;
}
}
Вышеупомянутое что-то делает, но я думаю, что слишком много уходит на первые две группы, и я играю шакиру, в которой не так много бас.
Спасибо!