【发布时间】:2018-04-21 05:55:32
【问题描述】:
float mixValue = ... //in range -1.0f to 1.0f
for(... ; ... ; ... ) //long loop
{
float inputLevel = ... //in range -1.0f to 1.0f
if(inputLevel < 0.0 && mixValue < 0.0)
{
mixValue = (mixValue + inputLevel) + (mixValue*inputLevel);
}
else
{
mixValue = (mixValue + inputLevel) - (mixValue*inputLevel);
}
}
只是一个简单的问题,我们可以计算mixValue 没有分支吗?或任何其他优化建议,例如使用 SIMD?
编辑: 只是为了更多信息,我结束了 根据选择的答案使用此解决方案:
const float sign[] = {-1, 1};
float mixValue = ... //in range -1.0f to 1.0f
for(... ; ... ; ... ) //long loop
{
float inputLevel = ... //in range -1.0f to 1.0f
unsigned a = *(unsigned*)(&mixValue);
unsigned b = *(unsigned*)(&inputLevel);
float mulValue = mixValue * inputLevel * sign[(a & b) >> (8*sizeof(unsigned)-1)];
float addValue = mixValue + inputLevel;
mixValue = addValue + mulValue;
}
谢谢。
【问题讨论】:
-
你确定这正是你想要做的吗?
-
我敢肯定,它工作得很好,作为参考,您可以参考 [-1.0f,1.0f] 范围内浮点样本的音频波混合算法
-
请注意,如果
mixValue或inputLevel为 0.0,则两个分支是相同的。此外,如果inputLevel为0.0,您实际上不需要做任何事情。但我也怀疑公式是错误的。这样的公式通常是奇数或偶数;f(-x)==f(x)或f(-x)==-f(x)。你的也不是。 -
没错,如果上一个
mixValue==0然后mixValue=inputLevel,如果下一个inputLevel==0然后mixValue保持不变。您可以看到,就好像您将可听声音和静音声音混合在一起一样,不会有任何变化。但是如果你混合两个嘈杂的声音,并且这些声音的峰值是满足的,你就不能添加这两个值,因为它会超出最大值。 -
这篇文章很旧,但我还是会发表评论。您可以使用以下内容计算不乘的符号:
(float)(-1 + (int)(((a & b) >> (8*sizeof(unsigned)-1)) << 1))(数组索引具有隐式乘法)
标签: c++ optimization floating-point branch