* Bug 15983 fixed [cacsd]: group() regressed in 5.5.2 87/20887/3
Samuel GOUGEON [Tue, 26 Feb 2019 03:03:48 +0000 (04:03 +0100)]
  http://bugzilla.scilab.org/15983

  test_run signal_processing bug_13205 show_error
  test_run signal_processing bug_13692 show_error
  test_run signal_processing bug_15983 show_error

Change-Id: Ieaf47ebb58dac71c1d6d054407c7997f2da0ec49

scilab/CHANGES.md
scilab/modules/signal_processing/macros/group.sci
scilab/modules/signal_processing/tests/nonreg_tests/bug_15983.tst [new file with mode: 0644]

index bc57eb9..bfd6991 100644 (file)
@@ -148,5 +148,6 @@ Bug Fixes
 * [#15425](http://bugzilla.scilab.org/show_bug.cgi?id=15425): The Kronecker product `a.*.b` failed when `a` or `b` or both are hypermatrices, with one or both being polynomials or rationals.
 * [#15523](http://bugzilla.scilab.org/show_bug.cgi?id=15523): `%ODEOPTIONS(1)=2` didn't work with solvers 'rk' and 'rkf' 
 * [#15577](http://bugzilla.scilab.org/show_bug.cgi?id=15577): `edit` did not accept a line number as text, as with `edit linspace 21`.
+* [#15983](http://bugzilla.scilab.org/show_bug.cgi?id=15983): `group()` regressed in 5.5.2 due to a too intrusive fix.
 * [#16005](http://bugzilla.scilab.org/show_bug.cgi?id=16005): The `intdec` example was biased and not robust when changing sampling frequencies.
 * [#16021](http://bugzilla.scilab.org/show_bug.cgi?id=16021): `tand([-90 90])` answered [Nan Nan] instead of [-Inf, Inf]. `cotd([-90 90])` answered [Nan Nan] instead of [0 0]. `1 ./cosd([-90 90])` answered [Inf -Inf] instead of [Inf Inf].
index 2670f42..969bf5e 100644 (file)
@@ -1,6 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA - 1988 - C. Bunks
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
@@ -34,7 +33,6 @@ function [tg,fr]=group(npts,a1i,a2i,b1i,b2i)
     //
     //!
 
-
     //get frequency grid values in [0,.5)
 
     fr=(0:.5/npts:.5*(npts-1)/npts);
@@ -49,67 +47,76 @@ function [tg,fr]=group(npts,a1i,a2i,b1i,b2i)
     //if the number of arguments is 2 then
     //the case may be non-cascade
 
-    hcs=1;
+    hcs = 1;
     if ne==2 then
 
         //get the type of h and the variable name
 
-        h=a1i;
-        ht=type(h);
+        h = a1i;
+        ht = type(h);
         if and(ht <> [1 2 15 16]) then
             error(sprintf(_("%s: Wrong type for input argument #%d: A real or polynomial matrix or a rational expected.\n"), "group", 2));
         end
-        if ht == 16 & or(h.dt == "c" | h.dt == []) then
+        if ht==16 & (h.dt == "c" | h.dt == []) then
             error(sprintf(_("%s: Wrong type for input argument #%d: A discrete system expected.\n"), "group", 2));
         end
 
         //if ht==1 then h is a vector containing filter coefficients
 
         if ht==1 then
+            // make h a rational polynomial
+            hs = max(size(h));
+            z = poly(0,"z");
+            h = poly(h,"z","c");
+            h = gtild(h,"d")*(1/z^(hs-1));
+            ht = 16;
+        end
+
+        //if ht==16 then h is a rational polynomial
+        //(perhaps in cascade form)
 
-            //make h a rational polynomial
-
-            hcs=max(size(h));
-            z=poly(0,"z");
-            h=poly(h,"z","c");
-            h=gtild(h,"d")*(1/z^(hcs-1));
-        elseif ht == 2 then
-            z = poly(0, varn(h));
-        else  //ht==15|ht==16
-            z=poly(0, varn(h(3)));
-            hcs=max(size(h(2)));
+        //-compat ht==15 retained for list/tlist compatibility
+        if ht==15 | ht==16 then
+            z = varn(h(3));
+            hcs = max(size(h(2)));
         end,
 
         //if the rational polynomial is not in cascade form then
 
         if hcs==1 then
+
+            if ht==2 then  // h is a regular polynomial
+                z=varn(h);
+            end,
+
             //get the derivative of h(z)
 
             hzd=derivat(h);
 
             //get the group delay of h(z)
+
+            z=poly(0,z);
             tgz=-z*hzd/h;
 
             //evaluate tg
 
             rfr=exp(2*%pi*%i*fr);
-
-
             tg=real(freq(tgz(2),tgz(3),rfr));
 
             //done with non-cascade calculation of group delay
 
         end,
-        //re-organize if h is in cascade form
-
-        if hcs>1 then
-            xc=[coeff(h(2)),coeff(h(3))];
-            a2i=xc(1:hcs);
-            a1i=xc(hcs+1:2*hcs);
-            b2i=xc(3*hcs+1:4*hcs);
-            b1i=xc(4*hcs+1:5*hcs);
-            ne=5;
-        end,
+    end,
+
+    //re-organize if h is in cascade form
+
+    if hcs>1 then
+        xc=[coeff(h(2)),coeff(h(3))];
+        a2i=xc(1:hcs);
+        a1i=xc(hcs+1:2*hcs);
+        b2i=xc(3*hcs+1:4*hcs);
+        b1i=xc(4*hcs+1:5*hcs);
+        ne=5;
     end,
 
     //if implementation is in cascade form
diff --git a/scilab/modules/signal_processing/tests/nonreg_tests/bug_15983.tst b/scilab/modules/signal_processing/tests/nonreg_tests/bug_15983.tst
new file mode 100644 (file)
index 0000000..acd59d8
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15983 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15983
+//
+// <-- Short Description -->
+// group() regressed in Scilab 5.5.2 due a too intrusive fix of bug 13692
+
+h = wfir('lp',7,[.2,0],'hm',[0.01,-1]);
+assert_checkequal(execstr("group(100,h)", "errcatch"), 0);
+
+// As well:
+// test_run signal_processing bug_13205 show_error
+// test_run signal_processing bug_13692 show_error
+