浏览招聘信息时看到对自适应滤波方法要求,惊呼之前竟然没有听过,赶紧学来一学

LMS

自适应滤波器: 一种能够根据输入信号自动调整自身参数的数字滤波器。

对于我们无法提前知道参数的信号,使用自适应的系数进行处理。不需要提前知道信号的输入和噪声特性,滤波器在工作过程中学习估计信号统计特征,调整参数以获得最优滤波效果。

一旦信号统计特性发生变化,还可以跟踪这种变化,重新调节参数,使滤波性能重新达到最优。

维纳滤波,也即最小均方误差滤波(Least Mean Square Error Filter)

核心计算:梯度下降法,均方误差,令导数为0;

自适应滤波器

自适应滤波器不需要关于输入信号的先验知识,计算量小,特别适用于实时处理。

维纳滤波器参数是固定的,适合于平稳随机信号。

卡尔曼滤波器参数是时变的,适合于非平稳随机信号。

LMS算法的优缺点:

  • 优点:算法简单,易于实现,算法复杂度低,能够抑制旁瓣效应;

  • 缺点

    1. 收敛速率较慢,LMS滤波器系数逐点更新,每一次采样点梯度的估计对于真实梯度会存在误差,导致滤波器系数的每次更新不会严格按照真实梯度方向更新,而是有一定的偏差;

    2. 跟踪性能较差,并且随着滤波器步长增大,系统的稳定性下降;

    3. LMS要求不同时刻的输入向量x(n)线性无关——LMS 的独立性假设。如果输入信号存在相关性,会导致前一次迭代产生的梯度噪声传播到下一次迭代,造成误差的反复传播,收敛速度变慢,跟踪性能变差。

block LMS

块更新自适应迭代

使用overlap m组平行信号构建系数向量

%% block LSM最小均方算法
%close all;
clear,clc;

%% 产生测试信号
fs = 1;
f0 = 0.02;
n = 1000;
t = (0:n-1)'/fs;
xs = cos(2*pi*f0*t);           % 原始信号
ws = awgn(xs, 30, 'measured'); % 含噪信号

figure;
subplot(211);plot(t, xs);title('原始信号');
subplot(212);plot(t, ws);title('加噪信号');

%%
M  = 20 ;   % 滤波器的阶数
xn = ws;                        % 含噪信号
dn = xs;                        % 理想信号
% rho_max = max(eig(ws*ws.'));   % 输入信号相关矩阵的最大特征值
% mu = (1/rho_max) ;    % 收敛因子 0 < mu < 1/rho
mu = 0.001;
[yn,W,en] = lmsFunc(xn,dn,M,mu);

figure;
ax1 = subplot(211);
plot(t,ws);grid on;ylabel('幅值');xlabel('时间');
ylim([-1.5 1.5]);title('LMS滤波器输入信号');

ax2 = subplot(212);
plot(t,yn);grid on;ylabel('幅值');xlabel('时间');title('LMS滤波器输出信号');
ylim([-1.5 1.5]);linkaxes([ax1, ax2],'xy');

figure;plot(en);grid on;title('误差');

函数

% 输入参数:
%   xn   输入的信号
%   dn   所期望的响应
%   M    滤波器的阶数
%   mu   收敛因子(步长)
% 输出参数:
%   W    滤波器系数矩阵  
%   en   误差序列 
%   yn   滤波器输出    
%%  block LMS
function [yn, W, en]=lmsFunc(xn, dn, M, mu)
itr = length(xn);
en = zeros(itr,1);            
W  = zeros(M,itr);    % M迭代,itr信号
% 迭代计算
for k = M:itr                  % 第k次迭代
    x = xn(k:-1:k-M+1);        % 滤波器M个抽头的输入
    y = W(:,k-1).' * x;        % 滤波器的输出
    en(k) = dn(k) - y ;        % 第k次迭代的误差
    % 滤波器权值计算的迭代式
    W(:,k) = W(:,k-1) + 2*mu*en(k)*x;
end

yn = inf * ones(size(xn)); % 初值为无穷大是绘图使用,无穷大处不会绘图
for k = M:length(xn)
    x = xn(k:-1:k-M+1);
    yn(k) = W(:,end).'* x;  % 最终输出结果
end

normalize LSM

归一化LSM,抑制X的过大迭代过快

%% normalize LMS最小均方算法
%close all;
clear,clc;

%% 产生测试信号
fs = 1;
f0 = 0.02;
n = 1000;
t = (0:n-1)'/fs;
xs = cos(2*pi*f0*t);
ws = awgn(xs, 20, 'measured');

figure;
subplot(211);plot(t, xs);title('原始信号');
subplot(212);plot(t, ws);title('加噪信号');

%% 
M  = 20 ;   % 滤波器的阶数
xn = ws;
dn = xs;
% rho_max = max(eig(ws*ws.'));   % 输入信号相关矩阵的最大特征值
% mu = (1/rho_max) ;    % 收敛因子 0 < mu < 1/rho
mu = 0.001;
delta = 1e-3;
%[yn,W,en] = lmsFunc(xn,dn,M,mu1);
[yn,W,en] = nlmsFunc(xn, dn, M, mu, delta);

figure;
ax1 = subplot(211);
plot(t,ws);grid on;ylabel('幅值');xlabel('时间');
ylim([-1.5 1.5]);title('LMS滤波器输入信号');

ax2 = subplot(212);
plot(t,yn);grid on;ylabel('幅值');xlabel('时间');title('LMS滤波器输出信号');
ylim([-1.5 1.5]);linkaxes([ax1, ax2],'xy');

figure;plot(en);grid on;title('误差');

函数

% 输入参数:
%   xn   输入的信号,列向量
%   dn   所期望的响应
%   M    滤波器的阶数
%   mu   收敛因子(步长)
% 输出参数:
%   W    滤波器系数矩阵  
%   en   误差序列 
%   yn   滤波器输出   
%% normalize LMS
function [yn, W, en]=nlmsFunc(xn, dn, M, mu, delta)
itr = length(xn);
en = zeros(itr,1);            
W  = zeros(M,itr);    % 每一列代表-次迭代,初始为0
% 迭代计算
for k = M:itr                  % 第k次迭代
    x = xn(k:-1:k-M+1);        % 滤波器M个抽头的输入
    y = W(:,k-1).' * x;        % 滤波器的输出
    en(k) = dn(k) - y ;        % 第k次迭代的误差
    % 滤波器权值计算的迭代式 % 主要为限制x的占比过大
    W(:,k) = W(:,k-1) + mu*en(k)*x/(delta+x.' * x); % A.'是一般转置 A'是共轭转置
end

yn = inf * ones(size(xn)); % 初值为无穷大是绘图使用,无穷大处不会绘图
for k = M:length(xn)
    x = xn(k:-1:k-M+1);
    yn(k) = W(:,end).'* x;  % 最终输出结果
end

参考链接

五、维纳滤波器LMS和自适应滤波器及其应用 - 知乎 (zhihu.com)

自适应滤波器(一)LMS自适应滤波器 - 知乎 (zhihu.com)

自适应滤波器(二)NLMS自适应滤波器 - 知乎 (zhihu.com)

自适应滤波方法——LMS算法 - 知乎 (zhihu.com)