Search code examples
c#c++caec

How to subtract one audio wave from another?


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…


Solution

  • 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;
    }