C++ C++;在钳位信号上使用pow()或类似工具进行曲线可调的有效输入控制。0-1 DSP?

C++ C++;在钳位信号上使用pow()或类似工具进行曲线可调的有效输入控制。0-1 DSP?,c++,audio,signal-processing,vst,C++,Audio,Signal Processing,Vst,这是将输入值钳制在0-1和曲线值钳制在0-1之间的示例代码。曲线输入反转,使增加的值转换为更快的信号响应 此时曲线反转,0-1现在为1-0,输入和曲线被钳制为0-1 *output1_ptr++ = (pow(((std::clamp(*input_ptr++, 0.0f, 1.f) * 10.f) * 0.1f), std::clamp((-*curve_ptr++ + 1.0f), 0.005f, 1.f) * 10.f) * 10.f) * .1f; 这有助于提供凸面或凹面信号曲线,但需

这是将输入值钳制在0-1和曲线值钳制在0-1之间的示例代码。曲线输入反转,使增加的值转换为更快的信号响应

此时曲线反转,0-1现在为1-0,输入和曲线被钳制为0-1

*output1_ptr++ = (pow(((std::clamp(*input_ptr++, 0.0f, 1.f) * 10.f) * 0.1f), std::clamp((-*curve_ptr++ + 1.0f), 0.005f, 1.f) * 10.f) * 10.f) * .1f;
这有助于提供凸面或凹面信号曲线,但需要付出一定代价。pow()函数可以被越来越快的快速数学替换。Fast足够精确,是对pow()的改进。我的问题是,我是否可以重构这段代码以提高效率?下面是我如何得到快速数学,这有帮助,但必须有一个更好的方法?请帮助我加快这个过程,我将非常感谢你

static inline float
fastpow (float x,
         float p)
{
  return fastpow2 (p * fastlog2 (x));
}

static inline float
fasterpow (float x,
           float p)
{
  return fasterpow2 (p * fasterlog2 (x));
}

fasterlog2 (float x)
{
  union { float f; uint32_t i; } vx = { x };
  float y = vx.i;
  y *= 1.1920928955078125e-7f;
  return y - 126.94269504f;
}

static inline float
fasterlog (float x)
{
//  return 0.69314718f * fasterlog2 (x);

  union { float f; uint32_t i; } vx = { x };
  float y = vx.i;
  y *= 8.2629582881927490e-8f;
  return y - 87.989971088f;
}