日志空间变为线性?

时间:2018-11-21 01:53:48

标签: c++ math

我想在音频显示中以以下频率绘制垂直线:

float xp[] = {20.f, 30.f, 40.f, 50.f, 60.f, 70.f, 80.f, 90.f, 100.f,
              200.f, 300.f, 400.f, 500.f, 600.f, 700.f, 800.f, 900.f, 1000.f,
              2000.f, 3000.f, 4000.f, 5000.f, 6000.f, 7000.f, 8000.f, 9000.f, 10000.f,
              20000.f
        };

它们已经对数间隔,我想将它们转换为线性比例,例如20 = 0.0和20000 = 1.0。基本上与

相反
float logspace(float start, float stop, float t)
{
    return start * std::pow(stop/start, t);
}

我想创建一个log2Linear()函数,使其像这样使用:

for(int i = 0; i < 19; i++)
{
    // log2linear() would return a normalized value between 20 & 20000
    float normX = log2Linear(20.f, 20000.f, xp[i]);

    float x = normX * widthOfDisplay;
    // draw vertical line at x
}

logToLinear(float start, float stop, float t)会是什么样?谢谢。

1 个答案:

答案 0 :(得分:2)

公式很简单

  ln(x/20.0) / ln(1000)

它将20转换为0、200转换为1 / 3、2000转换为2 / 3、20000转换为1