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

时间:2009-11-17 20:13:16

标签: c# c++ c aec

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

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

我需要什么? 开源Libs(不是GPL,但LGPL会好的) 关于如何进行此类操作的教程(使用或不使用libs) 关于这个主题的文章

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

2 个答案:

答案 0 :(得分:5)

如果将样本标准化为相同级别,并以签名格式存储,使“零级别”为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;
}

答案 1 :(得分:0)

https://stackoverflow.com/questions/1723563/acoustic-echo-cancellation-aec-in-wpf-with-c提出类似的问题并得到一个可接受的答案。我认为建议的库确实有某种回声消除。

不幸的是我没有使用过任何开源音频库。我之前使用Fmod来处理音频,我不记得其中有任何AEC,但你可以在处理它时访问原始音频并在其上运行你自己的代码。