LMS 自适应滤波算法原理和实现(不使用自带函数库)

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幅度');
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KPer_Yang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值