1.基本原理
y ( n ) = x ( n ) w T e ( n ) = d ( n ) − y ( n ) w ( n + 1 ) = w ( n ) + μ e ( n ) x ( n ) \begin{aligned} &y(n)=\pmb{x}(n)\pmb{w}^T\\ &e(n)=d(n)-y(n)\\ &w(n+1)=w(n)+\mu e(n)\pmb{x}(n) \end{aligned} y(n)=xx(n)wwTe(n)=d(n)−y(n)w(n+1)=w(n)+μe(n)xx(n)
2.代码实现
LMS:使用不含噪声的信号作为参考信号
%自适应滤波器的最小均方算法LMS
%初始化参数
clear;close;
t = 0:0.0001:1-0.0001;
f = 4;
%产生正弦信号和噪声污染的信号
d = cos(2 * pi * f * t) + sin(2 * pi * f * t);
n = randn(size(t));
x = d +0.5* n;
w = [0 0.5]; % w的len是2,所以是2阶
u = 0.0002; % 梯度下降算法的学习率
%2阶自适应滤波
y = zeros(10000, 1);
e = zeros(10000, 1);
for i = 1:10000 - 1
y(i + 1) = x(i : i + 1) * w';
e(i + 1) = d(i + 1) - y(i + 1);
w = w + 2 * u * e(i + 1) * x(i : i + 1);
end
%画图
figure(1);subplot(311);plot(t, d);axis([0 1 -5 5]);xlabel('时间');ylabel('s幅度');
hold on
subplot(312);plot(t, x);axis([0 1 -5 5]);xlabel('时间');ylabel('x幅度');
hold on
subplot(313);plot(t, y);axis([0 1 -5 5]);xlabel('时间');ylabel('e幅度');
LMS:使用噪声作为参考信号
%自适应滤波器的最小均方算法LMS
%初始化参数
clear;close;
t = 0:0.0001:1-0.0001;
f = 4;
%产生正弦信号和噪声污染的信号
s = cos(2 * pi * f * t) + sin(2 * pi * f * t);
x = randn(size(t));
d = s +0.5* x;
w = [0 0.5]; % w的len是2,所以是2阶
u = 0.0002; % 梯度下降算法的学习率
%2阶自适应滤波
y = zeros(10000, 1);
e = zeros(10000, 1);
for i = 1:10000 - 1
y(i + 1) = x(i : i + 1) * w';
e(i + 1) = d(i + 1) - y(i + 1);
w = w + 2 * u * e(i + 1) * x(i : i + 1);
end
%画图
figure(1);subplot(311);plot(t, s);axis([0 1 -5 5]);xlabel('时间');ylabel('s幅度');
hold on
subplot(312);plot(t, d);axis([0 1 -5 5]);xlabel('时间');ylabel('x幅度');
hold on
subplot(313);plot(t, e);axis([0 1 -5 5]);xlabel('时间');ylabel('e幅度');
扩展成三阶:
注意:发现权重的初值对去噪效果的影响比较大
%自适应滤波器的最小均方算法LMS
%初始化参数
clear;close;
t = 0:0.0001:1-0.0001;
f = 4;
%产生正弦信号和噪声污染的信号
s = cos(2 * pi * f * t) + sin(2 * pi * f * t);
x = randn(size(t));
d = s +0.5* x;
w = [0 0.5 0]; % w的len是3,所以是3阶
u = 0.0002; % 梯度下降算法的学习率
%2阶自适应滤波
y = zeros(10000, 1);
e = zeros(10000, 1);
for i = 1:10000 - 2
y(i + 1) = x(i : i + 2) * w';
e(i + 1) = d(i + 1) - y(i + 1);
w = w + 2 * u * e(i + 1) * x(i : i + 2);
end
%画图
figure(1);subplot(311);plot(t, s);axis([0 1 -5 5]);xlabel('时间');ylabel('s幅度');
hold on
subplot(312);plot(t, d);axis([0 1 -5 5]);xlabel('时间');ylabel('x幅度');
hold on
subplot(313);plot(t, e);axis([0 1 -5 5]);xlabel('时间');ylabel('e幅度');