Files
matlab/common/pflms2.m
T
jens b31f3e7435 - added
git-svn-id: http://moon:8086/svn/matlab/trunk@153 801c6759-fa7c-4059-a304-17956f83a07c
2021-03-22 20:28:22 +00:00

98 lines
2.0 KiB
Matlab
Executable File

% pflms2(mu,N,C,P,S,L,x,d,w_start)
function [ee,w,dd,PX,u]=pflms2(mu,N,C,P,S,L,x,d,w_start)
Lx = length(x);
Np = S*L;
K = Lx/L;
% FLMS Parameter
gamma = 0.6; % Vergessensfaktor
alpha = 1.0 % 0 < alpha < 1
beta = mu/C
% Initialisierungen
ee=zeros(Lx,1); % Fehlervektor
dd=zeros(Lx,1); % Filterausgang, Schaetzung von d
wp = zeros(C,P); % Gewichtsvektor im Frequenzbereich
w = zeros(P*S*L,1); % Gewichtsvektor im Zeitbereich
PX = zeros(C,1); % Schaetzung des Leistungsdichtespektrums
WSp = zeros(C,P);
X = zeros(C,S*P);
u = zeros(C,P*S);
ys = zeros(C,1);
YS = zeros(C,1);
xzp = zeros(Lx+S*L,1);
pidTbl = [2:P*S];
pidTbl(P*S) = 1;
pStbl = [0:P*S-1];
pStbl(1) = P*S;
pjiTbl = [2:P];
pjiTbl(P) = 1;
xzp(C-L+1:Lx+C-L) = x;
pid = 1;
pji = 1;
flops(0);
for k=1:K,
kL = (k-1)*L;
X(1:C,pid) = dspfft(xzp(kL+1:kL+C),C);
pS = pid;
YS = WSp(1:C,1).*X(1:C,pid) *C;
for p=2:P,
for i = 1:S
pS = pStbl(pS);
end;
YS = YS + WSp(1:C,p).*X(1:C,pS) *C;
end;
ys = real(dspifft(YS,C));
dd(kL+1:kL+L) = ys(C-L+1:C);
ee(kL+1:kL+L) = d(kL+1:kL+L) - ys(C-L+1:C);
E = dspfft([zeros(C-L,1); ee(kL+1:kL+L)],C);
PX = abs((1-gamma)*conj(X(1:C,pid)).*X(1:C,pid) *C + gamma*PX);
% umax = alpha
u(1:C,pid) = (alpha*beta) ./(PX+beta);
% Update
pS = pid;
for p=1:P,
WSp(1:C,p) = WSp(1:C,p) + u(1:C,pS) .* conj(X(1:C,pS)) .* E *C;
for i = 1:S
pS = pStbl(pS);
end;
end;
% Teuer: Projektion jeden p-ten Teilfilters wp pro k-ter Iteration
% for p=1:P,
% wp(1:C,p) = real(dspifft(WSp(1:C,p),C));
% WSp(1:C,p) = dspfft(wp(1:Np,p),C);
% end;
% Billig: Projektion eines Teilfilters alternierend pro k-ter Iteration
wp(1:C,pji) = real(dspifft(WSp(1:C,pji),C));
WSp(1:C,pji) = dspfft(wp(1:Np,pji),C);
pji = pjiTbl(pji);
pid = pidTbl(pid);
end;
flops
% Return estimated filter weights
for p=1:P,
w((p-1)*Np+1:p*Np) = wp(1:Np,p);
end;