qrd_lsl.m
上传用户:kendun0711
上传日期:2007-06-03
资源大小:32k
文件大小:6k
源码类别:

技术管理

开发平台:

Matlab

  1. function [Wo, ee, gamma] = qrd_lsl(u, d, M, verbose, lambda, delta)
  2. % function [Wo, ee, gamma] = qrd_lsl(u, d, M, verbose, lambda, delta)
  3. %
  4. % qrd_lsl.m - apply the standard QR-decomposition based LSL algorithm
  5. % using angle-normalized error to predict/estimate complex-valued processes
  6. % written for MATLAB 4.0
  7. %
  8. % For efficiency, the index shifting functions should be replaced with
  9. % their corresponding macro definitions in ms.m and ns.m.
  10. % their corresponding macro definitions in ms.m and ns.m.
  11. %
  12. % Reference: Ch.15 of Haykin, _Adaptive Filter Theory_, 3rd ed., 1991
  13. %
  14. % Input parameters:
  15. %       u       : vector of inputs
  16. %       d       : vector of desired outputs
  17. %       M       : final order of predictor
  18. %       verbose : set to 1 for interactive processing
  19. %       lambda  : the initial value of the forgetting factor
  20. %       delta   : the initial value for the prediction matrices
  21. %
  22. % Output parameters:
  23. %       Wo      : row-wise matrix of Hermitian transposed weights
  24. %                 at each iteration
  25. %       ee      : row vector of a posteriori prediction errors Y - xp
  26. %                 for final prediction order M+1
  27. %       gamma   : row vector of conversion factors for final
  28. %                 prediction order M+1
  29. %       gamma   : row vector of conversion factors for final
  30. %                 prediction order M+1
  31. %
  32. % Copyright (c) 1994-2001, Paul Yee.
  33. % Nout = size(Xi, 2);
  34. Nout = 1;
  35. % length of maximum number of timesteps that can be predicted
  36. N = min(length(u),length(d));
  37. Wo=[];
  38. % prediction initialization
  39. F = zeros(ms(M),ns(N));
  40. F(ms(0):ms(M),ns(0)) = delta * ones(M+1,1);
  41. B = zeros(ms(M),ns(N));
  42. B(ms(0):ms(M),ns(-1)) = delta * ones(M+1,1);
  43. B(ms(M),ns(0)) = delta;
  44. cb = zeros(ms(M),ns(N));
  45. sb = cb;
  46. cf = cb;
  47. sf = cb;
  48. e = zeros(ms(M+1),ns(N));
  49. ee = e;
  50. pfc = zeros(ms(M-1),ns(N));
  51. pbc = pfc;
  52. pc = pfc;
  53. pfc(ms(0):ms(M-1),ns(0)) = zeros(M, 1);
  54. pbc(ms(0):ms(M-1),ns(0)) = zeros(M, 1);
  55. pc(ms(1):ms(M),ns(0)) = zeros(M, 1);
  56. gamma_root = zeros(ms(M+1),ns(N));
  57. gamma_root(ms(0),ns(1):ns(N)) = ones(1, N);
  58. lambda_root = sqrt(lambda);
  59. % set size of reflection coefficients
  60. kappa_f = zeros(ms(M),ns(N));
  61. kappa_b = zeros(ms(M),ns(N));
  62. kappa = zeros(ms(M),ns(N));
  63. for n = 1:N,
  64.   % data initialization
  65.   ef(ms(0),ns(n)) = u(n);
  66.   eb(ms(0),ns(n)) = u(n);
  67.   e(ms(0),ns(n)) = d(n);
  68.   gamma_root(ms(0),ns(n)) = 1;
  69.   
  70.   for m = 1:M,
  71.     % predictions
  72.     B(ms(m-1),ns(n-1)) = lambda * B(ms(m-1),ns(n-2)) +...
  73. abs(eb(ms(m-1),ns(n-1)))^2;
  74.     cb(ms(m-1),ns(n-1)) = lambda_root * sqrt(B(ms(m-1),ns(n-2)) /...
  75. B(ms(m-1),ns(n-1)));
  76.     sb(ms(m-1),ns(n-1)) = eb(ms(m-1),ns(n-1)) / sqrt(B(ms(m-1),ns(n-1)));
  77.     pfc(ms(m-1),ns(n)) = cb(ms(m-1),ns(n-1)) * lambda_root *...
  78. pfc(ms(m-1),ns(n-1)) + conj(sb(ms(m-1),ns(n-1))) * ef(ms(m-1),ns(n));
  79.     ef(ms(m),ns(n)) = cb(ms(m-1),ns(n-1)) * ef(ms(m-1),ns(n)) -...
  80. sb(ms(m-1),ns(n-1)) * lambda_root * pfc(ms(m-1),ns(n-1));
  81.     gamma_root(ms(m),ns(n-1)) = cb(ms(m-1),ns(n-1)) *...
  82. gamma_root(ms(m-1),ns(n-1));
  83.     kappa_f(ms(m),ns(n)) = -conj(pfc(ms(m-1),ns(n))) /...
  84. sqrt(B(ms(m-1),ns(n-1)));
  85.     F(ms(m-1),ns(n)) = lambda * F(ms(m-1),ns(n-1)) + abs(ef(ms(m-1),ns(n)))^2;
  86.     cf(ms(m-1),ns(n)) = lambda_root * sqrt(F(ms(m-1),ns(n-1)) /...
  87. F(ms(m-1),ns(n)));
  88.     sf(ms(m-1),ns(n)) = ef(ms(m-1),ns(n)) / sqrt(F(ms(m-1),ns(n)));
  89.     pbc(ms(m-1),ns(n)) = cf(ms(m-1),ns(n)) * lambda_root * pbc(ms(m-1),ns(n-1))+...
  90.  sf(ms(m-1),ns(n)) * eb(ms(m-1),ns(n-1));
  91.     eb(ms(m),ns(n)) = cf(ms(m-1),ns(n)) * eb(ms(m-1),ns(n-1)) -...
  92. sf(ms(m-1),ns(n)) * lambda_root * pbc(ms(m-1),ns(n-1));
  93.     kappa_b(ms(m),ns(n)) = -conj(pbc(ms(m-1),ns(n))) / sqrt(F(ms(m-1),ns(n)));
  94.   end; % for m
  95.   
  96. end; % for n
  97. for n = 1:N,
  98.   
  99.   for m = 1:M,
  100.       
  101.     % filtering
  102.     pc(ms(m-1),ns(n)) = cb(ms(m-1),ns(n)) * lambda_root * pc(ms(m-1),ns(n-1)) +...
  103. conj(sb(ms(m-1),ns(n))) * e(ms(m-1),ns(n));
  104.    e(ms(m),ns(n)) = cb(ms(m-1),ns(n)) * e(ms(m-1),ns(n)) - sb(ms(m-1),ns(n)) *...
  105. lambda_root * pc(ms(m-1),ns(n-1));
  106.     ee(ms(m),ns(n)) = gamma_root(ms(m),ns(n)) * e(ms(m),ns(n));
  107.     
  108.   end; % for m
  109.     
  110. end; % for n
  111. for n = 1:N,
  112.   
  113.   % handle terminal case m=M separately as in Sayed and Kailath Table 5
  114.   B(ms(M),ns(n)) = lambda * B(ms(M),ns(n-1)) + abs(eb(ms(M),ns(n)))^2;
  115.   cb(ms(M),ns(n)) = lambda_root * sqrt(B(ms(M),ns(n-1)) / B(ms(M),ns(n)));
  116.   sb(ms(M),ns(n)) = eb(ms(M),ns(n)) / sqrt(B(ms(M),ns(n)));
  117.   e(ms(M+1),ns(n)) = cb(ms(M),ns(n)) * e(ms(M),ns(n)) - sb(ms(M),ns(n)) *...
  118. lambda_root * pc(ms(M),ns(n-1));
  119.   pc(ms(M),ns(n)) = cb(ms(M),ns(n)) * lambda_root * pc(ms(M),ns(n-1)) +...
  120. conj(sb(ms(M),ns(n))) * e(ms(M),ns(n));
  121.   gamma_root(ms(M+1),ns(n)) = cb(ms(M),ns(n)) * gamma_root(ms(M),ns(N));  
  122.   ee(ms(M+1),ns(n)) = gamma_root(ms(M+1),ns(n)) * e(ms(M+1),ns(n));  
  123.   
  124.   for m = 1:M,
  125.     
  126.     B(ms(m-1),ns(N)) = lambda * B(ms(m-1),ns(N-2)) + abs(eb(ms(m-1),ns(N)))^2;
  127.     
  128.     % joint-process regression coefficient
  129.     % required to compute weight vector
  130.     kappa(ms(m),ns(n)) = conj(pc(ms(m-1),ns(n))) / sqrt(B(ms(m),ns(n)));
  131.  end; % for m
  132.  
  133. end; % for n
  134. an = zeros(M, M+1);
  135. cn = an;
  136. cn1 = cn;
  137. L_M = eye(M+1, M+1);
  138. for n = 1:N,
  139.   
  140.   an(1, 1:2) = [1 kappa_f(ms(1),ns(n))];
  141.   cn(1, 1:2) = [kappa_b(ms(1),ns(n)) 1];
  142.   for m = 2:M,
  143.   % compute coefficients of forward and backward prediction-error
  144.     % filters for later use in computation of weight vector. Note
  145.     % that we propagate an and cn in row vector form.
  146.     an(m, 1:(m+1)) = [an(m-1, 1:m) 0] + kappa_f(ms(m),ns(n)) * [0 cn1(m-1,1:m)];
  147.     cn(m, 1:(m+1)) = [0 cn1(m-1, 1:m)] + kappa_b(ms(m),ns(n)) * [an(m-1, 1:m) 0];
  148.   end; % for m
  149.   
  150.   for m = 2:(M+1),
  151.     L_M(m, 1:(m-1)) = conj(cn(m-1, 1:(m-1)));
  152.   end; % for m
  153.   
  154.   % note that we store Hermitian-transposed weights
  155.   % row-wise in Wo
  156.   Wo = [Wo ; kappa(ms(0):ms(M),ns(n))' * L_M];
  157.  cn1 = cn;
  158.     
  159. end; % for n
  160. % resize variables before return
  161. Wo = Wo(1:(N-1),:)';
  162. ee = ee(ms(M),ns(1):ns(N-1));
  163. gamma = gamma_root(ms(M),ns(1):ns(N-1)).^2;