NAudio Интенсивность частотного диапазона

У меня есть аудиоплеер, использующий 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;
        }
    }

Вышеупомянутое что-то делает, но я думаю, что слишком много уходит на первые две группы, и я играю шакиру, в которой не так много бас.

Спасибо!

7
задан Marino Šimić 12 October 2011 в 05:08
поделиться