目前我正在尝试为AudioResamplerDyn做一些SSE优化,它看起来只有ARM霓虹灯优化。
在我的实现过程中,我对AudioResamplerFirProcess.h中的插值函数有疑问:
template<typename TC, typename TINTERP>
inline
TC interpolate(TC coef_0, TC coef_1, TINTERP lerp)
{
return lerp * (coef_1 - coef_0) + coef_0;
}
template<>
inline int16_t interpolate<int16_t, uint32_t>(int16_t coef_0, int16_t coef_1, uint32_t lerp)
{ // in some CPU architectures 16b x 16b multiplies are faster.
return (static_cast<int16_t>(lerp) * static_cast<int16_t>(coef_1 - coef_0) >> 15) + coef_0;
}
(int16_t,uint32_t)的代码让我很困惑,因为它看起来不是lerp *(coef_1 - coef_0)+ coef_0的实现,它将用于(float,float)。如果有人知道为什么float和int使用不同的算术?