If the samples are normalised to the same level, and are stored in a signed format such that the "zero level" is 0
or 0.0
, the answer is fairly simple:
S_C = (S_A / 2) - (S_B / 2);
for each sample S_A
and S_B
in A and B.
If you are using unsigned values for the samples then you will need to do more work: first, you need to convert them to a signed value with a zero centre (eg, if you have 16 bit unsigned samples, subtract 32768 from each), then apply the formula, then convert them back to the unsigned format. Be careful of overflow - here's an example of how to do the conversions for the aforementioned 16 bit samples:
#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;
}