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

Posted

技术标签:

【中文标题】如何从另一个音频波中减去一个音频波?【英文标题】:How to subtract one audio wave from another? 【发布时间】:2009-11-17 20:13:16 【问题描述】:

一般来说,在 C# 中(或者如果我们不能在 C/C++ 中的 C# 中做到这一点)

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

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

PS:都是关于 AEC 的……

【问题讨论】:

【参考方案1】:

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

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

对于 A 和 B 中的每个样本 S_AS_B

如果您对样本使用无符号值,那么您需要做更多的工作:首先,您需要将它们转换为中心为零的有符号值(例如,如果您有 16 位无符号样本,请从每个),然后应用公式,然后将它们转换回无符号格式。小心溢出 - 下面是如何对上述 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;

【讨论】:

减去两个信号与将一个信号添加到另一个信号的 180 度相移版本相同。除以二使结果信号的功率(电平)与单个输入信号相同 - 如果您不这样做,那么您的结果信号将被有效放大 6dB(并且可能会削波)。跨度> 直觉上,我对此有疑问。假设S_B 全为 0(无声)。在这种情况下,您希望结果S_CS_A 相同。您签名的公式导致S_CS_A 的一半。【参考方案2】:

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

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

【讨论】:

为我服务,因为我不看海报。对此感到抱歉。 我猜他是在 Taxonomist 徽章之后:***.com/questions/tagged/aec

以上是关于如何从另一个音频波中减去一个音频波?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测(心电图)波中的模式?

如何停止从另一个 ViewModel 按钮播放音频

用小波分析法除去音频信号的噪声

如何在 Java 中创建带有一些修改的音频正弦波文件?

ffmpeg:如何将音频波文件循环到没有任何音频通道的视频中

如何绘制音频波?