Неправильная частота на нарисованном вручную графике - PullRequest
0 голосов
/ 13 мая 2018

В настоящее время я пишу анализатор спектра для Android для университета, и часть этого включает в себя построение БПФ звука. Однако у меня возникла проблема с отображением частот. Значения частоты начинаются правильно, но с переходом на более высокие частоты ошибка становится все больше и больше (при 3000 Гц график покажет ~ 3750). Я чувствую, что в способе вычисления значений оси X или частоты есть ошибка. Это нарисованный вручную график для скорости.

Если нужно больше информации / кода, просто дайте мне знать, но я думаю, что это что-то простое, что я упустил из виду. Спасибо

xVal - это значение частоты. а значение масштаба - масштабировать его в соответствии с реальными размерами графика.

    int length = currentWaveDataDouble.length;
    int pow2 = Integer.highestOneBit(length) << 1;
    int sampleRate = 44100;
    ...
    //actual plot part
    for(int i =0; i<p2.length; i++) {
        float xVal = (float)(i * scaleX.ScaleValue(((double) sampleRate / (pow2 >> 1))));
        if (xVal < maxFreqPlus1) {
            xVal += axisWidth + yAxisMargin;
            float yVal = (float) scaleY.ScaleValue(p2[i]);
            yVal += axisWidth + xAxisMargin;

            canvas.drawPoint(xVal,yVal, marker);

            if(yVal > yMax)
            {
                yMax = yVal;
                xMax = xVal;
            }
        }
    }

Генератор частоты установлен на 4000 Гц

Частотный генератор установлен на 1000 Гц (значение 1250 Гц)

1 Ответ

0 голосов
/ 13 мая 2018

Нашел проблему.это было в скалере.

    ValueScaler scaleY = new ValueScaler(0,maxAmpPlus1 - yAxisMargin,0,baseY);
    ValueScaler scaleX = new ValueScaler(0,maxFreqPlus1 - xAxisMargin,0,baseX);

Я не учитывал поля x и y при масштабировании чисел.

...