Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to subtract one audio wave from another?

Tags:

c++

c

c#

aec

How to subtract one audio wave from another? In general and in C# (or if we cannot do it in C# in C/C++)

I have sound wave A and sound wave B (BTW: they are in PCM) I want to subtract B from A

What do I need? Open Source Libs (NOT GPL, but LGPL will be ok) Tutorials on how to do such operation (with or without using libs) Articles on this topic

PS: it’s all about AEC…

like image 540
Rella Avatar asked Nov 17 '09 20:11

Rella


People also ask

How do you invert in auditions?

If you want to invert part of a waveform, select the desired range. Or, deselect all audio data to invert the entire waveform. Choose Effects > Invert.


1 Answers

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;
}
like image 120
caf Avatar answered Sep 28 '22 23:09

caf