Масштаб FFT результат частоты в журнале - PullRequest
0 голосов
/ 04 июня 2018

Я собираюсь запрограммировать визуализатор с довольно хорошими результатами.У меня есть массив размером 1500, с величиной частот в нем.Теперь я хочу преобразовать этот массив в массив с 100 значениями.Например, в 1-м индексе 2-го массива должно быть среднее из первых двух значений в первом массиве.На 2-м индексе 2-го массива должны быть значения индекса 3-6.Но я не знаю, как правильно рассчитать это.Так как же я могу преобразовать первый массив во второй?

1 Ответ

0 голосов
/ 08 июня 2018

Я нашел ответ в исходном коде дождемера . Может быть, теперь будет понятнее то, что я хотел сделать, это код c #: чтобы получить массив определенной длины, журнал масштабируется с помощью min.,и макс.частоты.

private float[] getFrequencies(int min, int max, int nBands)
    {
        float[] returnVal = new float[nBands];
        double step = (Math.Log(max / min) / nBands) / Math.Log(2.0);
        returnVal[0] = (float)(min * Math.Pow(2.0, step / 2.0));

        for (int iBand = 1; iBand < nBands; ++iBand)
        {
            returnVal[iBand] = (float)(returnVal[iBand - 1] * Math.Pow(2.0, step));
        }
        return returnVal;
    }

И для заполнения выходного массива:

private double[] getLogArray(double[] data, int nBands, int minFreq, int maxFreq)
    {
        float[] bandFreq = getFrequencies(minFreq, maxFreq, nBands);
        float df = (float)sampleRate / samples;
        float scalar = 1.0f / sampleRate;
        double[] bandOut = new double[nBands];
        int iBin = 0;
        int iBand = 0;
        float f0 = 0.0f;

        while (iBin <= (samples / 2) && iBand < nBands)
        {
            float fLin1 = ((float)iBin + 0.5f) * df;
            float fLog1 = bandFreq[iBand];
            float x = (float)data[iBin];

            if (fLin1 <= fLog1)
            {
                bandOut[iBand] += (fLin1 - f0) * x * scalar;
                f0 = fLin1;
                iBin += 1;
            }
            else
            {
                bandOut[iBand] += (fLog1 - f0) * x * scalar;
                f0 = fLog1;
                iBand += 1;
            }
        }
        return bandOut;
    }

Хорошего дня и извините за поздний ответ.

...