📄 nlfilter.m
字号:
clear all
clc
%=======================对输入数据的处理部分===============================%
% uun=load('u');
% yun=load('y');
% umin=min(uun);
% umax=max(uun);
% ymin=min(yun);
% ymax=max(yun);
% un=Normalizing(uun);
% yn=Normalizing(yun);
%=======================对输入数据的处理部分结束============================%
Ndr=200;% 训练样本
%=========================非线性滤波器的参数===============================%
leng=5;%LMS滤波器的长度
lengo=5;
len=2;%B样条网络的输入
p=2;%B样条的阶次
n=3;%插入点的个数
wl=zeros(leng,1);%lms的权系数
wb=rand(p+n-1,1);%B样条的权系数
Ul=zeros(leng,1);%LMS滤波器的输入
Ulc=zeros(leng,1);
Ub=zeros(1,len);%B样条函数的输入
Nb=zeros(1,p+n-1);%B样条函数的隐层节点数
Nbc=zeros(1,p+n-1);%B样条函数的隐层节点数
u=0.1;%lms滤波器的优化步长
r=0.65;%B样条网络的修正步长
err=0;
%=========================非线性滤波器的参数===============================%
umax=11;
umin=9;
ymax=122;
ymin=81;
ucmax=11;
ucmin=8;
ycmax=121;
ycmin=64;
%========================非线性滤波器建模和消噪=============================%
uu=10+(rand(1,Ndr)-rand(1,Ndr))*1;
eqmax=15.5;
eqmin=-2.5;
%反馈网络的输出
yq=0;
% pp=rand(1,Ndr)*10;
pp=ones(1,Ndr)*5;
for k=1:leng
yq(k)=0;
end
for k=leng+1:Ndr
%========================非线性滤波器建模=============================%
um(k)=uu(k)-yq(k-1); %被控对象的输入
uf(k)=(uu(k)-umin)/(umax-umin);%建模滤波器的输入
uc(k)=(um(k)-ucmin)/(ucmax-ucmin);%复制滤波器的输入
% % pp=rand(1);
yun(k)=uu(k)*uu(k);
ynoise(k)=um(k)*um(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
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);%拟合误差
wl=wl+2*u*e(k)*Ul;%利用误差调整lms滤波器的权系数
wb=wb+r*e(k)*Nb'/(Nb*Nb');%利用误差调整B样条网络的权系数
yf(k)=y(k)*(ymax-ymin)+ymin;
%========================非线性滤波器建模=============================%
%
%========================非线性滤波器消噪=============================%
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)*(ycmax-ycmin)+ycmin;
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=0;
yq(k)=yqu;
%========================非线性滤波器消噪=============================%
end
%======================非线性滤波器建模和消噪结束==========================%
a=ynoise(Ndr-50:Ndr)-yun(Ndr-50:Ndr);
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(Ndr-50:Ndr),'b');
% hold on
% plot(yq(Ndr-50:Ndr),'r'),title('蓝色:反馈滤波输入;红色:反馈滤波输出');
%
% figure: plot(a,'b'),title('消噪误差');
% wl
% wb
% yd=d(Ndr-100:Ndr);
% ym=y(Ndr-100:Ndr);
% MSE=err/(Ndr-leng)
% figure;plot(e(leng+1:Ndr)),title('误差信号');
% figure:plot(yd,'r');
% hold on
% plot(ym,'b'),title('模型跟踪信号');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -