* Bug 16028 fixed: intdec(intdec(x,r),1/r) now 'symmetric' 12/20912/4
Samuel GOUGEON [Fri, 29 Mar 2019 19:15:10 +0000 (20:15 +0100)]
  http://bugzilla.scilab.org/16028

Change-Id: I6504b6d394cdc626eccb0cb3101e6d72c213904f

scilab/CHANGES.md
scilab/modules/signal_processing/macros/intdec.sci
scilab/modules/signal_processing/tests/unit_tests/intdec.tst [new file with mode: 0644]

index ba8aa8b..9a531da 100644 (file)
@@ -389,6 +389,7 @@ Bug Fixes
 * [#16019](https://bugzilla.scilab.org/16019): `polarplot(x,Z)` yielded an error when x is a vector and Z a matrix.
 * [#16021](https://bugzilla.scilab.org/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].
 * [#16026](https://bugzilla.scilab.org/16026): For `atanh`, neither the documentation pages nor the `m2sci` converter were up to date.
+* [#16028](https://bugzilla.scilab.org/16028): The length of `intdec(intdec(x, r), 1/r)` was most often different from length(x).
 * [#16046](https://bugzilla.scilab.org/16046): After `w=ssrand(2,3,4)`, `[]+w`, `[]-w`, `w+[]` and `w-[]` yielded an "operation +/- []" warning.
 * [#16051](https://bugzilla.scilab.org/16051): undefined list elements could be of 2 distinct typeof "void" or "listundefined" according to the way they are created.
 * [#16053](https://bugzilla.scilab.org/16053): `plot(,"color",c)` no longer supported standard abbreviated color names c like "k" for black.
index 1655e93..6554216 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA - 1990 - C. Bunks
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2019 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -35,18 +35,18 @@ function [y] = intdec(x,lom)
     //Assuming that the signal length is N (=xsize)
     //the interpolated signal is N*l and the decimated
     //signal is N*l/m.  The resulting output will have
-    //length int(N*l/m).
+    //length round(N*l/m).
 
     xlsize = xsize.*l;
-    xmsize = int(xlsize./m);
+    xmsize = round(xlsize./m);
 
     //Since the location of %pi in the frequency domain
     //falls on a sample point for N even and between two
     //sample points for N odd care must be taken to differentiate
     //between the two cases in the following manipulations.
 
-    leven = 2*(int(xsize/2)-xsize/2)+ones(xsize);
-    meven = 2*(int(xmsize/2)-xmsize/2)+ones(xmsize);
+    leven = 2*(round(xsize/2)-xsize/2)+ones(xsize);
+    meven = 2*(round(xmsize/2)-xmsize/2)+ones(xmsize);
 
     //The position of %pi for the Fourier transform of the
     //original signal is different for odd and even length signals.
@@ -54,10 +54,10 @@ function [y] = intdec(x,lom)
     //for an odd length signal %pi is between the (N+1)/2 and the
     //(N+1)/2 + 1 samples.
 
-    fp = int(xsize/2)+ones(xsize);
+    fp = round(xsize/2)+ones(xsize);
     fpc = xsize-fp+leven;
 
-    fm = int(xmsize/2)+ones(xmsize);
+    fm = round(xmsize/2)+ones(xmsize);
     fmc = fm-ones(fm)-meven;
 
     //If the input is a constant then don't do the work
diff --git a/scilab/modules/signal_processing/tests/unit_tests/intdec.tst b/scilab/modules/signal_processing/tests/unit_tests/intdec.tst
new file mode 100644 (file)
index 0000000..4367ab0
--- /dev/null
@@ -0,0 +1,42 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+// ===================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// Resampling accuracy
+// -------------------
+F0 = 2;                   // Signal frequency
+Fs1 = 1000;               // initial sampling frequency
+t1 = linspace(0, 5-1/Fs1, Fs1*5);
+u1 = sin(2*%pi*F0*t1);
+for Fs2 = int(Fs1*(0.5:0.15:1.6))   // targeted resampling frequency
+    t2 = linspace(0, 5-1/Fs2, Fs2*5);
+    u2 = sin(2*%pi*F0*t2);     // Direct sampling at targeted frequency (as reference)
+    u2b = intdec(u1, Fs2/Fs1); // Resampled signal
+    assert_checktrue(max(abs(u2b-u2))< 4e-14)
+end
+
+// length(intdec(intdec(x, r), 1/r)) == length(x)
+// ----------------------------------------------
+Fs1 = 1000;               // initial sampling frequency
+F0 = 2;                    // Signal frequency
+t1 = linspace(0, 5-1/Fs1, 5*Fs1)';
+u1 = sin(2*%pi*F0*t1);
+L1 = length(u1);
+for Fs2 = 695:705     // targeted resampling frequency < Fs1
+    r = intdec(intdec(u1, Fs2/Fs1), Fs1/Fs2);
+    assert_checkequal(length(r), L1);
+end
+for Fs2 = 1295:1305     // targeted resampling frequency > Fs1
+    r = intdec(intdec(u1, Fs2/Fs1), Fs1/Fs2);
+    assert_checkequal(length(r), L1);
+end