📄 ffbnl.m
字号:
% function yq=FFBNL(wl,wb,u)
%该程序实现反馈滤波器
clear all
clc
wlm=[0.05136203197557;-0.11689962985114;0.00001970540900;0.00000109390695;-0.00001233619209];
wbm=[0.37953605399228;0.41792193414255;0.45634820443654;0.49485143896903];
wlim=[2.84090369154971;-3.10603156401583;-0.05031441462427;-0.13248072019243;-0.16605886711762];
wbim=[0.00402456440225;0.57039440493572;0.92180849916764;0.21839063132523;1.02467934441386];
lengm=5;%LMS滤波器的长度
lenm=2;%B样条网络的输入
pm=2;%B样条的阶数
nm=3;%插入节点数
Ulm=zeros(lengm,1);%LMS滤波器的输入
Ubm=zeros(1,lenm);%B样条函数的输入
Nbm=zeros(1,pm+nm-1);%B样条函数的隐层节点数
lengim=5;
lenim=2;
pim=2;
nim=4;
Ulim1=zeros(lengim,1);%LMS滤波器的输入
Ubim1=zeros(1,lenim);%B样条函数的输入
Nbim1=zeros(1,pim+nim-1);%B样条函数的隐层节点数
Ulim2=zeros(lengim,1);%LMS滤波器的输入
Ubim2=zeros(1,lenim);%B样条函数的输入
Nbim2=zeros(1,pim+nim-1);%B样条函数的隐层节点数
u1=zeros(lengim,1);
u2=zeros(lengim,1);
lengq=5;%LMS滤波器的长度
lenq=2;%B样条网络的输入
uq=0.35;%lms滤波器的优化步长
rq=1.2;%B样条网络的修正步长
pq=3;%B样条的阶数
nq=4;%插入节点数
wlq=zeros(lengq,1);%lms的权系数
wbq=rand(pq+nq-1,1);%B样条的权系数
Ulq=zeros(lengq,1);%LMS滤波器的输入
Ubq=zeros(1,lenq);%B样条函数的输入
Nbq=zeros(1,pq+nq-1);%B样条函数的隐层节点数
N=4000;
Lt=100;
um=1*rand(1,N);%产生1500组随机信号
ut=1*rand(1,Lt);
delay=0;%滤波器的输出延时
err=0;
for k=lengq+1:N
%==========这段程序为该反馈滤波器的输入===================%
for t=1:lengq
Ulq(t)=um(k-t+1);
end
sumq=zeros(1,pq+nq-1); %计算B样条网络的隐层节点
for m=0:lenq-1
sumq=sumq+Bs(um(k-m),nq,pq,0,1);
end
Nb=sumq;
%============反馈滤波器输入结束=====================%
yq1(k)=Nb*wbq;%计算B样条网络的输出
yq2(k)=wlq'*Ulq;%lms滤波器的输出
yq(k)=yq1(k)+yq2(k);%整个非线性滤波器的输出
%==============复制滤波器的输入====================%
summ=zeros(1,pm+nm-1); %计算B样条网络的隐层节点
for m=0:lenm-1
if (yq(k-m)>=1)
yq(k-m)=1;
elseif (yq(k-m)<=0)
yq(k-m)=0;
end
summ=summ+Bs(yq(k-m),nm,pm,0,1);
end
Nba=summ;
for t=1:lengm
Ulm(t)=yq(k-t+1);
end
%================复制滤波器的输入结束===================%
ym2(k)=Nba*wbm;%计算B样条网络的输出
ym1(k)=wlm'*Ulm;%lms滤波器的输出
ym(k)=ym2(k)+ym1(k);%整个非线性滤波器的输出
%================反馈滤波器的误差输入====================%
ud(k)=um(k-delay);
for t=1:lengim
Ulim1(t)=ym(k-t+1);
end
sumi1=zeros(1,pim+nim-1); %计算B样条网络的隐层节点
for m=0:lenim-1
sumi1=sumi1+Bs(ym(k-m),nim,pim,0,1);
end
Nb1=sumi1;
yi11(k)=Nb1*wbim;%计算B样条网络的输出
yi12(k)=wlim'*Ulim1;%lms滤波器的输出
ye1(k)=yi11(k)+yi12(k);%整个非线性滤波器的输出
for t=1:lengim
Ulim2(t)=ud(k-t+1);
end
sumi2=zeros(1,pim+nim-1); %计算B样条网络的隐层节点
for m=0:lenim-1
sumi2=sumi2+Bs(ud(k-m),nim,pim,0,1);
end
Nb2=sumi2;
yi21(k)=Nb2*wbim;%计算B样条网络的输出
yi22(k)=wlim'*Ulim2;%lms滤波器的输出
ye2(k)=yi21(k)+yi22(k);%整个非线性滤波器的输出
e(k)=ye1(k)-ye2(k);
E(k)=ym(k)-um(k);
for t=1:lengq
Ul(t)=ud(k-t+1);
end
g=Ul';
%================反馈滤波器的误差输入结束====================%
%=================调整反馈滤波器的权系数======================%
wlq=wlq+2*uq*e(k)*g;%利用误差调整lms滤波器的权系数
wbq=wbq+rq*e(k)*Nb'/(Nb*Nb');%利用误差调整B样条网络的权系数
%=================调整反馈滤波器的权系数结束==================%
end
figure:plot(E(lenq+1:N)),title('训练误差');
figure:plot(ym(N-100:N),'r')
hold on
plot(um(N-100:N),'b'),title('训练跟踪');
figure:plot(yq);
% for k=1:lengi
% yyt(k)=0;
% end
%
% for k=lengi+1:Lt
%
% for t=1:lengo
% Uli(t)=ut(k-t+1);
% end
% sumi=zeros(1,pi+ni-1); %计算B样条网络的隐层节点
% for m=0:leni-1
% sumi=sumi+Bs(ut(k-m),ni,pi,0,1);
% end
% Nb=sumi;
% yy2t(k)=Nb*wbi;%计算B样条网络的输出
% yy1t(k)=wli'*Uli;%lms滤波器的输出
%
% yyt(k)=yy2t(k)+yy1t(k);%整个非线性滤波器的输出
%
% % yyt(k)=yyt(k-1)/(1+yyt(k-1)*yyt(k-1))+ut(k);
%
%
% sumo=zeros(1,po+no-1); %计算B样条网络的隐层节点
%
% for m=0:leno-1
%
% sumo=sumo+Bs(yyt(k-m),no,po,0,1);
% end
% Nba=sumo;
%
% for t=1:lengo
% Ulo(t)=yyt(k-t+1);
% end
%
%
% yy2(k)=Nba*wbo;%计算B样条网络的输出
%
% yy1(k)=wlo'*Ulo;%lms滤波器的输出
%
% yy(k)=yy2(k)+yy1(k);%整个非线性滤波器的输出
%
% ee(k)=abs((yy(k)-ut(k))/ut(k));
%
%
% end
% figure: plot(yy,'b');
% hold on
% plot(ut,'r'),title('测试跟踪');
% figure:plot(ee,'b'),title('测试相对误差');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -