LMS自适应滤波器模型与matlab仿真
一、LMS自适应滤波模型
假设x(n)为包含噪声的输入信号,y(n)为自适应滤波后的输出信号,d(n)为输入信号的参考信号,则信号的绝对误差e(n) = d(n)-y(n)。
均方误差J=E[e^2(n)],是自适应滤波最常用的指标,滤波器抽头系数的自适应表达式为:w(n+1)=w(n)+2ux(n)e*(n)。经过多次迭代后,使得J最小的一组w即为LMS自适应滤波器系数。模型结构如下图:
二、matlab程序
1.代码
代码如下:
%------------------------自适应滤波器结构------------------------
clc;
clear all;
close all;
g = 100;%统计仿真次数
N=10240;%输入信号抽样点数
k=128;%时域抽头 LMS算法滤波器阶数
pp = zeros(g,N-k);%将每次独立循环的误差结果存于矩阵pp中,以便后面对其平均
u=0.0002;
f = 24e6; %信号频率
phase = 0; %初始相位
a = 1; %振幅
Fs = 100e6; %采样率
ts = 1/Fs; %采样间隔
t = 0:ts:(N-1)*ts; %采样点数
s= a*cos(2*pi*f*t + phase); %原始信号
figure(1);
subplot(421)
plot(t,real(s));%信号s时域波形
title("信号时域波形");
xlabel('n');
ylabel('s');
K = 0;
f_len = (0:N/2-1)*(Fs/N);
s_fft = abs(fft(real(s)));
s_fft = 10*log10(s_fft(1:N/2));
subplot(422)
plot(f_len,s_fft);%信号频域波形
title("信号频域波形");
xlabel('f');
ylabel('s');
for q=1:g
%加入均值为零的高斯白噪声,信噪比为 10dB
xn = awgn(s,10)
% 设置初值
y=zeros(1,N); %输出信号y
y(1:k)=xn(1:k); %将输入信号xn的前k个值作为输出y的前k个值
w=zeros(1,k);%设置抽头加权初值
e=zeros(1,N);%误差信号
%用LMS法迭代滤波
for i=(k+1):N
XN=xn((i-k+1):(i));
y(i)=w*XN';
e(i)=s(i)-y(i);
w=w+u*e(i)*XN;
end
pp(q,:)=e((k+1):N).^2;
end
subplot(423)
plot(t,real(xn));%自适应滤波器输入信号xn时域波形
title("自适应滤波器输入信号xn时域波形");
xn_fft = abs(fft(real(xn)));
xn_fft = 10*log10(xn_fft(1:(N-K)/2));
subplot(424)
plot(f_len,xn_fft);%自适应滤波器输入信号xn频域波形
title("自适应滤波器输入信号xn频域波形");
xlabel('f');
ylabel('xf');
subplot(425)
plot(t,real(y));
title("自适应滤波输出信号y时域波形");
% K=0;
% f_len = (0:N/2-1)*(Fs/N);
y_fft = abs(fft(real(y)));
y_fft = 10*log10(y_fft(1:(N-K)/2));
subplot(426)
plot(f_len,y_fft)
title("自适应滤波输出信号频域波形");
for b=1:N-k
bi(b) = sum(pp(:,b))/g;%求误差的统计平均
end
t=1:N-k;
figure(2);% 算法收敛曲线
% subplot(427)
plot(t,bi,'r');
title("均方误差曲线");
hold on %将每次循环的图形显示结果保存下来
2.仿真结果
代码如下(示例):
三、结果分析
从仿真结果可以看出LMS自适应滤波具备较好的降噪功能,通过输出信号与参考信号的误差不断调整滤波器系数,使输出信号更接近输入信号。