Я бы предпочел прокомментировать один из двух высоко оцененных ответов, но из-за моей скудной репутации (полагаю) я не могу.
«Отмеченный» ответ: сложите вместе, и клип будет правильным, но не если вы хотите избежать отсечения.
Ответ со ссылкой начинается с работоспособного алгоритма вуду для двух положительных сигналов в [0,1], но затем применяется некоторая очень неисправная алгебра, чтобы вывести совершенно неверный алгоритм для знаковых и 8-битных значений. Алгоритм также не масштабируется до трех или более входов (произведение сигналов будет уменьшаться, а сумма увеличивается).
Итак - преобразуйте входные сигналы в плавающие, масштабируйте их до [0,1] (например, 16-битное значение со знаком станет
float v = ( s + 32767.0 ) / 65536.0 (close enough...))
, а затем сложите их.
Чтобы масштабировать входные сигналы, вы, вероятно, должны выполнить некоторую фактическую работу, а не умножать или вычитать значение вуду. Я бы посоветовал сохранить средний рабочий объем, а затем, если он начнет дрейфовать высоко (выше 0,25, скажем) или низко (ниже 0,01, скажем), начать применять масштабное значение, основанное на объеме. По сути, это становится реализацией автоматического уровня и масштабируется с любым количеством входов. Лучше всего то, что в большинстве случаев он вообще не будет связываться с вашим сигналом.