1. 程式人生 > 其它 >【優化演算法】改進定步長與變步長LMS演算法【含Matlab原始碼 629期】

【優化演算法】改進定步長與變步長LMS演算法【含Matlab原始碼 629期】

一、簡介

最小均方(LMS, Least Mean Squares)是最基本的自適應濾波演算法。
LMS演算法是自適應濾波器中常用的一種演算法與維納演算法不同的是其系統的係數隨輸入序列而改變。維納演算法中擷取輸入序列自相關函式的一段構造系統的最佳係數。而LMS演算法則是對初始化的濾波器係數依據最小均方誤差準則進行不斷修正來實現的。因此理論上講LMS演算法的效能在同等條件下要優於維納。但是LMS是在初始值下逐步調整的,因此在系統穩定前,會有一段調整時間,調整時間受步長因子的控制,一定範圍內,步長因子越大,調整時間越小,步長因子的最大取值為R的跡。LMS採用平方誤差最小的原則代替均方誤差最小的原則,訊號基本關係如下:

二、原始碼

clear all
clc              
t=0:1/1000:100-1/1000;
s=15*sin(0.15*pi*t);
snr=10;
s_power=var(s);              %var函式: 返回方差值
linear_snr=10^(snr/10);
factor=sqrt(s_power/linear_snr);
noise=randn(1,length(s))*factor;
%noise=wgn(1,length(s),factor);
x=s+noise;                   %由SNR計算隨機噪聲
x1=noise;                    %噪聲源輸入
x2=noise;
%x3=noise;
w1=0;                       %權係數初值
w2=0;
%w3=0;
e=zeros(1,length(x));
error=zeros(1,length(x));
y=0;
%mu=0;
mu=0.000009;                 
for i=1:100000                 %定步長LMS演算法
    y=w1*x1(i)+w2*x2(i);%+w3*x3(i);
    e(i)=x(i)-y;
    error(i)=s(i)-e(i);
 %   ee=error^2;
 %   mu=xuanze(mu,ee);
    w1=w1+mu*e(i)*x1(i);
    w2=w2+mu*e(i)*x2(i);
  %  w3=w3+mu*e(i)*x3(i);
end
figure(1)
subplot(4,1,1)
plot(t,s);
title('純正弦訊號')
subplot(4,1,2)
plot(t,x);
title('帶噪聲正弦訊號')
axis([0 100 -30 30]);
subplot(4,1,3)
plot(t,noise);
title('噪聲訊號')
axis([0 100 -30 30]);
subplot(4,1,4)
plot(t,e);
title('定步長LMS演算法自適應噪聲對消器')
axis([0 100 -30 30]);
wu=error;
figure(2)
subplot(3,1,1);
plot(wu);
title('定步長LMS演算法收斂過程')







%自適應噪聲對消器
clear all
clc              
t=0:1/1000:100-1/1000;
s=15*sin(0.15*pi*t);
snr=10;
s_power=var(s);              %var函式: 返回方差值
linear_snr=10^(snr/10);
factor=sqrt(s_power/linear_snr);
noise=randn(1,length(s))*factor;
x=s+noise;                   %由SNR計算隨機噪聲
x1=noise;                    %噪聲源輸入
x2=noise;
w1=0;                       %權係數初值
w2=0;
e=zeros(1,length(x));
error=zeros(1,length(x));
y=0;
mu=0;
%mu=0.05;                 
for i=1:100000                 %變步長LMS演算法
    y=w1*x1(i)+w2*x2(i);
    e(i)=x(i)-y;
     error(i)=s(i)-e(i);
    ee=error(i)^2;
    if ee>0.0005;
        ee=0.0005;
    end
    mu=xuanze(mu,ee);
    w1=w1+mu*e(i)*x1(i);
    w2=w2+mu*e(i)*x2(i);   
end
figure(3)
subplot(4,1,1)
plot(t,s);
title('純正弦訊號')
subplot(4,1,2)
plot(t,x);
title('帶噪聲正弦訊號')
axis([0 100 -30 30]);
subplot(4,1,3)
plot(t,noise);
title('噪聲訊號')
axis([0 100 -30 30]);
subplot(4,1,4)
plot(t,e);
title('變步長LMS演算法自適應噪聲對消器')
axis([0 100 -30 30]);
wu=error;
figure(2)
subplot(3,1,2);
plot(wu);
title('變步長LMS演算法收斂過程')





%自適應噪聲對消器
clear all
clc              
t=0:1/1000:100-1/1000;
s=15*sin(0.15*pi*t);
snr=10;
s_power=var(s);              %var函式: 返回方差值
linear_snr=10^(snr/10);
factor=sqrt(s_power/linear_snr);
noise=randn(1,length(s))*factor;
x=s+noise;                   %由SNR計算隨機噪聲
x1=noise;                    %噪聲源輸入
x2=noise;
w1=0;                       %權係數初值
w2=0;
e=zeros(1,length(x));
error=zeros(1,length(x));
y=0;
mu=0;
%mu=0.05;                 
for i=1:100000                 %改進變步長LMS演算法
    y=w1*x1(i)+w2*x2(i);
    e(i)=x(i)-y;
    
   ee=exp(abs(error(i))^3)-1;
 %  ee=error^4; 
   
      
   end    
    mu=xuanze(mu,ee);
    w1=w1+mu*e(i)*x1(i);
    w2=w2+mu*e(i)*x2(i);   
end
figure(4)
subplot(4,1,1)
plot(t,s);
title('純正弦訊號')
subplot(4,1,2)
plot(t,x);
title('帶噪聲正弦訊號')
axis([0 100 -30 30]);
subplot(4,1,3)
plot(t,noise);
title('噪聲訊號')
axis([0 100 -30 30]);
subplot(4,1,4)
plot(t,e);
title('改進變步長LMS演算法自適應噪聲對消器')
axis([0 100 -30 30]);

三、執行結果




四、備註

版本:2014a
完整程式碼或代寫加1564658423