浏览招聘信息时看到对自适应滤波方法要求,惊呼之前竟然没有听过,赶紧学来一学
LMS
自适应滤波器: 一种能够根据输入信号自动调整自身参数的数字滤波器。
对于我们无法提前知道参数的信号,使用自适应的系数进行处理。不需要提前知道信号的输入和噪声特性,滤波器在工作过程中学习估计信号统计特征,调整参数以获得最优滤波效果。
一旦信号统计特性发生变化,还可以跟踪这种变化,重新调节参数,使滤波性能重新达到最优。
维纳滤波,也即最小均方误差滤波(Least Mean Square Error Filter)
核心计算:梯度下降法,均方误差,令导数为0;
自适应滤波器
自适应滤波器不需要关于输入信号的先验知识,计算量小,特别适用于实时处理。
维纳滤波器参数是固定的,适合于平稳随机信号。
卡尔曼滤波器参数是时变的,适合于非平稳随机信号。
LMS算法的优缺点:
-
优点:算法简单,易于实现,算法复杂度低,能够抑制旁瓣效应;
-
缺点
-
收敛速率较慢,LMS滤波器系数逐点更新,每一次采样点梯度的估计对于真实梯度会存在误差,导致滤波器系数的每次更新不会严格按照真实梯度方向更新,而是有一定的偏差;
-
跟踪性能较差,并且随着滤波器步长增大,系统的稳定性下降;
-
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)