* Bug #12815 fixed - Signal_processing: protect cov macro in levin() 68/12368/4
Paul BIGNIER [Tue, 27 Aug 2013 15:48:37 +0000 (17:48 +0200)]
Prevent levin() from redefining cov() macro.

Change-Id: I69d1d425dea4f6f0d18ac3f563d4215710054ff8

scilab/CHANGES_5.5.X
scilab/modules/signal_processing/macros/levin.sci

index a16725b..f4bf86b 100644 (file)
@@ -563,6 +563,8 @@ Bug fixes
 
 * Bug #12814 fixed - Elementary_functions: improvement of pertrans() doc.
 
+* Bug #12815 fixed - levin() redefined cov() as a variable.
+
 * Bug #12816 fixed - Numbers pasted in editvar were not parsed according to locale.
 
 * Bug #12823 fixed - In help generation (toolbox) links were not correctly handled.
index 7005516..754c382 100644 (file)
@@ -7,10 +7,10 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function [la,sig,lb]=levin(n,cov)
-    //[la,sig,lb]=levin(n,cov)
-    //macro which solves recursively on n
-    //the following Toeplitz system (normal equations)
+function [la, sig, lb] = levin(n, Cov)
+    // [la, sig, lb] = levin(n, Cov)
+    // macro which solves recursively on n
+    // the following Toeplitz system (normal equations)
     //
     //
     //         |R1   R2   . . . Rn  |
@@ -26,7 +26,7 @@ function [la,sig,lb]=levin(n,cov)
     //  where {Rk;k=1,nlag} is the sequence of nlag empirical covariances
     //
     //  n   : maximum order of the filter
-    //  cov : matrix containing the Rk (d*d matrices for a
+    //  Cov : matrix containing the Rk (d*d matrices for a
     //      : d-dimensional process). It must be given the
     //      : following way:
     //
@@ -43,39 +43,47 @@ function [la,sig,lb]=levin(n,cov)
     //      : mean-square errors.
     //!
 
-    [lhs,rhs]=argn(0);
-    if rhs<>2 then
-        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"),"levin",2));
+    [lhs, rhs] = argn(0);
+    if rhs <> 2 then
+        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "levin", 2));
     end
-    [l,d]=size(cov);
-    if d>l then
-        error(msprintf(gettext("%s: Wrong size for input argument #%d: A tall matrix expected.\n"),"levin",2));
+    [l, d] = size(Cov);
+    if d > l then
+        error(msprintf(gettext("%s: Wrong size for input argument #%d: A tall matrix expected.\n"), "levin", 2));
     end
     //
     //   Initializations
     //
-    a=eye(d,d);b=a;
-    z=poly(0,"z");la=list();lb=list();sig=list();
-    p=n+1;cv=cov;
-    for j=1:p,cv=[cov(j*d+1:(j+1)*d,:)';cv];end;
-    for j=0:n-1,
+    a = eye(d, d);
+    b = a;
+    z = poly(0, "z");
+    la = list();
+    lb = list();
+    sig = list();
+    p = n+1;
+    cv = Cov;
+    for j=1:p
+        cv = [Cov(j*d+1:(j+1)*d, :)'; cv];
+    end
+    for j=0:n-1
         //
         //   Bloc permutation matrix
         //
-        jd=jmat(j+1,d);
+        jd = jmat(j+1, d);
         //
         //   Levinson algorithm
         //
-        r1=jd*cv((p+1)*d+1:(p+2+j)*d,:);
-        r2=jd*cv(p*d+1:(p+1+j)*d,:);
-        r3=jd*cv((p-1-j)*d+1:p*d,:);
-        r4=jd*cv((p-j)*d+1:(p+1)*d,:);
-        c1=coeff(a);c2=coeff(b);
-        sig1=c1*r4;gam1=c2*r2;
-        k1=(c1*r1)*inv(gam1);
-        k2=(c2*r3)*inv(sig1);
-        a1=a-k1*z*b;
-        b=-k2*a+z*b;a=a1;
-        la(j+1)=a;lb(j+1)=b;sig(j+1)=sig1;
-    end;
+        r1 = jd*cv((p+1)*d+1:(p+2+j)*d, :);
+        r2 = jd*cv(p*d+1:(p+1+j)*d, :);
+        r3 = jd*cv((p-1-j)*d+1:p*d, :);
+        r4 = jd*cv((p-j)*d+1:(p+1)*d, :);
+        c1 = coeff(a); c2 = coeff(b);
+        sig1 = c1*r4; gam1 = c2*r2;
+        k1 = (c1*r1)*inv(gam1);
+        k2 = (c2*r3)*inv(sig1);
+        a1 = a-k1*z*b;
+        b = -k2*a+z*b;
+        a = a1;
+        la(j+1) = a; lb(j+1) = b; sig(j+1) = sig1;
+    end
 endfunction