⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 structre.m

📁 给于MATLAB 环境下的非线性滤波器。此设计中用到了
💻 M
字号:
%以B样条网络非线性滤波器为基础的非线性自适应逆控制结构
clear all
clc

Ndr=150;% 训练样本

%=========================非线性滤波器的参数===============================%
leng=5;%LMS滤波器的长度
lengo=5;
len=2;%B样条网络的输入

p=2;%B样条的阶次
n=2;%插入点的个数

wl=zeros(leng,1);%lms的权系数
wb=rand(p+n-1,1);%B样条的权系数

Ul=zeros(leng,1);%LMS滤波器的输入
Ulc=zeros(leng,1);
Ulw=zeros(leng,1);
% Ub=zeros(1,len);%B样条函数的输入
Nb=zeros(1,p+n-1);%B样条函数的隐层节点数
Nbc=zeros(1,p+n-1);%B样条函数的隐层节点数
Nbw=zeros(1,p+n-1);%B样条函数的隐层节点数

 u=0.1;%lms滤波器的优化步长
 r=0.65;%B样条网络的修正步长
 err=0;
%=========================非线性滤波器的参数===============================%

%========================非线性滤波器建模和消噪=============================%

%  uw=10+(rand(1,Ndr)-rand(1,Ndr))*1;
 uw=rand(1,Ndr);
 uu=10*ones(1,Ndr);
 
 uwmax=1;
 uwmin=0;
 
 ummax=10;
 ummin=9;
 
 ucmax=11;
 ucmin=9;
 
 ymax=121;
 ymin=81;
 
%  eqmax=17.5;
%  eqmin=-2.5;

 eqmax=3000;
 eqmin=-2500;


 yq=0;
% pp=rand(1,Ndr)*10;
 pp=ones(1,Ndr)*5+rand(1,Ndr)*2;

for k=1:leng
    yq(k)=0;
end

 for k=leng+1:Ndr
   %========================非线性滤波器建模=============================% 
     um(k)=uu(k)-yq(k-1);  %被控对象的输入
     uc(k)=um(k)+uw(k);
     
     uf(k)=(um(k)-ummin)/(ummax-ummin);%建模滤波器的输入
     ufc(k)=(uc(k)-ucmin)/(ucmax-ucmin);%复制滤波器的输入
%      up(k)=(uw(k)-uwmin)/(uwmax-uwmin);
    up(k)=uw(k);
     
     yun(k)=uu(k)*uu(k);
     ynoise(k)=uc(k)*uc(k)+pp(k);
     yy(k)=uu(k)*uu(k)+pp(k);
   
   
    d(k)=(ynoise(k)-ymin)/(ymax-ymin);%期望输出值
%     d(k)=(yun(k)-ymin)/(ymax-ymin);%期望输出值
     

     %===================建模部分=====================%
     sum=zeros(1,p+n-1); %计算B样条网络的隐层节点

      for m=1:leng
      Ulw(m)=uw(k-m+1);
      end
      
      for m=0:len-1
         sum=sum+Bs(up(k-m),n,p,0,1);
      end
      Nbw=sum;   
     yw2(k)=Nbw*wb;%计算B样条网络的输出
   
     yw1(k)=wl'*Ulw;%lms滤波器的输出

     yw(k)=yw2(k)+yw1(k);%整个非线性滤波器的输出
     
     %===================建模部分结束==========================%
     
      sum=zeros(1,p+n-1); %计算B样条网络的隐层节点

      for m=1:leng
      Ul(m)=uf(k-m+1);
      end
      
      for m=0:len-1
         sum=sum+Bs(uf(k-m),n,p,0,1);
      end
      Nb=sum;    
     y2(k)=Nb*wb;%计算B样条网络的输出
   
     y1(k)=wl'*Ul;%lms滤波器的输出

     y(k)=y2(k)+y1(k);%整个非线性滤波器的输出
     
   %===========================利用误差对权系数进行自适应===================%
     e(k)=d(k)-y(k)-yw(k);%拟合误差
     

     wl=wl+2*u*e(k)*Ulw;%利用误差调整lms滤波器的权系数
   
     wb=wb+r*e(k)*Nbw'/(Nbw*Nbw');%利用误差调整B样条网络的权系数
     


   %========================非线性滤波器建模=============================% 
  
   %========================非线性滤波器消噪=============================%

 
   for t=1:leng
      Ulc(t)=uc(k-t+1);
   end

    
      sumc=zeros(1,p+n-1); %计算B样条网络的隐层节点
        
      for m=0:len-1
         sumc=sumc+Bs(uc(k-m),n,p,0,1);
      end
      Nbc=sumc;   
      y2c(k)=Nbc*wb;%计算B样条网络的输出
   
      y1c(k)=wl'*Ulc;%lms滤波器的输出

      yc(k)=y2c(k)+y1c(k);%整个非线性滤波器的输出
      
     ydn(k)=yc(k)*(ymax-ymin)+ymin;
     equ(k)=ynoise(k)-ydn(k);
     a(k)=ynoise(k)-ydn(k);

     if equ(k)>=eqmax
         equ(k)=eqmax;
     end
     if equ(k)<=eqmin
         equ(k)=eqmin;
     end
     
     eq(k)=(equ(k)-eqmin)/(eqmax-eqmin);
     

%    反馈滤波那块

     U=[eq(k) eq(k-1) eq(k-2) eq(k-3) eq(k-4)]';

     if k>=10
     yqu=IMBONL(wl,wb,U);
     else
         yqu=0;
     end
     
%     yq(k)=yqu*(eqmax-eqmin)+eqmin;

     yq(k)=yqu;
     
   
   %========================非线性滤波器消噪=============================%
   
 end
 
 %======================非线性滤波器建模和消噪结束==========================%
 
 
figure:plot(ynoise(Ndr-50:Ndr),'b');
hold on
plot(yun(Ndr-50:Ndr),'r');
hold on
plot(yy(Ndr-50:Ndr),'g'),title('蓝色:系统的实际输出;红色:期望输出;绿色:未加消除器的系统输出');

% figure:plot(yun(Ndr-50:Ndr),'b');
% hold on
% plot(yf(Ndr-50:Ndr),'r'),title('蓝色:系统的输出;红色:模型的输出');

% figure:plot(uu(Ndr-50:Ndr),'b');
% hold on
% plot(um(Ndr-50:Ndr),'r'),title('蓝色:系统对象的输入;红色:反馈后的输入');

figure:plot(equ,'b');
hold on
plot(a,'r');
figure:plot(ydn,'r'),title('复制滤波器输出');

% figure: plot(a,'b'),title('消噪误差');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -