5

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

我有声波 A 和声波 B(顺便说一句:它们在 PCM 中)我想从 A 中减去 B

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

PS:都是关于 AEC 的……

4

2 回答 2

6

如果样本被归一化到同一级别,并以有符号格式存储,使得“零级别”为00.0,则答案相当简单:

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

对于每个样本S_AS_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;
}
于 2009-11-17T23:24:32.873 回答
0

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

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

于 2009-11-17T20:38:29.703 回答