matlab中lms m,LMS算法仿真(Matlab)

程序1:基本LMS算法

% 该程序实现时域LMS算法,并用统计的方法仿真得出不同步长下的收敛曲线

clear % 清空变量空间

g=100; % 统计仿真次数为g

N=1024; % 输入信号抽样点数N

k=128; % 时域抽头LMS算法滤波器阶数

pp=zeros(g,N-k); % 将每次独立循环的误差结果存于矩阵pp中,以便后

% 面对其平均

u=0.001; % 收敛因子

for

q=1:g

t=1:N;

a=1;

s=a*sin(0.5*pi*t); % 输入单频信号s

figure(1);

plot(t,real(s)); % 信号s时域波形

title('信号s时域波形');

xlabel('n');

ylabel('s');

axis([0,N,-a-1,a+1]);

xn=awgn(s,3);

% 加入均值为零的高斯白噪声,信噪比为3dB

% 设置初值

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

for b=1:N-k

bi(b)=sum(pp(:,b))/g; % 求误差的统计平均

end

figure(2); % 算法收敛曲线

t=1:N-k;

plot(t,bi);

hold

off % 将每次循环的图形显示结果保存下来

程序2 归一化LMS算法

MATLAB程序实现如下:

1.

NLMS算法1次实验

% N=训练序列长度

% u=收敛因子

clear;

N=500;

db=20;

sh1=sqrt(10^(-db/10));

u=1;

error_s=zeros(1,N);

for loop=1:1

w=0.05*ones(1,11)';

V=sh1*randn(1,N );

K=randn(1,N)-0.5;

x=sign(K);

for

n=3:N;

M(n)=0.3*x(n)+0.9*x(n-1)+0.3*x(n-2);

end

z=M+V;

for

n=8:N;

d(n)=x(n-7);

end

a(1)=z(1)^2;

for

n=2:11;

a(n)=z(n).^2+a(n-1);

end

for

n=12:N;

a(n)=z(n).^2-z(n-11)^2+a(n-1);

end

for

n=11:N;

z1=[z(n)

z(n-1) z(n-2) z(n-3) z(n-4) z(n-5) z(n-6) z(n-7) z(n-8) z(n-9)

z(n-10)]';

y(n)=w'*z1;

e(n)=d(n)-y(n);

w=w+u./(eps+a(n)).*z1.*conj(e(n));

end

error_s=error_s

+e.^2;

end

w

error_s=error_s./1;

n=1:N;

plot(n,error_s);

xlabel('n

(当u=1;DB=20时)');

ylabel('e(n)^2');

title('NLMS算法1次实验误差平方的均值曲线');

2.NLMS算法20次实验

clear;

N=500;

db=20;

sh1=sqrt(10^(-db/10));

u=1;

error_s=zeros(1,N);

for loop=1:20

w=0.05*ones(1,11)';

V=sh1*randn(1,N );

K=randn(1,N)-0.5;

x=sign(K);

for

n=3:N;

M(n)=0.3*x(n)+0.9*x(n-1)+0.3*x(n-2);

end

z=M+V;

for

n=8:N;

d(n)=x(n-7);

end

a(1)=z(1)^2;

for

n=2:11;

a(n)=z(n).^2+a(n-1);

end

for

n=12:N;

a(n)=z(n).^2-z(n-11)^2+a(n-1);

end

for

n=11:N;

z1=[z(n)

z(n-1) z(n-2) z(n-3) z(n-4) z(n-5) z(n-6) z(n-7) z(n-8) z(n-9)

z(n-10)]';

y(n)=w'*z1;

e(n)=d(n)-y(n);

w=w+u./(eps+a(n)).*z1.*conj(e(n));

end

error_s=error_s

+e.^2;

end

w

error_s=error_s./20;

n=1:N;

plot(n,error_s);

xlabel('n

(当u=1;DB=20时)');

ylabel('e(n)^2');

title('NLMS算法20次实验误差平方的均值曲线');

基于LMS算法的系统辨识

clear

clc

ee=0;

fs=800;

det=1/fs;

f1=100;

f2=200;

t=0:det:2-det;

x=randn(size(t))+cos(2*pi*f1*t)+cos(2*pi*f2*t);

%未知系统

[b,a]=butter(5,150*2/fs);

d=filter(b,a,x);

%自适应FIR滤波器

N=5;

delta=0.06;

M=length(x);

y=zeros(1,M);

h=zeros(1,N);

for

n=N:M

x1=x(n:-1:n-N+1);

y(n)=h*x1';

e(n)=d(n)-y(n);

h=h+delta.*e(n).*x1;

end

X=abs(fft(x,2048));

Nx=length(x);

kx=0:800/Nx:(Nx/2-1)*(800/Nx);

D=abs(fft(d,2048));

Nd=length(D);

kd=0:800/Nd:(Nd/2-1)*(800/Nd);

Y=abs(fft(y,2048));

Ny=length(Y);

ky=0:800/Ny:(Ny/2-1)*(800/Ny);

figure(1);

subplot(3,1,1)

plot(kx,X(1:Nx/2));xlabel('Hz')

title('原始信号频谱')

subplot(3,1,2)

plot(kd,D(1:Nd/2))

title('经未知系统后信号频谱');xlabel('Hz')

subplot(3,1,3)

plot(ky,Y(1:Ny/2))

title('经自适应FIR滤波器后信号频谱');xlabel('Hz')

你可能感兴趣的:(matlab中lms,m)