git-svn-id: http://moon:8086/svn/matlab/trunk@153 801c6759-fa7c-4059-a304-17956f83a07c
98 lines
2.0 KiB
Matlab
Executable File
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;
|
|
|