你是对的。存在许多回声消除方法,但没有一种是很简单的。最通用和流行的方法是通过自适应滤波器进行回声消除。一句话,自适应滤波器的作用是通过最小化来自输入的信息量来更改其正在播放的信号。
自适应滤波器
自适应(数字)滤波器是一种可更改其系数并最终收敛到某种最佳配置的滤波器。通过将滤波器的输出与某个所需的输出进行比较,可以进行这种调整。下面是通用自适应滤波器的示意图:
正如可以从图中看到的,信号是通过过滤(用卷积)→ 瓦特 Ñ以产生输出信号d [ Ñ ]。我们然后减去d [ Ñ ]从期望信号d [ Ñ ],以产生误差信号ë [ Ñ ]。请注意,→ w n是系数的向量,而不是数字(因此,我们不写w [ n ]x[n]w⃗ nd^[n]d^[n]d[n]e[n]w⃗ nw[n])。因为它每次迭代都会改变(每个样本),所以我们用下标这些系数的当前集合。一旦获得e [ n ],我们就可以使用它通过选择的更新算法来更新→ w n(稍后会详细介绍)。如果输入和输出满足不随时间改变并给予一个精心设计的更新算法的线性关系,→ 瓦特 Ñ将最终收敛到最优滤波器和d [ Ñ ]将密切以下d [ Ñ ]。ne[n]w⃗ nw⃗ nd^[n]d[n]
回声消除
回波消除的问题可以用自适应滤波器问题来表示,在这种情况下,我们试图通过找到满足输入输出关系的最佳滤波器来产生给定输入的一些已知理想输出。特别是,当您拿起耳机并说“你好”时,它会在网络的另一端被接收,会被房间的声音响应改变(如果正在大声播放),然后反馈到网络中以返回对你的回应。但是,由于系统知道初始的“ hello”听起来像什么,现在又知道混响和延迟的“ hello”听起来像什么,我们可以尝试使用自适应滤波器来猜测房间的响应。然后我们可以使用该估算值,将所有输入信号与该脉冲响应进行卷积(这将为我们提供回声信号的估计值),并将其从您呼叫的人的麦克风中减去。下图显示了自适应回声消除器。
在此图中,您的“ hello”信号为。从扬声器中弹出后,从墙壁上弹起并被设备的麦克风拾起,成为回声信号d [ n ]。自适应滤波器→ w n取x [ n ]并产生输出y [ n ],在收敛后应该理想地跟踪回波信号d [ n ]。因此e [ n ] = d [ n ]x[n]d[n]w⃗ nx[n]y[n]d[n]最终应归零,因为没有人在线路的另一端讲话,通常是在刚拿起耳机并说“你好”的情况下。这并不总是正确的,稍后将讨论一些非理想的案例考虑。e[n]=d[n]−y[n]
在数学上,NLMS(归一化最小均方)自适应滤波器的实现如下。我们使用上一步的错误信号更新每一步。即让w⃗ n
x⃗ n=(x[n],x[n−1],…,x[n−N+1])T
Nw⃗ nx
w⃗ n=(w[0],w[1],…,x[N−1])T
y[n]=x⃗ n=w⃗ n
y[n]=x⃗ Tnw⃗ n=x⃗ n⋅w⃗ n
w⃗
w⃗ n+1=w⃗ n+μx⃗ ne[n]x⃗ Tnx⃗ n=w⃗ n+μx⃗ nx⃗ Tnw⃗ n−d[n]x⃗ Tnx⃗ n
μ0≤μ≤2
现实生活中的应用和挑战
这种回声消除方法可能会带来一些困难。首先,如前所述,在接收到您的“ hello”信号时,对方并不总是保持沉默。可以表明(但不在本答复的范围之内),在某些情况下,当线路的另一端存在大量输入时,估计冲激响应仍然有用,因为输入信号和回波是假设在统计上是独立的;因此,最小化错误仍然是有效的过程。通常,需要一种更复杂的系统来检测良好的时间间隔以进行回波估计。
另一方面,请考虑一下,当您试图估计回波时,如果接收到的信号接近静音(实际上是噪声),会发生什么情况。在没有有意义的输入信号的情况下,自适应算法将发散并迅速开始产生无意义的结果,最终达到随机回声模式。这意味着我们还需要考虑语音检测。现代的回声消除器看起来更像下图,但是上面的描述是它的精髓。
那里有很多关于自适应滤波器和回声消除的文献,还有一些您可以利用的开源库。