【滤波器】归一化LMS自适应滤波器

一、NLMS自适应滤波器

1、简介

在自适应滤波算法中,稳态误差和收敛速度是其中2个最重要的性能指标。对于传统的固定步长自适应滤波器,在满足稳态误差和收敛速度上存在很大的矛盾:较小的步长能获得很小的稳态误差,但是收敛速度比较慢;另一方面,如果步长增大,则滤波器的收敛速度得以提高,但是以较大的稳态误差作为代价。
为此,人们提出了一种变步长的自适应滤波算法,即 归一化最小均方(Normalized Least Mean Square,NLMS)自适应滤波算法。该滤波算法在滤波初始阶段时的步长较大,收敛速度较快;当算法收敛后,通过减小步长,以保证较高的收敛精度。

看到这里大家是不是有一个疑问,NLMS算法只是在LMS算法的基础上做了归一化,它为什么是一种变步长的LMS算法?这个问题会在算法公式推导的最后面解释,请耐心看完。

2、原理推导

在LMS滤波器的权向量更新公式中, X ( n ) X(n) X(n)是含有噪声的信号,当 X ( n ) X(n) X(n)较大时,LMS算法会出现梯度噪声放大的问题,为了解决这个问题,可采用归一化LMS算法。
W ( n ) W(n) W(n) W ( n + 1 ) W(n+1) W(n+1) 分别表示第 n n n 时刻和 n + 1 n+1 n+1 时刻的权向量,则归一化LMS滤波器的设计准则可表述为下面的约束优化问题:
给定输入向量 X ( n ) X(n) X(n) 和期望输出 d ( n ) d(n) d(n),确定更新的权向量为 W ( n + 1 ) W(n+1) W(n+1),以使增量向量 δ W ( n + 1 ) = W ( n + 1 ) − W ( n ) δW(n+1)=W(n+1)-W(n) δW(n+1)=W(n+1)W(n) 的欧式范数最小化,即
m i n ∣ ∣ δ W ( n + 1 ) ∣ ∣ min||δW(n+1)|| min∣∣δW(n+1)∣∣
上式受限于约束条件 W ( n + 1 ) H ⋅ X ( n ) = d ( n ) W(n+1)^H·X(n)=d(n) W(n+1)HX(n)=d(n)
使用拉格朗日乘数法将约束优化问题转换为无约束优化问题,并构建实值二次代价函数:
J ( n ) = ∣ ∣ δ W ( n + 1 ) ∣ ∣ 2 + R e [ λ ∗ ( d ( n ) − W ( n + 1 ) H ⋅ X ( n ) ) ] J(n)=||δW(n+1)||²+Re[λ^*(d(n)-W(n+1)^H·X(n))] J(n)=∣∣δW(n+1)2+Re[λ(d(n)W(n+1)HX(n))]
其中, λ λ λ 为复数拉格朗日乘子, ∗ * 表示复共轭, R e Re Re 表示取实部运算。
进一步,有:
J ( n ) = [ W ( n + 1 ) − W ( n ) ] H ⋅ [ W ( n + 1 ) − W ( n ) ] + λ [ d ( n ) − W ( n + 1 ) H ⋅ X ( n ) ] J(n)=[W(n+1)-W(n)]^H·[W(n+1)-W(n)]+λ[d(n)-W(n+1)^H·X(n)] J(n)=[W(n+1)W(n)]H[W(n+1)W(n)]+λ[d(n)W(n+1)HX(n)]
为使得代价函数 J ( n ) J(n) J(n) 有最小值,其对 W ( n + 1 ) W(n+1) W(n+1)进行求导:
∂ J ( n ) ∂ W ( n + 1 ) = 2 [ W ( n + 1 ) − W ( n ) ] − λ ⋅ X ( n ) \frac{∂J(n)}{∂W(n+1)}=2[W(n+1)-W(n)]-λ·X(n) W(n+1)J(n)=2[W(n+1)W(n)]λX(n)
∂ J ( n ) ∂ W ( n + 1 ) = 0 \frac{∂J(n)}{∂W(n+1)}=0 W(n+1)J(n)=0,则 W ( n + 1 ) = W ( n ) + 1 2 λ ⋅ X ( n ) W(n+1)=W(n)+\frac{1}{2}λ·X(n) W(n+1)=W(n)+21λX(n),将其代入约束条件可得:
d ( n ) = [ W ( n ) + 1 2 λ ⋅ X ( n ) ] H ⋅ X ( n ) = W H ( n ) ⋅ X ( n ) + 1 2 λ ⋅ X H ( n ) ⋅ X ( n ) = W H ( n ) ⋅ X ( n ) + 1 2 λ ⋅ ∣ ∣ X ( n ) ∣ ∣ 2 d(n)=[W(n)+\frac{1}{2}λ·X(n)]^H·X(n)=W^H(n)·X(n)+\frac{1}{2}λ·X^H(n)·X(n)=W^H(n)·X(n)+\frac{1}{2}λ·||X(n)||² d(n)=[W(n)+21λX(n)]HX(n)=WH(n)X(n)+21λXH(n)X(n)=WH(n)X(n)+21λ∣∣X(n)2
又因为 d ( n ) − W H ( n ) ⋅ X ( n ) = e ( n ) d(n)-W^H(n)·X(n)=e(n) d(n)WH(n)X(n)=e(n),将其代入上式可得:
λ = 2 e ( n ) ∣ ∣ X ( n ) ∣ ∣ 2 λ=\frac{2e(n)}{||X(n)||²} λ=∣∣X(n)22e(n)
综合上述的几个式子,可得:
δ W ( n + 1 ) = W ( n + 1 ) − W ( n ) = 1 2 λ ⋅ X ( n ) = X ( n ) ∣ ∣ X ( n ) ∣ ∣ 2 ⋅ e ( n ) δW(n+1)=W(n+1)-W(n)=\frac{1}{2}λ·X(n)=\frac{X(n)}{||X(n)||²}·e(n) δW(n+1)=W(n+1)W(n)=21λX(n)=∣∣X(n)2X(n)e(n)
为了对一次迭代到下一次迭代抽头权向量的增量变化进行控制而不改变向量的方向,引入一个正的实数标量因子 μ μ μ, 可得:
μ ⋅ δ W ( n + 1 ) = μ ⋅ [ W ( n + 1 ) − W ( n ) ] = μ ⋅ 1 2 λ ⋅ X ( n ) = μ ⋅ X ( n ) ∣ ∣ X ( n ) ∣ ∣ 2 ⋅ e ( n ) μ·δW(n+1)=μ·[W(n+1)-W(n)]=μ·\frac{1}{2}λ·X(n)=\frac{μ·X(n)}{||X(n)||²}·e(n) μδW(n+1)=μ[W(n+1)W(n)]=μ21λX(n)=∣∣X(n)2μX(n)e(n)
最终求得代价函数 J ( n ) J(n) J(n) 的最优解为:
W ( n + 1 ) = W ( n ) + μ ∣ ∣ X ( n ) ∣ ∣ 2 X ( n ) ⋅ e ( n ) W(n+1)=W(n)+\frac{μ}{||X(n)||²}X(n)·e(n) W(n+1)=W(n)+∣∣X(n)2μX(n)e(n)
上式就是归一化LMS的权向量更新公式,它表明了乘积向量 X ( n ) ⋅ e ( n ) X(n)·e(n) X(n)e(n) 相对于抽头输入向量 X ( n ) X(n) X(n) 的欧式范数平方进行了归一化。
为了保证 μ ∣ ∣ X ( n ) ∣ ∣ 2 \frac{μ}{||X(n)||²} ∣∣X(n)2μ 的分母不为零,令 ∣ ∣ X ( n ) ∣ ∣ 2 ||X(n)||² ∣∣X(n)2 加上一个常数 α ( 0 < α ≤ 1 ) α(0<α≤1) α(0<α1),从而得到:
W ( n + 1 ) = W ( n ) + μ α + ∣ ∣ X ( n ) ∣ ∣ 2 X ( n ) ⋅ e ( n ) W(n+1)=W(n)+\frac{μ}{α+||X(n)||²}X(n)·e(n) W(n+1)=W(n)+α+∣∣X(n)2μX(n)e(n)
如果理解NLMS是一种变步长的LMS算法

μ α + ∣ ∣ X ( n ) ∣ ∣ 2 \frac{μ}{α+||X(n)||²} α+∣∣X(n)2μ 看做一个整体,即步长 μ ′ = μ α + ∣ ∣ X ( n ) ∣ ∣ 2 μ'= \frac{μ}{α+||X(n)||²} μ=α+∣∣X(n)2μ,当权向量在迭代更新的过程中,由于 X ( n ) X(n) X(n) 在变化,因此步长 μ ′ μ' μ 也会更新,即认为NLMS滤波器在工作的过程中,其步长会随输入信号 X ( n ) X(n) X(n) 而变化。

总结NLMS自适应滤波器的计算步骤如下:
y ( n ) = W T ( n ) X ( n ) y(n)=W^{T}(n)X(n) y(n)=WT(n)X(n) --------------------------------------------------------------- (1)

e ( n ) = d ( n ) − y ( n ) e(n)=d(n)-y(n) e(n)=d(n)y(n) ----------------------------------------------------------------- (2)

W ( n + 1 ) = W ( n ) + μ α + ∣ ∣ X ( n ) ∣ ∣ 2 X ( n ) ⋅ e ( n ) W(n+1)=W(n)+\frac{μ}{α+||X(n)||²}X(n)·e(n) W(n+1)=W(n)+α+∣∣X(n)2μX(n)e(n) ------------------------------- (3)

二、MATLAB仿真实验

1、滤波效果

当滤波器阶数 L = 20 L=20 L=20,步长因子 μ = 0.05 μ=0.05 μ=0.05 时,LMS滤波器与NLMS滤波器对信噪比为15dB的输入信号的滤波效果无明显区别。
若增大步长为0.06以上,LMS滤波器的收敛速度明显变快,但稳态误差会急剧上升,滤波器的性能变差;而NLMS滤波器仍然保持较好的滤波性能。
图1 两种滤波器的滤波效果对比
图2 滤波器的输出误差对比

clc;
clear;
close all;

%% 产生仿真信号
fs = 1000;                  % 采样频率
t = (0:1/fs:1-1/fs);        % 时间
f = 10;                     % 信号频率
x = sin(2*pi*f*t+pi/3);     % 原始信号
y = awgn(x,15,'measured');  % 添加高斯白噪声后的信号

%% NLMS自适应滤波器
L = 20;     % 滤波器阶数
Mu = 0.005;   % μ的范围为01
xn = y;     % 输入信号
dn = x;     % 期望信号
Alpha = 0.2;

[yn1, W1, en1] = LMS(xn,dn,L,Mu);
[yn2, W2, en2] = NLMS(xn, dn, L, Mu, Alpha);

%% 画图
figure;
subplot(3,1,1);plot(t,xn);xlabel('时间/s');ylabel('幅值');title('滤波器的输入信号');
subplot(3,1,2);plot(t,yn1);xlabel('时间/s');ylabel('幅值');title('LMS滤波器的输出信号');
subplot(3,1,3);plot(t,yn2);xlabel('时间/s');ylabel('幅值');title('NLMS滤波器的输出信号');
figure;
subplot(2,1,1);plot(en1);title('LMS滤波器的误差信号收敛情况');
subplot(2,1,2);plot(en2);title('NLMS滤波器的误差信号收敛情况');
function [yn, W, en] = NLMS(xn, dn, M, mu, alpha)

% input:
%       xn: 输入信号,大小为 1 x n
%       dn: 期望信号
%       M:  滤波器的阶数
%       mu: 收敛因子(步长)
%       alpha: 矫正值
%  output:
%         yn:   输出信号
%         W:    输出权系数
%         en:   输出误差信号

    [m,n] = size(xn);
    if m>1  % 如果输入信号为一列,则进行转置
        xn = xn';
    end
    if m>1 && n>1
        fprintf('输入信号有误!请检查输入信号是否为一行序列');
    end
    
    itr = n;    % 迭代次数等于输入信号的长度
    en = zeros(1,itr);
    W  = zeros(M,itr);    % 初始化权值矩阵,每一列代表一次迭代

    % 求最优权系数
    for i = M:itr                   % 第i次迭代
        x = xn(i:-1:i-M+1);         % 滤波器M个抽头的输入
        y = x*W(:,i-1);             % 滤波器的输出
        en(i) = dn(i) - y;          % 第i次迭代的误差
        W(:,i) = W(:,i-1) + (mu * x' * en(i)) / (alpha + norm(x)^2); % 滤波器权值计算的迭代式
        % norm(x)^2等效为x*x'
    end
    
    % 求输出序列  
    yn = inf * ones(size(xn));      % 初值设置为无穷大,画图的时候yn的前M个值不会绘图
    for k = M:n
        x = xn(k:-1:k-M+1);  
        yn(k) = x*W(:,end);  % 最终输出结果
    end
end

2、 不同参数对滤波器性能的影响

(1)步长 μ μ μ
NLMS滤波器的步长分别取0.01,0.1,1,1.5时,得到误差信号的收敛情况如下图所示。由图可以看出,步长 μ μ μ 影响着收敛速度和滤波精度,随着 μ μ μ 的增大,收敛速度变快,但收敛后在最优解附近波动幅值变大,稳态精度相应降低;将 μ μ μ 值减小则可以保证滤波精度,但算法的收敛时间大大增加,对于实时性有较高要求的系统并不合适。因而需要根据具体情况在收敛速度和滤波精度之间折中,合适的参数也与具体处理的信号特点有关,需要多次尝试取最优值。
不同步长的误差
(2)滤波器阶数 L L L
在 NLMS 滤波器的步长 μ = 0.1 μ=0.1 μ=0.1的条件下, 滤波器阶数 L L L取10,20,50时对应的误差信号收敛情况如下图所示。由图可见,随着滤波器的阶数增大,对信号的滤波精度有明显的提高,但是滤波器的输出信号中,缺失的数据量也随之增长。不同滤波器阶数对比波形

三、参考文献

[1] 杜建邦, 何金阳, 卓超. 基于最小均方自适应算法的光纤陀螺信号实时滤波方法[J]. 中国惯性技术学报, 2020, 28(06): 814-818+828.
[2] 张红梅, 韩万刚. 一种新的变步长LMS自适应滤波算法研究及其应用[J]. 仪器仪表学报, 2015, 36(08): 1822-1830.
[3] 何子述, 夏威等. 现代数字信号处理及其应用[M]. 北京: 清华大学出版社, 2009: 156-157.

  • 18
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
### 回答1: 归一化LMS(最小均方)算法是一种自适应滤波算法,用于信号处理和系统辨识。它通过调整滤波器的系数以使滤波器的输出尽可能地逼近期望输出,从而达到信号降噪或系统模型辨识的目的。 在Matlab中实现归一化LMS算法,可以按照以下步骤进行: 1. 初始化:定义输入信号x,期望输出信号d,滤波器的初始权重w和步长μ。 2. 进行迭代:对于每个时间步t,执行以下操作: - 根据当前权重w和输入信号x的乘积,计算滤波器的输出y(t)。 - 计算误差e(t) = d(t) - y(t)。 - 更新滤波器的权重w(t+1) = w(t) + μ * x(t) * e(t) / (||x(t)||^2 + ε),其中ε是一个小的正数,用于防止除以零。 3. 重复步骤2直到达到收敛条件,例如当滤波器的权重变化较小时或经过一定的迭代次数。 以下是一个简单的Matlab代码示例,演示如何实现归一化LMS算法: ```matlab % 初始化 x = ... % 输入信号 d = ... % 期望输出信号 w = zeros(size(x)); % 滤波器的权重 mu = ... % 步长 epsilon = ... % 防除零的小正数 % 迭代 for t = 1:length(x) % 计算输出 y = w'*x(t); % 计算误差 e = d(t) - y; % 更新权重 w = w + (mu * x(t) * e) / (norm(x(t))^2 + epsilon); end ``` 上述代码可以根据具体的信号处理或系统辨识问题进行修改和扩展。根据问题的复杂性,可能需要设置更多的参数和增加额外的收敛条件。 ### 回答2: 归一化LMS算法是一种基于最小均方误差的自适应滤波算法,常用于消除信号中的噪声。下面是使用MATLAB实现归一化LMS算法的代码: ```matlab % 设置输入信号 N = 1000; % 信号长度 x = randn(N, 1); % 原始信号 d = x + 0.1 * randn(N, 1); % 加入噪声 % 初始化参数 M = 10; % 滤波器系数个数 mu = 0.01; % 步长 w = zeros(M, 1); % 初始化权值 % 归一化LMS算法 for n = M:N xn = x(n:-1:n-M+1); % 选取输入向量 en = d(n) - w.' * xn; % 误差信号 w = w + mu * xn * (1 / (xn' * xn + eps)) * conj(en); % 更新权值 end % 绘制结果 figure; subplot(3,1,1); plot(1:N, x); title('原始信号'); xlabel('样本'); ylabel('幅值'); grid on; subplot(3,1,2); plot(1:N, d); title('加噪信号'); xlabel('样本'); ylabel('幅值'); grid on; subplot(3,1,3); plot(1:N-M+1, filter(w.' , 1, x(M:end))); title('滤波后信号'); xlabel('样本'); ylabel('幅值'); grid on; ``` 以上代码首先生成了一个长度为1000的随机信号x,并在其基础上加入高斯噪声,得到观测信号d。然后,通过使用归一化LMS算法对观测信号进行滤波,得到滤波后的信号。最后,将原始信号、加噪信号和滤波后信号在图形上分别绘制出来,便于观察滤波效果。 ### 回答3: 归一化LMS算法是一种常用的自适应滤波算法,适用于信号处理领域。在MATLAB中,可以通过以下步骤实现归一化LMS算法: 1. 初始化参数:首先,需要初始化系数矩阵W和滤波器的阶数L。 W = zeros(L, 1); mu = 0.1; % 自适应步长系数 2. 读取输入信号和期望输出信号:从文件或者生成数据输入到MATLAB中,并读取用于训练的输入信号x和期望输出信号d。 3. 归一化LMS算法主体:采取以下步骤实施归一化LMS算法: - 生成当前输入信号的预测输出y:y = W' * x; - 计算当前预测输出与期望输出之间的误差e:e = d - y; - 更新系数矩阵W:W = W + mu * e * x; - 对W进行归一化处理,即使其模长等于1:W = W / norm(W); 4. 重复步骤3直到满足算法停止条件,例如达到预设的迭代次数或误差阈值。 5. 输出结果:最终得到归一化LMS算法收敛后的滤波器系数W。 以上是MATLAB实现归一化LMS算法的基本步骤。在实际应用中,可以根据具体需求调整参数和算法的停止条件,以及对结果进行合理的评估和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhi Zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值