如何从另一个音频波形中减去一个音频波形?

5
如何从另一个音频波形中减去一个音频波形?无论是在常规情况下还是在使用C#(或者如果不能在C#中实现,则使用C/C++)时。

我有声音波形A和声音波形B(顺便说一下:它们都是PCM格式)。我想将B从A中减去。

我需要什么?
开源库(不是GPL,但LGPL可以),关于如何进行此操作的教程(使用库或不使用库均可),以及有关此主题的文章。

PS:这都与AEC有关...
2个回答

6

如果样本被归一化到相同的水平,并以有符号格式存储,使得“零级”为00.0,那么答案就很简单:

S_C = (S_A / 2) - (S_B / 2);

对于A和B中的每个样本S_AS_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;
}

7
将两个信号相减等同于将一个信号与另一个信号的180度相位移版本相加。除以二的操作可以使得输出信号的功率(电平)保持与输入信号相同 - 如果不进行这个操作,那么输出信号实际上将被放大6dB(并可能出现削波)。 - caf
2
直觉上,我对此有问题。假设 S_B 全是 0(静默)。在这种情况下,您希望结果 S_CS_A 相同。而您的有符号公式导致 S_C 变为 S_A 的一半。 - Adrian McCarthy

0

我不看海报,自作自受。对此感到抱歉。 - Glenn
我猜他在追求“分类学家”徽章:http://stackoverflow.com/questions/tagged/aec - dtb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接