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);
}
}
juste une simple question, peut-on calculer mixValue
sans ramification? ou toute autre suggestion d'optimisation, telle que l'utilisation de SIMD?, l'élimination de branchement
modifier: juste pour plus d'informations, je fini par en utilisant cette solution, basée sur la réponse choisie:
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;
}
merci.
Êtes-vous sûr que ce soit exactement ce que vous voulez faire? – sellibitze
Je suis sûr que c'est, cela fonctionne parfaitement, comme pour la référence, vous pouvez vous référer algorithme de mélange d'ondes audio pour échantillon à virgule flottante dans la plage de [-1.0f, 1.0f] – uray
Notez que si soit «mixValue» ou «inputLevel» est 0.0, alors les deux branches sont identiques. De plus, si 'inputLevel' est 0.0, vous n'avez rien à faire. Mais je soupçonne aussi que la formule est fausse. De telles formules sont généralement soit impaires, soit paires; soit 'f (-x) == f (x)' ou 'f (-x) == - f (x)'. Le tien n'est ni. – MSalters