我想在音频显示中以以下频率绘制垂直线:
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)
会是什么样?谢谢。
答案 0 :(得分:2)
公式很简单
ln(x/20.0) / ln(1000)
它将20转换为0、200转换为1 / 3、2000转换为2 / 3、20000转换为1