Bug #11300 fixed - freson calculated wrong frequencies in scilab-5.3.3 25/8225/2
steer [Fri, 20 Jul 2012 15:23:02 +0000 (17:23 +0200)]
Change-Id: I8baa7dcbe0cac3c4680225cc7ade9f38209f27ec

scilab/CHANGES_5.4.X
scilab/modules/cacsd/macros/freson.sci
scilab/modules/cacsd/tests/nonreg_tests/bug_11300.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_11300.tst [new file with mode: 0644]

index 12d8c8d..16bd212 100644 (file)
@@ -108,6 +108,8 @@ Bug Fixes
 
 * Bug #11203 fixed - Description for info output parameter was wrong in lsqrsolve help page.
 
+* Bug #11300 fixed - freson calculated wrong frequencies in scilab-5.3.3.
+
 * Bug #11346 fixed - Add error messages in the cosm function in case of bad
                      usage.
 
index f2aafc6..56fa9ee 100644 (file)
@@ -1,40 +1,42 @@
-
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA - 
-// 
+// Copyright (C) INRIA -
+//
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // you should have received as part of this distribution.  The terms
-// are also available at    
+// are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
 function fr=freson(h)
+  [lhs,rhs]=argn(0);
+  [n,d]=h(["num","den"]);
+  if type(n)==1 then
+    n=poly(n,varn(d),"c");
+  end
+  if coeff(d,0)==0 then
+    error(msprintf(_("%s: Wrong value for input argument #%d: infinite gain at zero frequency.\n"),"freson",1))
+  end
+  //look for  omega such that derivative of magn. is zero
+  niw=horner(n,%i*poly(0,"w"));
+  diw=horner(d,%i*poly(0,"w"));
+  niw=real(niw*conj(niw));diw=real(diw*conj(diw));
+  modul_d=derivat(niw/diw);w=roots(modul_d.num);
 
-[lhs,rhs]=argn(0)
-[n,d]=h(['num','den']);
-if type(n)==1 then n=poly(n,varn(d),'c'),end
-d0=coeff(d,0)
-if d0==0 then
-   error('infinite gain at zero frequency'),
-end;
-ar0=abs(coeff(n,0)/d0)^2
-//look for  omega such that derivative of magn. is zero
-niw=horner(n,%i*poly(0,'w'));
-diw=horner(d,%i*poly(0,'w'))
-niw=real(niw*conj(niw));diw=real(diw*conj(diw));
-modul_d=derivat(niw/diw);w=roots(modul_d(2));
-
-// get extreme points
-k=find(imag(w)==0&real(w)>=0)
-if k==[] then fr=[],g=[],return,end
-w=real(w(k))
+  // get extreme points
+  k=find(imag(w)==0&real(w)>=0);
+  if k==[] then
+    fr=[];
+    g=[];
+    return
+  end
+  w=gsort(real(w(k)),"g","i");
 
-//find maximums
-wx=max(w)+0.5
-if horner(modul_d,wx)<0 then
-  w=w($:-2:1)
-else
-  w=w($-1:-2:1)
-end
-fr=w/(2*%pi)
+  //find maximums
+  wx=max(w)+0.5;
+  if horner(modul_d,wx)<0 then
+    w=w($:-2:1);
+  else
+    w=w($-1:-2:1);
+  end
+  fr=w/(2*%pi);
 endfunction
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_11300.dia.ref b/scilab/modules/cacsd/tests/nonreg_tests/bug_11300.dia.ref
new file mode 100644 (file)
index 0000000..7434e06
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+//
+// <-- Non-regression test for bug 11300 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11300
+//
+// <-- Short Description -->
+// freson calculates wrong frequencies
+s = %s;
+h = syslin('c', 0.5 * (2*s+1)/s^2 / (s^2 + 0.4*s + 4));
+hc = (2*h) /. 1;
+ref= [0.3098445669312;0.0720289283079]; 
+assert_checkalmostequal(freson(hc), ref);
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_11300.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_11300.tst
new file mode 100644 (file)
index 0000000..7c8c77a
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+//
+//
+// <-- Non-regression test for bug 11300 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11300
+//
+// <-- Short Description -->
+// freson calculates wrong frequencies
+
+s = %s;
+h = syslin('c', 0.5 * (2*s+1)/s^2 / (s^2 + 0.4*s + 4));
+hc = (2*h) /. 1;
+
+ref= [0.3098445669312;0.0720289283079]; 
+
+assert_checkalmostequal(freson(hc), ref);