自适应滤波(LMS)

发布时间 2023-10-10 14:50:12作者: Charles_hui

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('自适应滤波后信号');