我的同事和我正在模拟设备DSP上开发声音和语音处理模块。由于我们的单个麦克风和扬声器接近,我们一直在经历一些重要的回声。我们希望实现基于NLMS的算法来减少这种回声。
我首先想要实现它并在Matlab中测试算法,但我仍然遇到一些问题。我想我的算法可能会有一些理论问题。我很难理解什么是"所需的信号"在算法中因为我无法访问未损坏的信号。
以下是我在Matlab中实现此功能的简单方法的概述。 Simulink diagram here
现在代码无法编译,因为"代数循环错误"在Simulink,但我觉得这个问题还有更多。
任何帮助将不胜感激。
答案 0 :(得分:0)
您拥有的模型并不完全正确。对于声学回声消除,您使用自适应滤波器对房间进行建模。您正在使用自适应滤波器识别房间特征。完成此操作后,您可以使用自适应滤波器识别来自扬声器的远端信号的一部分,该信号返回麦克风并从麦克风信号中减去该信号以消除回声。
对于自适应滤波器,您的输入应该是来自远端的信号,该信号将是发送到房间中扬声器的信号。您想要的信号是房间内麦克风发出的信号。麦克风信号包含来自房间中人的声音的信号以及来自扬声器的一部分声音,即回声。
Sound from far end ----|In | Out (You can ignore this)
| Adaptive Filter |
Sound from local microphone ----|Desired | Error
在此模型中,自适应滤波器的误差输出信号是您想要的无回声信号。这是因为通过从所需的减去自适应滤波器输出来计算误差,这基本上是去除了回声。
要在Simulink中模拟此系统,您需要一个过滤器来表示房间。您可以使用普通的FIR滤波器。您应该能够在线获得房间冲动响应。这些通常是长(~1000)缓慢衰减的脉冲响应。您的音频源可以代表来自扬声器的信号。您将相同的音频信号输入此房间响应滤波器,您将获得所需的信号。将两者都馈入自适应滤波器将使自适应滤波器适应房间响应滤波器。