使用归一化 LMS 自适应滤波器在 Simulink 中去除低频噪声
自适应滤波器跟踪系统的动态特性,并允许您消除时变信号。DSP System Toolbox™ 库包含实现最小均方 (LMS)、块 LMS、快速块 LMS 和递归最小二乘 (RLS) 自适应滤波器算法的模块。这些滤波器通过更改其滤波器系数来最小化输出信号和期望信号之间的差异。随着时间的推移,自适应滤波器的输出信号越来越逼近您要重现的信号。
在 Simulink 中设计自适应滤波器
在此示例中,您要设计一个 LMS 自适应滤波器来消除信号中的低频噪声:
如果您在向您的模型添加数字滤波器中创建的模型没有在您的桌面上打开,请打开 ex_gstut5
,它是等效模型。
在 MATLAB® 命令提示符下键入 dsplib
,以打开 DSP System Toolbox™ 库。
通过在您的系统中添加 LMS Filter 模块来消除信号中的低频噪声。在飞机场景中,这等效于从麦克风的输入中去除座舱内的风噪声。双击 Filtering 库,然后双击 Adaptive Filters 库。将 LMS Filter 模块添加到您的模型中。
设置 LMS Filter 模块参数,以对 Digital Filter Design 模块的输出进行建模。双击该模块以打开“LMS 滤波器”对话框。按照以下方式设置并应用模块参数:
算法 =
Normalized LMS
滤波器长度 = 32
步长指定方式 =
Dialog
步长(mu) = 0.1
泄漏因子(0 到 1) = 1.0
滤波器权重的初始值 = 0
清除自适应端口复选框。
重置端口 =
None
选中输出滤波器权重复选框。
基于这些参数,LMS Filter 模块使用归一化 LMS 方程计算滤波器权重。您指定的滤波器阶数与 Digital Filter Design 模块的滤波器阶数相同。步长(mu) 参数定义滤波器更新步的粒度。由于您将泄漏因子(0 到 1) 参数设置为 1.0,因此当前滤波器系数值取决于滤波器的初始条件和所有先前的输入值。滤波器权重(系数)的初始值为零。由于您选中了输出滤波器权重复选框,因此 Wts 端口会出现在模块上。该模块输出来自此端口的滤波器权重。
现在,您已设置 LMS Filter 模块的模块参数,可以将该模块纳入到您的模块图中。
向您的模型添加自适应滤波器
在此示例中,您要通过将在在 Simulink 中设计自适应滤波器中设计的自适应滤波器纳入到您的系统中来还原原始正弦信号。在飞机场景中,自适应滤波器对座舱内听到的低频噪声进行建模。因此,您可以去除噪声,使飞行员的声音成为麦克风的唯一输入:
如果您在在 Simulink 中设计自适应滤波器中创建的模型没有在您的桌面上打开,请打开 ex_gstut6
,它是等效模型。
向您的模型添加 Sum 模块,以从含有低频噪声的正弦信号中减去自适应滤波器的输出。从 Simulink® Math Operations 库中,将一个 Sum 模块拖入您的模型中。双击此模块打开“求和”对话框。将符号列表参数更改为 |+-,然后点击确定。
将 LMS Filter 模块纳入到您的系统中。
将 Random Source 模块的输出连接到 LMS Filter 模块的 Input 端口。在飞机场景中,随机噪声是由飞机外部的传感器测量的白噪声。LMS Filter 模块对飞机机身对噪声的影响进行建模。
将 Digital Filter Design 模块的输出连接到 LMS Filter 模块的 Desired 端口。这是您要 LMS 模块重新生成的信号。
将 LMS Filter 模块的输出连接到您在步骤 2 中添加的 Sum 模块的负端口。
将第一个 Sum 模块的输出连接到第二个 Sum 模块的正端口。您的模型的外观现在应如下图所示。
第二个 Sum 模块的正输入是输入信号和低频噪声之和,即 s(n) + y。第二个 Sum 模块的负输入是 LMS Filter 模块对低频噪声的最佳估计 y'。当您减去这两个信号时,您得到的是输入信号的近似值。
在此方程中:
是输入信号。
是输入信号的近似值。
是由 Random Source 模块和 Digital Filter Design 模块创建的噪声。
是由 LMS Filter 模块创建的噪声近似值。
由于 LMS Filter 模块只能创建噪声近似值,因此,输入信号与输入信号的近似值之间仍存在差异。在后续步骤中,您将设置 Scope 模块,以便将原始正弦信号与其近似值进行比较。
向 Scope 模块添加两个额外的输入和坐标区。双击 Scope 模块以打开“示波器”对话框。点击参数按钮。对于输入端口数目参数,请输入 4。点击确定以关闭对话框。
为新的示波器坐标区加标签。在示波器窗口中,右键点击第三个坐标区并选择坐标区属性。此时将打开“示波器属性: 坐标区 3”对话框。在标题框中,输入 Approximation of Input Signal
。点击确定以关闭对话框。对第四个坐标区重复此过程,并对其加标签 Error
。
将第二个 Sum 模块的输出连接到 Scope 模块的第三个端口。
将 LMS Filter 模块上的 Error 端口的输出连接到 Scope 模块的第四个端口。您的模型的外观现在应如下图所示。
在此示例中,Error 端口的输出是 LMS 滤波器的所需信号与其输出信号之差。由于误差从不为零,因此滤波器会继续修改滤波器系数,以便更好地逼近低频噪声。逼近越好,可以从正弦信号中去除的低频噪声就越多。在下一个主题查看自适应滤波器的系数中,您将了解如何查看随时间变化的自适应滤波器系数。
查看自适应滤波器的系数
自适应滤波器的系数根据所选的算法随时间而变化。一旦算法优化了滤波器的性能,这些滤波器系数就会达到其稳态值。在仿真运行时,您可以查看系数的变化,以了解它们稳定到稳态值的情况。然后,您可以确定是否可以在您的实际系统中实现这些值:
如果您在向您的模型添加自适应滤波器中创建的模型没有在您的桌面上打开,请打开 ex_gstut7
,它是等效模型。
请注意,输出滤波器权重的自适应滤波器的 Wts 端口仍需要连接。
在 MATLAB® 命令提示符下键入 dsplib
,以打开 DSP System Toolbox™ 库。
将 Time Scope 模块连接到 LMS Filter 模块的 Wts 端口以查看滤波器系数。
在 Time Scope 模块上,修改以下配置属性:
时间跨度 = 0.05
Y 范围(最小值) = -0.15
Y 范围(最大值) = 0.5
打开模型设置。在建模选项卡中,点击模型设置。在求解器窗格中,设置以下配置参数:
停止时间 =
inf
类型 =
Fixed-step
求解器 =
discrete (no continuous states)
我们建议对包含 DSP System Toolbox 模块的模型应用上述配置参数。由于这些模块直接计算值而不是求解微分方程,因此您必须将 Simulink® 求解器配置为像调度器一样运行。在调度器模式下,求解器使用模块的采样时间来确定每个模块背后的代码何时执行。例如,此模型中 Sine Wave 模块和 Random Source 模块的采样时间为 0.05。求解器每 0.05 秒执行一次这些模块背后的代码,以及具有此采样时间的其他每个模块背后的代码。
注意:使用包含 DSP System Toolbox 模块的模型时,请使用可让您指定其采样时间的源模块。如果您的源模块没有采样时间参数,您必须在模型中添加 Zero-Order Hold 模块,并使用它来指定采样时间。有关详细信息,请参阅Continuous-Time Source Blocks。此规则的例外是 Constant 模块,该模块可以具有固定采样时间。当此模块具有固定采样时间时,Simulink 会执行此模块,并在仿真开始时和您调节参数时记录一次常量值。这样可以实现更快的仿真和更紧凑的生成代码。
运行模型并在时域示波器中查看滤波器系数的行为,时域示波器会在仿真开始时自动打开。随着时间的推移,滤波器系数会逼近其稳态值。
您还可以在示波器窗口中查看系统的行为。随着时间的推移,您会看到误差减小,输入信号的近似值与原始正弦输入信号更加一致。
现在,您已创建一个能够自适应去除噪声的模型。
总结
您已学习如何使用 Digital Filter Design 模块设计低通滤波器。您还学习了如何使用 LMS Filter 模块创建一个自适应滤波器。DSP System Toolbox 产品还有能够设计和实现数字滤波器和自适应滤波器的其他模块。有关此产品的滤波功能的详细信息,请参阅滤波器设计和滤波器分析。
因为此模型中的所有模块都具有相同采样时间,所以该模型是单速率模型,并且 Simulink® 在单任务求解器模式下运行它。如果模型中的模块具有不同采样时间,则该模型是多速率模型,并且 Simulink 可能会在 MultiTasking 求解器模式下运行它。有关求解器模式的详细信息,请参阅Recommended Settings for Discrete-Time Simulations。
要了解如何使用 Simulink Coder™ 产品从您的模型生成代码,请参阅Generate C Code from Simulink Model。
另请参阅
LMS Filter | Digital Filter Design