首页 > 解决方案 > 手动绘制的图表上的频率不正确

问题描述

我目前正在为大学编写 android 频谱分析仪,其中一部分涉及绘制声音的 FFT。但是,我在绘制频率时遇到问题。频率值一开始是正确的,但随着我移到更高的频率,误差变得越来越大(在 3000Hz 时,图表将显示 ~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 Hz

频率发生器设置为 1000 Hz(值为 1250Hz)

标签: androidgraphfft

解决方案


发现问题。它在缩放器中。

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

缩放数字时,我没有考虑 x 和 y 边距。


推荐阅读