自适应滤波(LMS)

滤波器介绍

  • 算法背景
    LMS算法,是基于维纳滤波器理论的最小均方算法。自适应滤波器由于同时具备传统Wiener滤波器的简单、易实现和Kalman滤波器的滤波效果好两个优点。

  • 理论公式
    y(n) = WT(n)x(n)
    e(n) = d(n) - y(n)
    W(n+1) = W(n) + 2μe(n)x(n)

  • 变量
    x(n):输入信号
    d(n):参考信号,有时候也叫期望信号。针对不同应用场景,参考信号,既可以是有效信号(信号增强),也可以是噪声信号(去噪)。在语音信号的线性预测中,将延时后的输入信号作为参考信号d(n),即d(n)=x(n-i)。在自适应回音消除中,期望信号的输入就是回声通道产生的回声。
    e(n):误差信号
    y(n):输出信号

  • 应用场景
    LMS算法常见有四种应用:干扰消除、预测、反演模拟和辨识。不同的功能,对应不同的结构。

feature of LMS DF
1.相比IIR,不存在相位延迟
2.自适应滤波器随之迭代次数增加,效果变好;随之阶数增加,效果也会变好(但运行时间会变长)
3.算法简单,易实现,算法复杂度低,能够移植旁瓣效应。

Matlab代码

点击查看代码
Fs = 1000; %采样率
N = 1000; %采样点数
n = 0:N-1;
t = 0:1/Fs:1-1/Fs; %时间序列

Signal_Original_1 =sin(2*pi*10*t)+sin(2*pi*20*t)+sin(2*pi*30*t);
Noise_White_1 = [0.3*randn(1,500), rand(1,500)]; %前 500 点高斯分部白噪声,后 500 点均匀分布白噪声
Mix_Signal_1 = Signal_Original_1 + Noise_White_1; %构造的混合信号

Signal_Original_2 = [zeros(1,100), 20*ones(1,20), -2*ones(1,30), 5*ones(1,80), -5*ones(1,30), 9*ones(1,140), -4*ones(1,40),3*ones(1,220), 12*ones(1,100), 5*ones(1,20), 25*ones(1,30), 7 *ones(1,190)];
Noise_White_2 = 0.5*randn(1,1000); %高斯白噪声
Mix_Signal_2 = Signal_Original_2 + Noise_White_2; %构造的混合信号

%混合信号 Mix_Signal_1 自适应滤波
N = 1000; %输入信号抽样点数 N
k = 100; %时域抽头 LMS 算法滤波器阶数
u = 0.001; %步长因子

%设置初值
yn_1 = zeros(1, N); %output signal
yn_1(1:k) = Mix_Signal_1(1:k); %将输入信号 SignalAddNoise 的前 k 个值作为输出 yn_1 的前 k 个值
w = zeros(1, k); %设置抽头加权初值
e = zeros(1, N); %误差信号

%用 LMS 算法迭代滤波
for i = (k + 1):N
    XN = Mix_Signal_1((i - k + 1):i);
    yn_1(i) = w * XN';
    e(i) = Signal_Original_1(i) - yn_1(i);
    w = w + 2 * u * e(i) * XN;
end

subplot(4, 1, 1);
plot(Mix_Signal_1); %Mix_Signal_1 原始信号
axis([k + 1, 1000, -4, 4]);
title('原始信号');
subplot(4, 1, 2);
plot(yn_1); %Mix_Signal_1 自适应滤波后信号
axis([k + 1, 1000, -4, 4]);
title('自适应滤波后信号');


%混合信号 Mix_Signal_2 自适应滤波
N = 1000; %输入信号抽样点数 N
k = 500; %时域抽头 LMS 算法滤波器阶数
u = 0.000011; %步长因子

%设置初值
yn_1 = zeros(1, N); %output signal
yn_1(1:k) = Mix_Signal_2(1:k); %将输入信号 SignalAddNoise 的前 k 个值作为输出 yn_1 的前 k 个值
w = zeros(1, k); %设置抽头加权初值
e = zeros(1, N); %误差信号

%用 LMS 算法迭代滤波
for i = (k + 1):N
    XN = Mix_Signal_2((i - k + 1):i);
    yn_1(i) = w * XN';
    e(i) = Signal_Original_2(i) - yn_1(i);
    w = w + 2 * u * e(i) * XN;
end

subplot(4, 1, 3);
plot(Mix_Signal_2); %Mix_Signal_2 原始信号
axis([k + 1, 1000, -10, 30]);
title('原始信号');

subplot(4, 1, 4);
plot(yn_1); %Mix_Signal_2 自适应滤波后信号
axis([k + 1, 1000, -10, 30]);
title('自适应滤波后信号');

波形参考

posted @   Charles_hui  阅读(1472)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示