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

Rel*_*lla 5 c c# c++ aec

如何从另一个中减去一个音频波?一般而言,在C#中(或者如果我们不能在C/C++中的C#中这样做)

我有声波A和声波B(BTW:它们在PCM中)我想从A中减去B

我需要什么?开源库(不是GPL,但LGPL会没问题)有关如何进行此类操作的教程(使用或不使用库)有关此主题的文章

PS:这都是关于AEC的......

caf*_*caf 6

如果样本被标准化为相同的级别,并以签名格式存储,使得"零级别"为00.0,则答案非常简单:

S_C = (S_A / 2) - (S_B / 2);
Run Code Online (Sandbox Code Playgroud)

对于每个样品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;
}
Run Code Online (Sandbox Code Playgroud)

  • 减去两个信号与将一个信号添加到另一个的180度相移版本相同.除以2保持结果信号的功率(电平)与单个输入信号相同 - 如果不这样做,那么您产生的信号将被有效放大6dB(并且可能会被削波). (7认同)
  • 只是好奇:为什么`/ 2`? (3认同)
  • 凭直觉,我对此有疑问。假设“ S_B”全为0(无声)。在这种情况下,您希望结果“ S_C”与“ S_A”相同。您签署的公式使“ S_C”变为“ S_A”的一半。 (2认同)