% SOVRLS used in a simple system identification application.
% By the end of this script the adaptive filter w should have
% the same coefficients as the nonlinear unknown filter h.
iter = 5000; % Number of samples to process
L1 = 4;
L2 = 4;
% The nonlinear unknown plant transfer function
% y(n) = x(n) - x(n-1) - .125x(n-2) + .3125x(n-3)
% +x(n)x(n) -.3x(n)x(n-1) + .2x(n)x(n-2) -.5x(n)x(n-3)
% +.5x(n-1)x(n-1) -.3x(n-1)x(n-2) -.6x(n-1)x(n-3)
% -.6x(n-2)x(n-2) +.5x(n-2)x(n-3) -.1x(n-3)x(n-3)
h =[1;-1;-0;.125;.3125;1;-.3;.2;-.5;.5;-.3;-.6;-.6;.5;-.1];
xn =2*(rand(iter,1)-0.5); % Input signal, zero mean random.
dn =sovfilt(h,xn,4,4); % Unknown filter output
en =zeros(iter,1); % vector to collect the error
[w,xb,d,y,e,R]=init_sovrls(L1,L2,.001); % Initialize SOVRLS
%% Processing Loop
for (m=1:iter)
d = dn(m,:) + .001 * rand ; % additive noise of var = 1e-6
% call SOVRLS to calculate the filter output, estimation error
% and update the coefficients.
[w,y,e,R,xb]=asptsovrls(xn(m),xb,w,d,R,.92,L1,L2);
en(m,:) = e; % save the last error sample
end;
% display the results
% note that w converges to conj(h) for complex data
subplot(2,2,1);stem([real(w) imag(conj(w))]); grid;
subplot(2,2,2);eb = filter(.1,[1 -.9], en .* conj(en));
plot(10*log10(eb ));grid
Running the above script will produce the graph shown in Fig. 8.3.
The left side graph of the figure shows the adaptive filter coefficients
after convergence which are almost identical to the unknown filter h. The right
side graph shows the square error in dB versus time during the adaptation process.
The lower limit of the error signal power in the learning curve is defined here by
the additive white noise added at the filter output (-60 dB).
|