Если выборки нормализованы до одного и того же уровня и хранятся в формате со знаком, так что «нулевой уровень» равен 0
или 0.0
, ответ довольно прост:
S_C = (S_A / 2) - (S_B / 2);
для каждого образца S_A
и S_B
в A и B.
Если вы используете беззнаковые значения для сэмплов, вам потребуется проделать дополнительную работу: во-первых, вам необходимо преобразовать их в знаковое значение с нулевым центром (например, если у вас есть 16-битные беззнаковые сэмплы, вычтите 32768 из каждый), затем примените формулу, затем преобразуйте их обратно в неподписанный формат. Будьте осторожны с переполнением - вот пример того, как сделать преобразования для вышеупомянутых 16-битных выборок:
#define PCM_16U_ZERO 32768
short pcm_16u_to_16s(unsigned short u)
{
/* Ensure that we never overflow a signed integer value */
return (u < PCM_16U_ZERO) ? (short)u - PCM_16U_ZERO : (short)(u - PCM_16U_ZERO);
}
unsigned short pcm_16s_to_16u(short s)
{
/* As long as we convert to unsigned before the addition, unsigned arithmetic
does the right thing */
return (unsigned short)s + PCM_16U_ZERO;
}