* Bug #9851 fixed - Error message occurred because of a cut-off frequency of 0.25Hz... 06/11406/3
Charlotte HECQUET [Fri, 26 Apr 2013 07:29:21 +0000 (09:29 +0200)]
Change-Id: I7c60392405e432d0a6c3b86c29b217573d9df5ae

scilab/CHANGES_5.5.X
scilab/modules/signal_processing/macros/trans.sci
scilab/modules/signal_processing/tests/nonreg_tests/bug_9851.dia.ref [new file with mode: 0644]
scilab/modules/signal_processing/tests/nonreg_tests/bug_9851.tst [new file with mode: 0644]

index 4b2b09c..db3abe9 100644 (file)
@@ -127,6 +127,8 @@ Bug fixes
 
 * Bug #9780 fixed - gmres solver did not run with complex systems.
 
+* Bug #9851 fixed - Error message occurred because of a cut-off frequency of 0.25Hz with irr.
+
 * Bug #10254 fixed - Slight improvements in help page of ones.
 
 * Bug #10287 fixed - An error message added for complex expression as input argument of integrate function.
index 447b1fc..8327732 100644 (file)
@@ -8,92 +8,98 @@
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
 function [hzt,zt,gt]=trans(pd,zd,gd,tr_type,frq)
-//hzt=trans(pd,zd,gd,tr_type,frq)
-//macro for transforming standardized low-pass filter into
-//one of the following filters:
-//     low-pass, high-pass, band-pass, stop-band.
-// hz      :input polynomial
-// tr_type :type of transformation
-// frq     :frequency values
-// hzt     :output polynomial
-//!
-  if and(argn(1)<>[1 3]) then
-    error(msprintf(gettext("%s: Wrong number of output arguments: %d or %d expected.\n"),'trans',1,3))
-  end
-  select argn(2)
-  case 3 then //trans(hz,tr_type,frq): filter given by a siso tranfer function
-    hz=pd
-    if typeof(hz)<>"rational" then
-      error(msprintf(_("%s: Wrong type for input argument #%d: rational fraction array expected.\n"),"trans",1))
+    //hzt=trans(pd,zd,gd,tr_type,frq)
+    //macro for transforming standardized low-pass filter into
+    //one of the following filters:
+    //     low-pass, high-pass, band-pass, stop-band.
+    // hz      :input polynomial
+    // tr_type :type of transformation
+    // frq     :frequency values
+    // hzt     :output polynomial
+    //!
+    if and(argn(1)<>[1 3]) then
+        error(msprintf(gettext("%s: Wrong number of output arguments: %d or %d expected.\n"),'trans',1,3))
     end
-    if size(hz,'*')<>1 then
-      error(msprintf(_("%s: Wrong size for input argument #%d: A single input, single output system expected.\n"),'trans',1))
+    select argn(2)
+    case 3 then //trans(hz,tr_type,frq): filter given by a siso tranfer function
+        hz=pd
+        if typeof(hz)<>"rational" then
+            error(msprintf(_("%s: Wrong type for input argument #%d: rational fraction array expected.\n"),"trans",1))
+        end
+        if size(hz,'*')<>1 then
+            error(msprintf(_("%s: Wrong size for input argument #%d: A single input, single output system expected.\n"),'trans',1))
+        end
+        tr_type=zd;tr_pos=2;
+        frq=gd;frq_pos=3;
+        pd=roots(hz.den)
+        zd=roots(hz.num)
+        gd=coeff(hz.num,degree(hz.num))/coeff(hz.den,degree(hz.den))
+    case 5 then //trans(pd,zd,gd,tr_type,frq):  filter given by zeros,poles and gain
+        if type(pd)<>1 then
+            error(msprintf(_("%s: Wrong type for input argument #%d: Array of floating point numbers expected.\n"),"trans",1))
+        end
+        if type(zd)<>1 then
+            error(msprintf(_("%s: Wrong type for input argument #%d: Array of floating point numbers expected.\n"),"trans",2))
+        end
+        if type(gd)<>1|size(gd,"*")<>1 then
+            error(msprintf(_("%s: Wrong size for input argument #%d: A scalar expected.\n"),"trans",3))
+        end
+        tr_pos=4;
+        frq_pos=5;
+    else
+        error(msprintf(_("%s: Wrong number of input arguments: %d or %d expected.\n"),"trans",3,5))
     end
-    tr_type=zd;tr_pos=2;
-    frq=gd;frq_pos=3;
-    pd=roots(hz.den)
-    zd=roots(hz.num)
-    gd=coeff(hz.num,degree(hz.num))/coeff(hz.den,degree(hz.den))
-  case 5 then //trans(pd,zd,gd,tr_type,frq):  filter given by zeros,poles and gain
-    if type(pd)<>1 then
-      error(msprintf(_("%s: Wrong type for input argument #%d: Array of floating point numbers expected.\n"),"trans",1))
+    if and(tr_type<>['lp','hp','bp','sb']) then
+        error(msprintf(_("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),"trans",tr_pos,"''lp'',''hp'',''bp'',''sb''"))
     end
-    if type(zd)<>1 then
-      error(msprintf(_("%s: Wrong type for input argument #%d: Array of floating point numbers expected.\n"),"trans",2))
+    if type(frq)<>1 then
+        error(msprintf(_("%s: Wrong type for input argument #%d: Array of floating point numbers expected.\n"),"trans",frq_pos))
     end
-    if type(gd)<>1|size(gd,"*")<>1 then
-      error(msprintf(_("%s: Wrong size for input argument #%d: A scalar expected.\n"),"trans",3))
+    if or(tr_type==['lp','hp']) then
+        if and(size(frq,'*')<>[1,2]) then
+            error(msprintf(_("%s: Wrong size for input argument #%d: A scalar expected.\n"),"trans",frq_pos))
+        end
+        fu=frq(1)
+    else
+        if size(frq,'*')<>2 then
+            error(msprintf(_("%s: Wrong size for input argument #%d: A %d elements array expected.\n"),"trans",frq_pos,2))
+        end
+        fu=frq(1);fl=frq(2);
     end
-    tr_pos=4;
-    frq_pos=5;
-  else
-    error(msprintf(_("%s: Wrong number of input arguments: %d or %d expected.\n"),"trans",3,5))
-  end
-  if and(tr_type<>['lp','hp','bp','sb']) then
-    error(msprintf(_("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),"trans",tr_pos,"''lp'',''hp'',''bp'',''sb''"))
-  end
-  if type(frq)<>1 then
-    error(msprintf(_("%s: Wrong type for input argument #%d: Array of floating point numbers expected.\n"),"trans",frq_pos))
-  end
-  if or(tr_type==['lp','hp']) then
-    if and(size(frq,'*')<>[1,2]) then
-      error(msprintf(_("%s: Wrong size for input argument #%d: A scalar expected.\n"),"trans",frq_pos))
+
+    z=poly(0,'z');fc=.25;
+    //make filter type using all-pass change of variables
+    select tr_type
+    case 'lp' then
+        alpha=sin(%pi*(fc-fu))/sin(%pi*(fc+fu));
+        num=z-alpha;
+        den=1-alpha*z;
+    case 'hp' then
+        alpha=-cos(%pi*(fc-fu))/cos(%pi*(fc+fu));
+        num=-(1+alpha*z);
+        den=z+alpha;
+    case 'bp' then
+        k=tan(%pi*fc)/tan(%pi*(fu-fl));
+        alpha=cos(%pi*(fu+fl))/cos(%pi*(fu-fl));
+        num=-((k+1)-2*alpha*k*z+(k-1)*z^2);
+        den=(k+1)*z^2-2*alpha*k*z+(k-1);
+    case 'sb' then
+        k=tan(%pi*fc)*tan(%pi*(fu-fl));
+        alpha=cos(%pi*(fu+fl))/cos(%pi*(fu-fl));
+        num=(k+1)-2*alpha*z+(1-k)*z^2;
+        den=(k+1)*z^2-2*alpha*z+(1-k);
     end
-    fu=frq(1)
-  else
-    if size(frq,'*')<>2 then
-      error(msprintf(_("%s: Wrong size for input argument #%d: A %d elements array expected.\n"),"trans",frq_pos,2))
+    if tr_type == 'lp' & fu == 0.25 then //no change of variables is necessary if user wants a low pass filter with cut off frequency of 0.25Hz.
+        pt=pd;
+        zt=zd;
+        gt=gd;
+    else
+        [pt,zt,gt]=bilt(pd,zd,gd,num,den);
+    end
+    if argn(1)==1 then
+        hzt=rlist(gt*real(poly(zt,'z')),real(poly(pt,'z')),'d');
+    else
+        hzt=pt(:)
+        zt=zt(:)
     end
-    fu=frq(1);fl=frq(2);
-  end
-
-  z=poly(0,'z');fc=.25;
-  //make filter type using all-pass change of variables
-  select tr_type
-  case 'lp' then
-    alpha=sin(%pi*(fc-fu))/sin(%pi*(fc+fu));
-    num=z-alpha;
-    den=1-alpha*z;
-  case 'hp' then
-    alpha=-cos(%pi*(fc-fu))/cos(%pi*(fc+fu));
-    num=-(1+alpha*z);
-    den=z+alpha;
-  case 'bp' then
-    k=tan(%pi*fc)/tan(%pi*(fu-fl));
-    alpha=cos(%pi*(fu+fl))/cos(%pi*(fu-fl));
-    num=-((k+1)-2*alpha*k*z+(k-1)*z^2);
-    den=(k+1)*z^2-2*alpha*k*z+(k-1);
-  case 'sb' then
-    k=tan(%pi*fc)*tan(%pi*(fu-fl));
-    alpha=cos(%pi*(fu+fl))/cos(%pi*(fu-fl));
-    num=(k+1)-2*alpha*z+(1-k)*z.^2;
-    den=(k+1)*z.^2-2*alpha*z+(1-k);
-  end
-  [pt,zt,gt]=bilt(pd,zd,gd,num,den);
-  if argn(1)==1 then
-    hzt=rlist(gt*real(poly(zt,'z')),real(poly(pt,'z')),'d');
-  else
-    hzt=pt(:)
-    zt=zt(:)
-  end
 endfunction
diff --git a/scilab/modules/signal_processing/tests/nonreg_tests/bug_9851.dia.ref b/scilab/modules/signal_processing/tests/nonreg_tests/bug_9851.dia.ref
new file mode 100644 (file)
index 0000000..9d0d807
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 9851 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9851
+//
+// <-- Short Description -->
+// Error message occurs because of a cut-off frequency of 0.25Hz with irr
+hz=iir(2,'lp','butt',[0.25 0.25],[0 0]);
+z=poly(0,'z');
+num=0.292893218813+0.585786437627*z+0.292893218813*z^2;
+den=0.171572875254+5.55111512d-17*z+z^2;
+assert_checkalmostequal(coeff(numer(hz)), coeff(num), 1d-9);
+assert_checkalmostequal(coeff(denom(hz)), coeff(den), 1d-9);
diff --git a/scilab/modules/signal_processing/tests/nonreg_tests/bug_9851.tst b/scilab/modules/signal_processing/tests/nonreg_tests/bug_9851.tst
new file mode 100644 (file)
index 0000000..fba8c8f
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 9851 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=9851
+//
+// <-- Short Description -->
+// Error message occurs because of a cut-off frequency of 0.25Hz with irr
+
+hz=iir(2,'lp','butt',[0.25 0.25],[0 0]);
+z=poly(0,'z');
+num=0.292893218813+0.585786437627*z+0.292893218813*z^2;
+den=0.171572875254+5.55111512d-17*z+z^2;
+assert_checkalmostequal(coeff(numer(hz)), coeff(num), 1d-9);
+assert_checkalmostequal(coeff(denom(hz)), coeff(den), 1d-9);