可以使用哪些方法来识别和消除音频系统中的回声?


14

背景

我正在设计一个系统,该系统将具有一个用于电话类型设置的单个小型麦克风和扬声器。我可以举的最简单的例子是Skype对话,您在其中使用计算机扬声器和台式麦克风。

我担心来自扬声器的音频会被麦克风拾取并发送回原来的人。我曾经在VoIP对话的早期一直听到这种情况,但是几乎再也听不到。

我的假设是,小组已经想出了消除回声的方法,但是他们怎么做呢?

方法

我的第一个想法是仅从麦克风信号中减去发送到扬声器的信号,除非使用这种方法,您必须考虑延迟。我不确定如何在没有某种预校准的情况下确定延迟是什么,我想避免这种情况。还有一个问题是在减去信号之前要缩放多少信号。

接下来,我考虑在扬声器信号和麦克风信号之间进行某种关联,以便确定麦克风信号为回声的可能性以及确定实际延迟的可能性。当我处理一些记录的信号时,该方法可以正常工作,但是在计算相关性以在实时系统中有用时,似乎存在很大的延迟。而且,扬声器上的可调音量使得很难确定是否确实相关。

我的下一个想法是,互联网上肯定有人成功完成了此任务,但没有找到任何很好的例子。因此,我来​​这里看看可以使用哪些方法来解决此类问题。


1
回声消除是一个很大的主题领域,涉及该主题的书籍和研究论文已有数十年之久。这是关于此主题的一个SO问答:stackoverflow.com/questions/3403152/acoustic-echo-cancellation-in-java
hotpaw2 2011年

1
@ hotpaw2不确定为什么无法单击Java链接中的回声消除功能
Mark Booth

请建议我,我正在尝试消除语音中出现的回声,即输入到礼堂中单个麦克风的声音。正如您提到的自适应滤波器一样,我正在尝试,因为您正在提供参考信号作为远端通话。但我这里没有参考信号。我的信号是原始信号的回声,比如说与扬声器信号一起传到麦克风的时间为500ms。

Answers:


15

你是对的。存在许多回声消除方法,但没有一种是很简单的。最通用和流行的方法是通过自适应滤波器进行回声消除。一句话,自适应滤波器的作用是通过最小化来自输入的信息量来更改其正在播放的信号。

自适应滤波器

自适应(数字)滤波器是一种可更改其系数并最终收敛到某种最佳配置的滤波器。通过将滤波器的输出与某个所需的输出进行比较,可以进行这种调整。下面是通用自适应滤波器的示意图:

在此处输入图片说明

正如可以从图中看到的,信号是通过过滤(用卷积)瓦特 Ñ以产生输出信号d [ Ñ ]。我们然后减去d [ Ñ ]期望信号d [ Ñ ],以产生误差信号ë [ Ñ ]。请注意,w n是系数的向量,而不是数字(因此,我们不写w [ n ]x[n]wnd^[n]d^[n]d[n]e[n]wnw[n])。因为它每次迭代都会改变(每个样本),所以我们用下标这些系数的当前集合。一旦获得e [ n ],我们就可以使用它通过选择的更新算法来更新w n(稍后会详细介绍)。如果输入和输出满足不随时间改变并给予一个精心设计的更新算法的线性关系,瓦特 Ñ将最终收敛到最优滤波器和d [ Ñ ]将密切以下d [ Ñ ]ne[n]wnwnd^[n]d[n]

回声消除

回波消除的问题可以用自适应滤波器问题来表示,在这种情况下,我们试图通过找到满足输入输出关系的最佳滤波器来产生给定输入的一些已知理想输出。特别是,当您拿起耳机并说“你好”时,它会在网络的另一端被接收,会被房间的声音响应改变(如果正在大声播放),然后反馈到网络中以返回对你的回应。但是,由于系统知道初始的“ hello”听起来像什么,现在又知道混响和延迟的“ hello”听起来像什么,我们可以尝试使用自适应滤波器来猜测房间的响应。然后我们可以使用该估算值,将所有输入信号与该脉冲响应进行卷积(这将为我们提供回声信号的估计值),并将其从您呼叫的人的麦克风中减去。下图显示了自适应回声消除器。

在此处输入图片说明

在此图中,您的“ hello”信号为。从扬声器中弹出后,从墙壁上弹起并被设备的麦克风拾起,成为回声信号d [ n ]。自适应滤波器w nx [ n ]并产生输出y [ n ],在收敛后应该理想地跟踪回波信号d [ n ]。因此e [ n ] = d [ n ]x[n]d[n]wnx[n]y[n]d[n]最终应归零,因为没有人在线路的另一端讲话,通常是在刚拿起耳机并说“你好”的情况下。这并不总是正确的,稍后将讨论一些非理想的案例考虑。e[n]=d[n]y[n]

在数学上,NLMS(归一化最小均方)自适应滤波器的实现如下。我们使用上一步的错误信号更新每一步。即让wn

xn=(x[n],x[n1],,x[nN+1])T

Nwnx

wn=(w[0],w[1],,x[N1])T

y[n]=xn=wn

y[n]=xnTwn=xnwn

w

wn+1=wn+μxne[n]xnTxn=wn+μxnxnTwnd[n]xnTxn

μ0μ2

现实生活中的应用和挑战

这种回声消除方法可能会带来一些困难。首先,如前所述,在接收到您的“ hello”信号时,对方并不总是保持沉默。可以表明(但不在本答复的范围之内),在某些情况下,当线路的另一端存在大量输入时,估计冲激响应仍然有用,因为输入信号和回波是假设在统计上是独立的;因此,最小化错误仍然是有效的过程。通常,需要一种更复杂的系统来检测良好的时间间隔以进行回波估计。

另一方面,请考虑一下,当您试图估计回波时,如果接收到的信号接近静音(实际上是噪声),会发生什么情况。在没有有意义的输入信号的情况下,自适应算法将发散并迅速开始产生无意义的结果,最终达到随机回声模式。这意味着我们还需要考虑语音检测。现代的回声消除器看起来更像下图,但是上面的描述是它的精髓。

在此处输入图片说明

那里有很多关于自适应滤波器和回声消除的文献,还有一些您可以利用的开源库。


2
“自适应滤波器的工作就是信号”?你不小心一个字。
endlith 2014年

@endolith谢谢。我想不出一种解决它的好方法,所以我使用了alter。欢迎您使用更有趣的内容对其进行编辑。=)
声子

3

我不确定在没有某种预校准的情况下如何确定延迟是多少

我将从修改声学指纹算法(例如Shazam使用的算法)开始。

您的要求在许多方面类似于Shazam的要求(功能必须在为电话设计的压缩算法中有效,它们还必须通过低质量的麦克风传递),因此您可能会使用相同的功能(时间/频率空间中的局部功率最大值)您可能想以降低频率分辨率为代价来提高时间分辨率。

还存在在减去信号之前要缩放信号多少的问题。

统一缩放几乎肯定会不够精确。您需要做一些事情,例如用FIR滤波器近似频率响应,然后将(延迟的)麦克风信号通过反相滤波器,然后再从接收信号中减去它。


Shazam指纹无法产生准确的延迟近似值。它使用许多复杂的特征提取过程来比较音频样本,但并非全部都是基于时间的。
声子

@ Phonon,Shazam现在可能正在使用其他算法,但是链接论文中的算法是基于时间的,可以很好地估计延迟。
finnw 2011年

也许发送和接收频谱图的互相关性会告诉您延迟。应耐过滤和增加噪声的影响
Endolith 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.