如何从另一个音频波中减去一个音频波?一般而言,在C#中(或者如果我们不能在C / C ++中用C#完成)
我有声波A和声波B(BTW:它们在PCM中) 我想从A中减去B
我需要什么? 开源Libs(不是GPL,但LGPL会好的) 关于如何进行此类操作的教程(使用或不使用libs) 关于这个主题的文章
PS:这都是关于AEC ......
答案 0 :(得分:5)
如果将样本标准化为相同级别,并以签名格式存储,使“零级别”为0
或0.0
,则答案非常简单:
S_C = (S_A / 2) - (S_B / 2);
表示A和B中的每个样本S_A
和S_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,但你可以在处理它时访问原始音频并在其上运行你自己的代码。