* Bug 15799 fixed: ifftshift() could not invert fftshift(x,dir) 73/20573/5
Samuel GOUGEON [Sun, 21 Oct 2018 20:46:47 +0000 (22:46 +0200)]
  http://bugzilla.scilab.org/15799

Change-Id: I05e077c4a0c88d8276c325dca52c6e810ca6b2bb

12 files changed:
scilab/CHANGES.md
scilab/modules/helptools/images/fftshift_2.png
scilab/modules/signal_processing/help/en_US/transforms/fftshift.xml
scilab/modules/signal_processing/help/en_US/transforms/ifftshift.xml
scilab/modules/signal_processing/help/fr_FR/transforms/ifftshift.xml
scilab/modules/signal_processing/help/ja_JP/transforms/fftshift.xml
scilab/modules/signal_processing/help/ja_JP/transforms/ifftshift.xml
scilab/modules/signal_processing/macros/fftshift.sci
scilab/modules/signal_processing/macros/ifftshift.sci
scilab/modules/signal_processing/tests/unit_tests/fftshift.tst [new file with mode: 0644]
scilab/modules/signal_processing/tests/unit_tests/ifftshift.dia.ref [deleted file]
scilab/modules/signal_processing/tests/unit_tests/ifftshift.tst [deleted file]

index 6361ae1..f53ce06 100644 (file)
@@ -642,6 +642,7 @@ Known issues
 * [#15778](http://bugzilla.scilab.org/show_bug.cgi?id=15778): Deleting some rows or columns of a boolean sparse array with `= []` crashed Scilab
 * [#15779](http://bugzilla.scilab.org/show_bug.cgi?id=15779): `test_run` did not accept the wildcard * in tests names.
 * [#15796](http://bugzilla.scilab.org/show_bug.cgi?id=15796): Display after `mprintf("")` crashed Scilab (regression)
+* [#15799](http://bugzilla.scilab.org/show_bug.cgi?id=15799): `ifftshift()` could not invert `fftshift(x, along)` directional actions.
 * [#15808](http://bugzilla.scilab.org/show_bug.cgi?id=15808): `[5i]` was parsed as `[5,i]`
 * [#15809](http://bugzilla.scilab.org/show_bug.cgi?id=15809): HDF5 load/save was super slow for nested lists.
 * [#15813](http://bugzilla.scilab.org/show_bug.cgi?id=15813): In polarplot mode, datatips displayed irrelevant cartesian coordinates instead of polar ones.
index 8afab51..702df49 100644 (file)
Binary files a/scilab/modules/helptools/images/fftshift_2.png and b/scilab/modules/helptools/images/fftshift_2.png differ
index d97b61f..cfce55c 100644 (file)
@@ -6,27 +6,27 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
-        <synopsis>y=fftshift(x [,job])</synopsis>
+        <synopsis>
+            y = fftshift(x)
+            y = fftshift(x, along)
+        </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>x</term>
+                <term>x, y</term>
                 <listitem>
-                    <para>real or complex vector or matrix.</para>
+                    <para>vectors, matrices or hypermatrices, of same sizes.</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>y</term>
+                <term>along</term>
                 <listitem>
-                    <para>real or complex vector or matrix.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>job</term>
-                <listitem>
-                    <para>integer, dimension selection, or string 'all'</para>
+                    <para>
+                        1 | "r" | 2 | "c" | 0&lt;along&lt;=ndims(x): dimension along which
+                        halves are switched.
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Description</title>
         <para>
-            If <literal>x</literal> results of an fft computation <literal>y=fftshift(x)</literal> or <literal>y=fftshift(x,"all")</literal> moves the zero frequency component to the center
-            of the spectrum, which is sometimes a more convenient form.
-        </para>
-        <para>
-            If <literal>x</literal> is a vector of size n, y is the vector <literal>x([n/2+1:n,1:n/2])</literal>
-        </para>
-        <para>
-            If <literal>x</literal> is an <literal>m</literal> by <literal>n</literal> matrix <literal>y</literal> is the matrix
-            <literal>x([m/2+1:n,1:m/2],[n/2+1:n,1:n/2])</literal>.
+            If <literal>x</literal> results of an fft computation, <literal>y=fftshift(x)</literal>
+            or <literal>y=fftshift(x,"all")</literal> moves the zero frequency component to the
+            center of the spectrum, which is sometimes a more convenient form.
         </para>
-        <programlisting role="no-scilab-exec"><![CDATA[
-  [x11 x12]                  [x22 x21]
-x=[       ]        gives   y=[       ]
-  [x21 x22]                  [x12 x11]
- ]]></programlisting>
+        <screen><![CDATA[
+x = [x1  x2 ]    gives   y = [x2  x1 ]  // vector
+
+    [x11 x12]                [x22 x21]
+x = |       |    gives   y = |       |  // matrix
+    [x21 x22]                [x12 x11]
+etc
+]]></screen>
         <para>
-            <literal>y=fftshift(x,n)</literal> makes the swap only along the <literal>n</literal>th dimension
+            <literal>y=fftshift(x,n)</literal> makes the swap only along the <literal>n</literal>th
+            dimension.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
+x = [1 2 3 4 5 6 7]
+fftshift(x)
+ ]]></programlisting>
+    <screen><![CDATA[
+--> x = [1 2 3 4 5 6 7]
+ x  =
+   1.   2.   3.   4.   5.   6.   7.
+
+--> fftshift(x)
+ ans  =
+   5.   6.   7.   1.   2.   3.   4.
+]]></screen>
+    <para/>
+        <programlisting role="example"><![CDATA[
+x = matrix(1:36,6,6)
+fftshift(x)
+fftshift(x, "r")
+fftshift(x, "c")
+ ]]></programlisting>
+    <screen><![CDATA[
+--> x = matrix(1:36,6,6)
+ x  =
+   1.   7.    13.   19.   25.   31.
+   2.   8.    14.   20.   26.   32.
+   3.   9.    15.   21.   27.   33.
+   4.   10.   16.   22.   28.   34.
+   5.   11.   17.   23.   29.   35.
+   6.   12.   18.   24.   30.   36.
+
+--> fftshift(x)       // Corners go to the center
+ ans  =
+   22.   28.   34.   4.   10.   16.
+   23.   29.   35.   5.   11.   17.
+   24.   30.   36.   6.   12.   18.
+   19.   25.   31.   1.   7.    13.
+   20.   26.   32.   2.   8.    14.
+   21.   27.   33.   3.   9.    15.
+
+--> fftshift(x, "r")  // External rows become middle rows
+ ans  =
+   4.   10.   16.   22.   28.   34.
+   5.   11.   17.   23.   29.   35.
+   6.   12.   18.   24.   30.   36.
+   1.   7.    13.   19.   25.   31.
+   2.   8.    14.   20.   26.   32.
+   3.   9.    15.   21.   27.   33.
+
+--> fftshift(x, "c")  // External columns become middle columns
+ ans  =
+   19.   25.   31.   1.   7.    13.
+   20.   26.   32.   2.   8.    14.
+   21.   27.   33.   3.   9.    15.
+   22.   28.   34.   4.   10.   16.
+   23.   29.   35.   5.   11.   17.
+   24.   30.   36.   6.   12.   18.
+]]></screen>
+    <para/>
+
+ <programlisting role="example"><![CDATA[
 // Make a signal
-t=0:0.1:1000;
-x=3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
+t = 0:0.1:1000;
+x = 3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
 // Compute the fft
-y=fft(x,-1);
+y = fft(x,-1);
 
 // Display
 clf();
-subplot(2,1,1);plot2d(abs(y))
-subplot(2,1,2);plot2d(fftshift(abs(y)))
+subplot(2,1,1); plot2d(abs(y))
+subplot(2,1,2); plot2d(fftshift(abs(y)))
  ]]></programlisting>
         <scilab:image>
             t=0:0.1:1000;
@@ -76,19 +133,17 @@ subplot(2,1,2);plot2d(fftshift(abs(y)))
         </scilab:image>
         <programlisting role="example"><![CDATA[
 // Make a 2D image
-t=0:0.1:30;
-x=3*sin(t')*cos(2*t)+8*sin(3*t')*sin(5*t)+..
+t = 0:0.1:30;
+x = 3*sin(t')*cos(2*t)+8*sin(3*t')*sin(5*t)+..
   0.5*sin(5*t')*sin(5*t)+3*rand(t')*rand(t);
 // Compute the fft
-y=fft(x,-1);
+y = fft(x,-1);
 
 // Display
 clf();
 gcf().color_map = hotcolormap(256);
-subplot(2,1,1);
-Matplot(abs(y))
-subplot(2,1,2);
-Matplot(fftshift(abs(y)))
+subplot(2,1,1); Matplot(abs(y))
+subplot(2,1,2); Matplot(fftshift(abs(y)))
  ]]></programlisting>
         <scilab:image>
             t=0:0.1:30;
@@ -111,6 +166,9 @@ Matplot(fftshift(abs(y)))
             <member>
                 <link linkend="ifftshift">ifftshift</link>
             </member>
+            <member>
+                <link linkend="flipdim">flipdim</link>
+            </member>
         </simplelist>
     </refsection>
 </refentry>
index 382e067..628f9b1 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2018 - 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.
  * For more information, see the COPYING file which you should have received
  * along with this program.
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="ifftshift">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+          xml:lang="en" xml:id="ifftshift">
     <refnamediv>
         <refname>ifftshift</refname>
         <refpurpose>inverse of fftshift</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
-        <synopsis>y=ifftshift(x)</synopsis>
+        <synopsis>
+            y = ifftshift(x)
+            y = ifftshift(x, along)
+        </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
             <varlistentry>
                 <term>x, y</term>
                 <listitem>
-                    <para>real or complex vector or matrix.</para>
+                    <para>vectors, matrices or hypermatrices of same sizes and types.</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>along</term>
+                <listitem>
+                    <para>
+                        1 | "r" | 2 | "c" | 0&lt;along&lt;=ndims(x): dimension along which
+                        halves are switched.
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Description</title>
         <para>
-            <literal>ifftshift(x)</literal> swaps the left and right halves of the vector <literal>x</literal>.
+            <literal>ifftshift(x)</literal> swaps the left and right halves of the vector
+            <literal>x</literal>.
         </para>
         <para>
-            For matrices, <literal>ifftshift(x)</literal> swaps the first quadrant with the third and the second quadrant with the fourth.
+            For matrices, <literal>ifftshift(x)</literal> swaps the first quadrant with the third,
+            and the second quadrant with the fourth.
         </para>
         <para>
             If <literal>x</literal> is a multidimensional array,
-            <literal>ifftshift(x)</literal> swaps "half-spaces" of <literal>x</literal> along each dimension.
+            <literal>ifftshift(x)</literal> swaps "half-spaces" of <literal>x</literal>
+            along each dimension, for all of them.
         </para>
+        <para>
+            <literal>y = ifftshift(x,n)</literal> makes the swap only along the
+            <literal>n</literal>th dimension.
+        </para>
+        <note>
+            <literal>ifftshift()</literal> is designed in such a way that whatever is
+            <literal>x</literal> with even or/and odd sizes,
+            <literal>ifftshift(fftshift(x))</literal> and <literal>fftshift(ifftshift(x))</literal>
+            are always equal to <literal>x</literal>.
+        </note>
     </refsection>
     <refsection>
         <title>Examples</title>
         <para>
             Example #1:
         </para>
+        <para>
+            When the size of a vector (or of a dimension>1) is even, <literal>fftshift()</literal> and
+            <literal>ifftshift()</literal> are equivalent. It is no longer the case when a size
+            is odd:
+        </para>
+        <programlisting role="example"><![CDATA[
+even = [1 2 3 4 5 6];
+odd  = [1 2 3 4 5 6 7];
+[fftshift(even) ; ifftshift(even)]
+[fftshift(odd)  ; ifftshift(odd)]
+
+// Both are always reciprocal:
+ifftshift(fftshift(odd))
+fftshift(ifftshift(odd))
+ ]]></programlisting>
+    <screen><![CDATA[
+--> even = [1 2 3 4 5 6];
+--> odd  = [1 2 3 4 5 6 7];
+--> [fftshift(even) ; ifftshift(even)]
+ ans  =
+   4.   5.   6.   1.   2.   3.
+   4.   5.   6.   1.   2.   3.
+
+--> [fftshift(odd)  ; ifftshift(odd)]
+ ans  =
+   5.   6.   7.   1.   2.   3.   4.
+   4.   5.   6.   7.   1.   2.   3.
+
+--> // Both are always reciprocal:
+--> ifftshift(fftshift(odd))
+ ans  =
+   1.   2.   3.   4.   5.   6.   7.
+
+--> fftshift(ifftshift(odd))
+ ans  =
+   1.   2.   3.   4.   5.   6.   7.
+]]></screen>
+        <para>
+            Example #2:
+        </para>
         <programlisting role="example"><![CDATA[
 // Make a signal
 t = 0:0.1:1000;
-x = 3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
+x = 3*sin(t) + 8*sin(3*t) + 0.5*sin(5*t) + 3*rand(t);
 // Compute the fft
 y = fft(x, -1);
 // Invert the result
@@ -64,13 +132,13 @@ invShift = ifftshift(shift);
 and(y == invShift)
  ]]></programlisting>
         <para>
-            Example #2:
+            Example #3:
         </para>
         <programlisting role="example"><![CDATA[
 // Make a 2D image
 t = 0:0.1:30;
-x = 3*sin(t')*cos(2*t)+8*sin(3*t')*sin(5*t)+..
-  0.5*sin(5*t')*sin(5*t)+3*rand(t')*rand(t);
+x = 3*sin(t')*cos(2*t) + 8*sin(3*t')*sin(5*t) + ..
+  0.5*sin(5*t')*sin(5*t) + 3*rand(t')*rand(t);
 // Compute the fft
 y = fft(x,-1);
 
@@ -91,6 +159,20 @@ and(y == invShift)
             <member>
                 <link linkend="fft">fft</link>
             </member>
+            <member>
+                <link linkend="flipdim">flipdim</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.2</revnumber>
+                <revdescription>
+                    Option <literal>along</literal> added.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 2d72e4b..b064cd4 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2018 - 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.
  * For more information, see the COPYING file which you should have received
  * along with this program.
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="fr" xml:id="ifftshift">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+          xml:lang="fr" xml:id="ifftshift">
     <refnamediv>
         <refname>ifftshift</refname>
         <refpurpose>inverse de fftshift</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Séquence d'appel</title>
-        <synopsis>y=ifftshift(x)</synopsis>
+        <synopsis>
+            y = ifftshift(x)
+            y = ifftshift(x, along)
+        </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Paramètres</title>
@@ -27,7 +33,9 @@
             <varlistentry>
                 <term>x, y</term>
                 <listitem>
-                    <para>vecteurs ou matrices réel(le)s ou complexes.</para>
+                    <para>
+                        vecteurs, matrices, ou hypermatrices de tailles et types identiques.
+                    </para>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Description</title>
         <para>
-            <literal>ifftshift(x)</literal> échange les moitiés gauche et droite du vecteur <literal>x</literal>.
+            <literal>ifftshift(x)</literal> échange les moitiés gauche et droite du vecteur
+            <literal>x</literal>.
         </para>
         <para>
-            Pour les matrices, <literal>ifftshift(x)</literal> échange le premier quadrant avec le troisième et le second avec le quatrième.
+            Pour les matrices, <literal>ifftshift(x)</literal> commute le 1er et le 3ème quadrants,
+            ainsi que le 2ème et le 4ème quadrants.
         </para>
         <para>
             Si <literal>x</literal> est un tableau multidimensionnel,
-            <literal>ifftshift(x)</literal> échange les "mi-espaces" de <literal>x</literal> selon chaque dimension.
+            <literal>ifftshift(x)</literal> commute les "hyper-quadrants" opposés par
+            rapport au centre du tableau.
+        </para>
+        <para>
+            <literal>y = ifftshift(x,n)</literal> effectue la commutation seulement entre les 2
+            moitiés de <literal>x</literal> selon la dimension n° <literal>n</literal>.
         </para>
+        <note>
+            <literal>ifftshift()</literal> est conçue telle que quel que soit <literal>x</literal>
+            de tailles paires et/ou impaires,
+            <literal>ifftshift(fftshift(x))</literal> et <literal>fftshift(ifftshift(x))</literal>
+            sont toujours égaux à <literal>x</literal>.
+        </note>
     </refsection>
     <refsection>
         <title>Exemples</title>
         <para>
-            Exemple #1:
+            Exemple n° 1 :
+        </para>
+        <para>
+            Lorsque la taille d'un vecteur (ou d'une dimension>1) est paire,
+            <literal>fftshift()</literal> et <literal>ifftshift()</literal> sont équivalentes.
+            Ce n'est plus le cas lorsque la taille est impaire (les longueurs des 2 "moitiés"
+            diffèrent alors de 1, et <literal>ifftshift</literal> le gère correctement):
+        </para>
+        <programlisting role="example"><![CDATA[
+even = [1 2 3 4 5 6];
+odd  = [1 2 3 4 5 6 7];
+[fftshift(even) ; ifftshift(even)]
+[fftshift(odd)  ; ifftshift(odd)]
+
+// Both are always reciprocal:
+ifftshift(fftshift(odd))
+fftshift(ifftshift(odd))
+ ]]></programlisting>
+    <screen><![CDATA[
+--> even = [1 2 3 4 5 6];
+--> odd  = [1 2 3 4 5 6 7];
+--> [fftshift(even) ; ifftshift(even)]
+ ans  =
+   4.   5.   6.   1.   2.   3.
+   4.   5.   6.   1.   2.   3.
+
+--> [fftshift(odd)  ; ifftshift(odd)]
+ ans  =
+   5.   6.   7.   1.   2.   3.   4.
+   4.   5.   6.   7.   1.   2.   3.
+
+--> // Les deux fonctions sont exactement réciproques :
+--> ifftshift(fftshift(odd))
+ ans  =
+   1.   2.   3.   4.   5.   6.   7.
+
+--> fftshift(ifftshift(odd))
+ ans  =
+   1.   2.   3.   4.   5.   6.   7.
+]]></screen>
+        <para/>
+        <para>
+            Exemple n° 2 :
         </para>
         <programlisting role="example"><![CDATA[
 // Création d'un signal
 t = 0:0.1:1000;
-x = 3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
+x = 3*sin(t) + 8*sin(3*t) + 0.5*sin(5*t) + 3*rand(t);
 // Calcul de sa fft
 y = fft(x, -1);
 // Inversion du résultat
@@ -63,14 +126,15 @@ invShift = ifftshift(shift);
 // On vérifie qu'on a bien recréé le résultat de départ
 and(y == invShift)
  ]]></programlisting>
+        <para/>
         <para>
-            Example #2:
+            Exemple n° 3 :
         </para>
         <programlisting role="example"><![CDATA[
 // Création d'une image 2D
 t = 0:0.1:30;
-x = 3*sin(t')*cos(2*t)+8*sin(3*t')*sin(5*t)+..
-  0.5*sin(5*t')*sin(5*t)+3*rand(t')*rand(t);
+x = 3*sin(t')*cos(2*t) + 8*sin(3*t')*sin(5*t) + ..
+  0.5*sin(5*t')*sin(5*t) + 3*rand(t')*rand(t);
 // Calcul de la fft
 y = fft(x,-1);
 
@@ -91,6 +155,20 @@ and(y == invShift)
             <member>
                 <link linkend="fft">fft</link>
             </member>
+            <member>
+                <link linkend="flipdim">flipdim</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>Historique</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.2</revnumber>
+                <revdescription>
+                    Option <literal>along</literal> ajoutée.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 70a562e..9619bb0 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="ja" xml:id="fftshift">
-
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+          xml:lang="ja" xml:id="fftshift">
     <refnamediv>
-
         <refname>fftshift</refname>
-
         <refpurpose>fft出力を再配置し,スペクトルの中心に周波数0を移動する</refpurpose>
-
     </refnamediv>
-
     <refsynopsisdiv>
-
         <title>呼び出し手順</title>
-
-        <synopsis>y=fftshift(x [,job])</synopsis>
-
+        <synopsis>
+            y = fftshift(x)
+            y = fftshift(x, along)
+        </synopsis>
     </refsynopsisdiv>
-
     <refsection>
-
         <title>引数</title>
-
         <variablelist>
-
             <varlistentry>
-
-                <term>x</term>
-
-                <listitem>
-
-                    <para>実数または複素数のベクトルまたは行列.</para>
-
-                </listitem>
-
-            </varlistentry>
-
-            <varlistentry>
-
-                <term>y</term>
-
+                <term>x, y</term>
                 <listitem>
-
-                    <para>実数または複素数のベクトルまたは行列.</para>
-
+                    <para>同じサイズのベクトル、行列またはハイパーマトリックス.</para>
                 </listitem>
-
             </varlistentry>
-
             <varlistentry>
-
-                <term>job</term>
-
+                <term>along</term>
                 <listitem>
-
                     <para>整数, 選択する次元, または文字列 'all'</para>
-
                 </listitem>
-
             </varlistentry>
-
         </variablelist>
-
     </refsection>
-
     <refsection>
-
         <title>説明</title>
-
         <para>
-
             <literal>x</literal>がFFT計算の結果の場合,
-
             <literal>y= fftshift(x)</literal> または <literal>y= fftshift(x,"all")</literal>
-
             は,扱いが容易な形式である,周波数0要素をよりスペクトルの中心に移動します.
-
-        </para>
-
-        <para>
-
-            <literal>x</literal> が大きさnのベクトルの場合,y はiベクトル
-
-            <literal>x([n/2+1:n,1:n/2])</literal>となります
-
         </para>
-
+        <screen><![CDATA[
+x = [x1  x2 ]    gives   y = [x2  x1 ]  // vector
+
+    [x11 x12]                [x22 x21]
+x = |       |    gives   y = |       |  // matrix
+    [x21 x22]                [x12 x11]
+etc
+]]></screen>
         <para>
-
-            <literal>x</literal>が  <literal>m</literal> 行 <literal>n</literal> 列行列の場合,
-
-            <literal>y</literal> は行列
-
-            <literal>x([m/2+1:n,1:m/2],[n/2+1:n,1:n/2])</literal>となります.
-
-        </para>
-
-        <programlisting role=""><![CDATA[
-  [x11 x12]                  [x22 x21]
-x=[       ]        gives   y=[       ]
-  [x21 x22]                  [x12 x11]
- ]]></programlisting>
-
-        <para>
-
             <literal>y= fftshift(x,n)</literal> は<literal>n</literal>番目の次元
-
             のみについて配置換えを行ないます.
-
         </para>
-
     </refsection>
-
     <refsection>
-
         <title>例</title>
-
+        <programlisting role="example"><![CDATA[
+x = [1 2 3 4 5 6 7]
+fftshift(x)
+ ]]></programlisting>
+    <screen><![CDATA[
+--> x = [1 2 3 4 5 6 7]
+ x  =
+   1.   2.   3.   4.   5.   6.   7.
+
+--> fftshift(x)
+ ans  =
+   5.   6.   7.   1.   2.   3.   4.
+]]></screen>
+    <para/>
+        <programlisting role="example"><![CDATA[
+x = matrix(1:36,6,6)
+fftshift(x)
+fftshift(x, "r")
+fftshift(x, "c")
+ ]]></programlisting>
+    <screen><![CDATA[
+--> x = matrix(1:36,6,6)
+ x  =
+   1.   7.    13.   19.   25.   31.
+   2.   8.    14.   20.   26.   32.
+   3.   9.    15.   21.   27.   33.
+   4.   10.   16.   22.   28.   34.
+   5.   11.   17.   23.   29.   35.
+   6.   12.   18.   24.   30.   36.
+
+--> fftshift(x)       // Corners go to the center
+ ans  =
+   22.   28.   34.   4.   10.   16.
+   23.   29.   35.   5.   11.   17.
+   24.   30.   36.   6.   12.   18.
+   19.   25.   31.   1.   7.    13.
+   20.   26.   32.   2.   8.    14.
+   21.   27.   33.   3.   9.    15.
+
+--> fftshift(x, "r")  // External rows become middle rows
+ ans  =
+   4.   10.   16.   22.   28.   34.
+   5.   11.   17.   23.   29.   35.
+   6.   12.   18.   24.   30.   36.
+   1.   7.    13.   19.   25.   31.
+   2.   8.    14.   20.   26.   32.
+   3.   9.    15.   21.   27.   33.
+
+--> fftshift(x, "c")  // External columns become middle columns
+ ans  =
+   19.   25.   31.   1.   7.    13.
+   20.   26.   32.   2.   8.    14.
+   21.   27.   33.   3.   9.    15.
+   22.   28.   34.   4.   10.   16.
+   23.   29.   35.   5.   11.   17.
+   24.   30.   36.   6.   12.   18.
+]]></screen>
+    <para/>
         <programlisting role="example"><![CDATA[
 //信号を作成
-t=0:0.1:1000;
-x=3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
+t = 0:0.1:1000;
+x = 3*sin(t) + 8*sin(3*t) + 0.5*sin(5*t) + 3*rand(t);
 //compute the fft
-y=fft(x,-1);
+y = fft(x,-1);
 
 //表示
 clf();
-subplot(2,1,1);plot2d(abs(y))
-subplot(2,1,2);plot2d(fftshift(abs(y)))
+subplot(2,1,1); plot2d(abs(y))
+subplot(2,1,2); plot2d(fftshift(abs(y)))
  ]]></programlisting>
-
         <scilab:image>
-
             t=0:0.1:1000;
-
             x=3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
-
             y=fft(x,-1);
-
             subplot(2,1,1);plot2d(abs(y))
-
             subplot(2,1,2);plot2d(fftshift(abs(y)))
-
         </scilab:image>
-
         <programlisting role="example"><![CDATA[
 //2次元画像を作成
-t=0:0.1:30;
-x=3*sin(t')*cos(2*t)+8*sin(3*t')*sin(5*t)+..
-  0.5*sin(5*t')*sin(5*t)+3*rand(t')*rand(t);
+t = 0:0.1:30;
+x = 3*sin(t')*cos(2*t) + 8*sin(3*t')*sin(5*t) + ..
+    0.5*sin(5*t')*sin(5*t) + 3*rand(t')*rand(t);
 //fftを計算
-y=fft(x,-1);
+y = fft(x,-1);
 
 //表示
 clf();
 gcf().color_map = hotcolormap(256);
-subplot(2,1,1);
-Matplot(abs(y))
-subplot(2,1,2);
-Matplot(fftshift(abs(y)))
+subplot(2,1,1); Matplot(abs(y))
+subplot(2,1,2); Matplot(fftshift(abs(y)))
  ]]></programlisting>
-
         <scilab:image>
-
             t=0:0.1:30;
-
             x=3*sin(t')*cos(2*t)+8*sin(3*t')*sin(5*t)+..
-
             0.5*sin(5*t')*sin(5*t)+3*rand(t')*rand(t);
-
             y=fft(x,-1);
-            
             gcf().color_map = hotcolormap(256);
-            
             subplot(2,1,1);
-            
             Matplot(abs(y))
-            
             subplot(2,1,2);
-            
             Matplot(fftshift(abs(y)))
-            
         </scilab:image>
-
     </refsection>
-
     <refsection role="see also">
-
         <title>参照</title>
-
         <simplelist type="inline">
-
             <member>
-
                 <link linkend="fft">fft</link>
-
             </member>
-
             <member>
-
                 <link linkend="ifftshift">ifftshift</link>
-
             </member>
-
+            <member>
+                <link linkend="flipdim">flipdim</link>
+            </member>
         </simplelist>
-
     </refsection>
-
-</refentry>
-
+</refentry>
\ No newline at end of file
index 28318ee..c6b4db9 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2018 - 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.
  * For more information, see the COPYING file which you should have received
  * along with this program.
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="ja" xml:id="ifftshift">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
+          xml:lang="ja" xml:id="ifftshift">
     <refnamediv>
         <refname>ifftshift</refname>
         <refpurpose>fftshiftを反転する</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>呼び出し手順</title>
-        <synopsis>y=ifftshift(x)</synopsis>
+        <synopsis>
+            y = ifftshift(x)
+            y = ifftshift(x, along)
+        </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>引数</title>
                     <para>実数または複素数のベクトルまたは行列.</para>
                 </listitem>
             </varlistentry>
+            <varlistentry>
+                <term>along</term>
+                <listitem>
+                    <para>整数, 選択する次元, または文字列 'all'</para>
+                </listitem>
+            </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
             <literal>ifftshift(x)</literal> は各次元で<literal>x</literal>の
             "半分の空間"を交換します.
         </para>
+        <para>
+            <literal>y= ifftshift(x,n)</literal> は<literal>n</literal>番目の次元
+            のみについて配置換えを行ないます.
+        </para>
+        <note>
+            <literal>ifftshift()</literal> is designed in such a way that whatever is
+            <literal>x</literal> with even or/and odd sizes,
+            <literal>ifftshift(fftshift(x))</literal> and <literal>fftshift(ifftshift(x))</literal>
+            are always equal to <literal>x</literal>.
+        </note>
     </refsection>
     <refsection>
         <title>例</title>
         <para>
-            例 #1:
+            Example #1:
+        </para>
+        <para>
+            When the size of a vector (or of a dimension>1) is even, <literal>fftshift()</literal>
+            and <literal>ifftshift()</literal> are equivalent. It is no longer the case when a size
+            is odd:
+        </para>
+        <programlisting role="example"><![CDATA[
+even = [1 2 3 4 5 6];
+odd  = [1 2 3 4 5 6 7];
+[fftshift(even) ; ifftshift(even)]
+[fftshift(odd)  ; ifftshift(odd)]
+
+// Both are always reciprocal:
+ifftshift(fftshift(odd))
+fftshift(ifftshift(odd))
+ ]]></programlisting>
+    <screen><![CDATA[
+--> even = [1 2 3 4 5 6];
+--> odd  = [1 2 3 4 5 6 7];
+--> [fftshift(even) ; ifftshift(even)]
+ ans  =
+   4.   5.   6.   1.   2.   3.
+   4.   5.   6.   1.   2.   3.
+
+--> [fftshift(odd)  ; ifftshift(odd)]
+ ans  =
+   5.   6.   7.   1.   2.   3.   4.
+   4.   5.   6.   7.   1.   2.   3.
+
+--> // Both are always reciprocal:
+--> ifftshift(fftshift(odd))
+ ans  =
+   1.   2.   3.   4.   5.   6.   7.
+
+--> fftshift(ifftshift(odd))
+ ans  =
+   1.   2.   3.   4.   5.   6.   7.
+]]></screen>
+        <para/>
+        <para>
+            例 #2:
         </para>
         <programlisting role="example"><![CDATA[
 // 信号を生成
 t = 0:0.1:1000;
-x = 3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
+x = 3*sin(t) + 8*sin(3*t) + 0.5*sin(5*t) + 3*rand(t);
 // fftを計算
 y = fft(x, -1);
 // 結果を反転
@@ -66,16 +129,18 @@ invShift = ifftshift(shift);
 // 元の結果を再成したどうかを確認
 and(y == invShift)
  ]]></programlisting>
+        <para/>
         <para>
-            例 #2:
+            例 #3:
         </para>
         <programlisting role="example"><![CDATA[
 // 2次元画像を生成
 t = 0:0.1:30;
-x = 3*sin(t')*cos(2*t)+8*sin(3*t')*sin(5*t)+..
-  0.5*sin(5*t')*sin(5*t)+3*rand(t')*rand(t);
+x = 3*sin(t')*cos(2*t) + 8*sin(3*t')*sin(5*t) + ..
+  0.5*sin(5*t')*sin(5*t) + 3*rand(t')*rand(t);
 // fftを計算
 y = fft(x,-1);
+
 // 結果を反転
 shift = fftshift(y);
 // 反転結果を反転
@@ -93,6 +158,20 @@ and(y == invShift)
             <member>
                 <link linkend="fft">fft</link>
             </member>
+            <member>
+                <link linkend="flipdim">flipdim</link>
+            </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>履歴</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.2</revnumber>
+                <revdescription>
+                    Option <literal>along</literal> added.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index a0dc4db..60aa026 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function x = fftshift(x,job)
-    if argn(2)<2 then job="all",end
-    deff("sel=fun(sk)","c=ceil(sk/2);sel=[c+1:sk,1:c]")
-    if job=="r" then job=1,elseif job=="c" then job=2,end
-    ind=list()
-    if job=="all" then
-        for sk=size(x),ind($+1)=fun(sk),end
+function x = fftshift(x, along)
+    nrhs = argn(2)
+    way = "ceil"
+    if ~isdef("ifftshift_way","n") then
+        fname = "fftshift"
+    else
+        fname = "ifftshift"
+        way = "floor"
+    end
+    if nrhs < 1 | nrhs>2 then
+        msg = _("%s: Wrong number of input arguments: %d or %d expected.\n");
+        error(msprintf(msg, fname, 1, 2));
+    end
+
+    // Checking "along"
+    if argn(2)<2 then
+        along = "all"
+    end
+    if along=="r" then
+        along = 1
+    elseif along=="c" then
+        along = 2
+    end
+    if and(type(along)~=[1 8 10]) | (type(along)==10 & along~="all")|..
+      (type(along)==1 & (~isreal(along) | along<1 |  along > ndims(x))) then
+        msg = _("%s: Argument #%d: Must be in the set {%s}.\n");
+        Set = strcat(msprintf("%d\n", (1:ndims(x))'),",")
+        error(msprintf(msg, fname, 2, Set))
+    end
+
+    // PROCESSING
+    // ----------
+    deff("sel=fun(sk)", "c=" + way + "(sk/2); sel=[c+1:sk,1:c]")
+    ind = list()
+    if along=="all" then
+        for sk = size(x)
+            ind($+1) = fun(sk)
+        end
     else
-        for sk=size(x),ind($+1)=:,end;
-        ind(job)=fun(size(x,job))
+        for sk = size(x)
+            ind($+1) = :
+        end
+        ind(along) = fun(size(x, along))
     end
-    x=x(ind(:))
+    x = x(ind(:))
 endfunction
index 4f35a80..c4f594d 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2011 - Scilab Enterprises - Allan Cornet
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function y = ifftshift(x)
-
-    if argn(2) < 1 then
-        error(sprintf(_("%s: Wrong number of input argument(s): %d expected.\n"), "ifftshift", 1));
-    end
-
-    numDims = ndims(x);
-    idx = list(1, numDims);
-
-    for k = 1:numDims
-        m = size(x, k);
-        p = floor(m/2);
-        idx(k) = [p+1:m 1:p];
-    end
-
-    y = x(idx(:));
-
+function y = ifftshift(varargin)
+    ifftshift_way = %t
+    y = fftshift(varargin(:))
 endfunction
diff --git a/scilab/modules/signal_processing/tests/unit_tests/fftshift.tst b/scilab/modules/signal_processing/tests/unit_tests/fftshift.tst
new file mode 100644 (file)
index 0000000..3ead231
--- /dev/null
@@ -0,0 +1,295 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// =============================================
+//  unitary tests for fftshift() and ifftshift()
+// =============================================
+
+vec = 1:60;
+res = ifftshift(vec);
+assert_checkequal(res(1:30), 31:60);
+assert_checkequal(res(31:60), 1:30);
+
+mat = matrix(vec, [10 6]);
+refRES = (1:5)';
+refRES = [refRES refRES+10 refRES+20];
+res = ifftshift(mat);
+assert_checkequal(res(1:5, 1:3), refRES+35);
+assert_checkequal(res(1:5, 4:6), refRES+5);
+assert_checkequal(res(6:10, 1:3), refRES+30);
+assert_checkequal(res(6:10, 4:6), refRES);
+
+
+// Even input sizes
+// ================
+// []
+assert_checkequal(fftshift([]),    []);
+assert_checkequal(fftshift([],1),  []);
+assert_checkequal(fftshift([],"r"),[]);
+assert_checkequal(fftshift([],2),  []);
+assert_checkequal(fftshift([],"c"),[]);
+assert_checkequal(ifftshift([]),    []);
+assert_checkequal(ifftshift([],1),  []);
+assert_checkequal(ifftshift([],"r"),[]);
+assert_checkequal(ifftshift([],2),  []);
+assert_checkequal(ifftshift([],"c"),[]);
+
+// Vector
+v = [1 2 3 4];
+r = [3 4 1 2];
+assert_checkequal(fftshift(v),  r);
+assert_checkequal(fftshift(v,1), v);
+assert_checkequal(fftshift(v,"r"), v);
+assert_checkequal(fftshift(v,2), r);
+assert_checkequal(fftshift(v,"c"), r);
+
+assert_checkequal(ifftshift(v),  r);
+assert_checkequal(ifftshift(v,1), v);
+assert_checkequal(ifftshift(v,"r"), v);
+assert_checkequal(ifftshift(v,2), r);
+assert_checkequal(ifftshift(v,"c"), r);
+
+// Matrix
+m = [
+  1   2     3   4
+  5   6     7   8
+
+  9  10    11  12
+  13 14    15  16
+];
+r = [
+  11 12    9 10
+  15 16   13 14
+
+   3  4    1  2
+   7  8    5  6
+];
+rr = [
+   9 10   11 12
+  13 14   15 16
+
+   1  2    3  4
+   5  6    7  8
+];
+rc = [
+   3  4    1  2
+   7  8    5  6
+
+  11 12    9 10
+  15 16   13 14
+];
+assert_checkequal(fftshift(m),    r);
+assert_checkequal(fftshift(m,1),  rr);
+assert_checkequal(fftshift(m,"r"),rr);
+assert_checkequal(fftshift(m,2),  rc);
+assert_checkequal(fftshift(m,"c"),rc);
+
+assert_checkequal(ifftshift(m),    r);
+assert_checkequal(ifftshift(m,1),  rr);
+assert_checkequal(ifftshift(m,"r"),rr);
+assert_checkequal(ifftshift(m,2),  rc);
+assert_checkequal(ifftshift(m,"c"),rc);
+
+// Hypermatrix
+h = matrix(1:8,2,2,2);
+//(:,:,1)
+//   1   3
+//   2   4
+//(:,:,2)
+//   5   7
+//   6   8
+assert_checkequal(fftshift(h)   ,  cat(3,[8 6;7 5], [4 2;3 1]));
+assert_checkequal(ifftshift(h)  ,  cat(3,[8 6;7 5], [4 2;3 1]));
+assert_checkequal(fftshift(h,1) ,  cat(3,[2 4;1 3], [6 8;5 7]));
+assert_checkequal(ifftshift(h,1),  cat(3,[2 4;1 3], [6 8;5 7]));
+assert_checkequal(fftshift(h,2) ,  cat(3,[3 1;4 2], [7 5;8 6]));
+assert_checkequal(ifftshift(h,2),  cat(3,[3 1;4 2], [7 5;8 6]));
+assert_checkequal(fftshift(h,3) ,  cat(3,[5 7;6 8], [1 3;2 4]));
+assert_checkequal(ifftshift(h,3),  cat(3,[5 7;6 8], [1 3;2 4]));
+
+
+// Odd input sizes
+// ===============
+// Vector
+v = [1 2 3 4 5];
+r = [4 5 1 2 3];
+assert_checkequal(fftshift(v),  r);
+assert_checkequal(fftshift(v,1), v);
+assert_checkequal(fftshift(v,"r"), v);
+assert_checkequal(fftshift(v,2), r);
+assert_checkequal(fftshift(v,"c"), r);
+
+assert_checkequal(ifftshift(fftshift(v)), v);
+assert_checkequal(ifftshift(fftshift(v,1),1), v);
+assert_checkequal(ifftshift(fftshift(v,2),2), v);
+assert_checkequal(ifftshift(fftshift(v,"r"),"r"), v);
+assert_checkequal(ifftshift(fftshift(v,"c"),"c"), v);
+
+// Matrix
+m = [
+  1  2  3    4  5
+  6  7  8    9 10
+
+ 11 12 13   14 15
+];
+r = [
+ 14 15   11 12 13
+
+  4  5    1  2  3
+  9 10    6  7  8
+];
+rr = [
+ 11 12 13   14 15
+
+  1  2  3    4  5
+  6  7  8    9 10
+];
+rc = [
+  4  5   1  2  3
+  9 10   6  7  8
+
+  14 15  11 12 13
+];
+assert_checkequal(fftshift(m),    r);
+assert_checkequal(fftshift(m,1),  rr);
+assert_checkequal(fftshift(m,"r"),rr);
+assert_checkequal(fftshift(m,2),  rc);
+assert_checkequal(fftshift(m,"c"),rc);
+
+m = [
+  1  2    3  4  5
+
+  6  7    8  9 10
+ 11 12   13 14 15
+];
+r = [
+  8  9 10    6  7
+ 13 14 15   11 12
+
+  3  4  5    1  2
+];
+rr = [
+  6  7    8  9 10
+ 11 12   13 14 15
+
+  1  2    3  4  5
+];
+rc = [
+  3  4  5   1  2
+
+  8  9 10   6  7
+ 13 14 15  11 12
+];
+assert_checkequal(ifftshift(m),    r);
+assert_checkequal(ifftshift(m,1),  rr);
+assert_checkequal(ifftshift(m,"r"),rr);
+assert_checkequal(ifftshift(m,2),  rc);
+assert_checkequal(ifftshift(m,"c"),rc);
+
+// Hypermatrix
+// -----------
+h = cat(3, ..
+[
+  1  4    7
+  2  5    8
+
+  3  6    9
+], [
+  10  13    16
+  11  14    17
+
+  12  15    18
+], ..
+[
+  19  22    25
+  20  23    26
+
+  21  24    27
+]);
+
+// along = "all"
+res = cat(3, ..
+[
+  27    21  24
+
+  25    19  22
+  26    20  23
+], [
+  9    3  6
+
+  7    1  4
+  8    2  5
+], [
+  18    12  15
+
+  16    10  13
+  17    11  14
+]);
+assert_checkequal(fftshift(h), res);
+assert_checkequal(fftshift(ifftshift(h)), h);
+assert_checkequal(ifftshift(fftshift(h)), h);
+
+// along = 1 | "r"
+res = cat(3, ..
+[
+  3  6  9
+  1  4  7
+  2  5  8
+], [
+  12  15  18
+  10  13  16
+  11  14  17
+], [
+  21  24  27
+  19  22  25
+  20  23  26
+]);
+assert_checkequal(fftshift(h,1), res);
+assert_checkequal(ifftshift(fftshift(h,1),1), h);
+assert_checkequal(fftshift(ifftshift(h,1),1), h);
+
+// along = 2 | "c"
+res = cat(3, ..
+[
+  7  1  4
+  8  2  5
+  9  3  6
+], [
+  16  10  13
+  17  11  14
+  18  12  15
+], [
+  25  19  22
+  26  20  23
+  27  21  24
+]);
+assert_checkequal(fftshift(h,2), res);
+assert_checkequal(ifftshift(fftshift(h,2),2), h);
+assert_checkequal(fftshift(ifftshift(h,2),2), h);
+
+// along = 3
+res = cat(3, ..
+[
+  19  22  25
+  20  23  26
+  21  24  27
+], [
+  1  4  7
+  2  5  8
+  3  6  9
+], [
+  10  13  16
+  11  14  17
+  12  15  18
+]);
+assert_checkequal(fftshift(h,3), res);
+assert_checkequal(ifftshift(fftshift(h,3),3), h);
+assert_checkequal(fftshift(ifftshift(h,3),3), h);
diff --git a/scilab/modules/signal_processing/tests/unit_tests/ifftshift.dia.ref b/scilab/modules/signal_processing/tests/unit_tests/ifftshift.dia.ref
deleted file mode 100644 (file)
index 63e4dbc..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-//<-- CLI SHELL MODE -->
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- CLLI SHELL MODE -->
-vec = 1:60;
-res = ifftshift(vec);
-assert_checkequal(res(1:30), 31:60);
-assert_checkequal(res(31:60), 1:30);
-mat = matrix(vec, [10 6]);
-refRES = (1:5)';
-refRES = [refRES refRES+10 refRES+20];
-res = ifftshift(mat);
-assert_checkequal(res(1:5, 1:3), refRES+35);
-assert_checkequal(res(1:5, 4:6), refRES+5);
-assert_checkequal(res(6:10, 1:3), refRES+30);
-assert_checkequal(res(6:10, 4:6), refRES);
-// Check that ifftshift(fftshift(x)) = x
-// Make a signal
-t = 0:0.1:1000;
-x = 3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
-// Compute the fft
-y = fft(x, -1);
-// Invert the result
-invShift = ifftshift(fftshift(y));
-// Check that we recreated the original result
-assert_checkequal(invShift, y);
diff --git a/scilab/modules/signal_processing/tests/unit_tests/ifftshift.tst b/scilab/modules/signal_processing/tests/unit_tests/ifftshift.tst
deleted file mode 100644 (file)
index b0ce4a7..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-//<-- CLI SHELL MODE -->
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- CLLI SHELL MODE -->
-
-vec = 1:60;
-
-res = ifftshift(vec);
-
-assert_checkequal(res(1:30), 31:60);
-assert_checkequal(res(31:60), 1:30);
-
-mat = matrix(vec, [10 6]);
-refRES = (1:5)';
-refRES = [refRES refRES+10 refRES+20];
-
-res = ifftshift(mat);
-
-assert_checkequal(res(1:5, 1:3), refRES+35);
-assert_checkequal(res(1:5, 4:6), refRES+5);
-assert_checkequal(res(6:10, 1:3), refRES+30);
-assert_checkequal(res(6:10, 4:6), refRES);
-
-
-// Check that ifftshift(fftshift(x)) = x
-
-// Make a signal
-t = 0:0.1:1000;
-x = 3*sin(t)+8*sin(3*t)+0.5*sin(5*t)+3*rand(t);
-// Compute the fft
-y = fft(x, -1);
-// Invert the result
-invShift = ifftshift(fftshift(y));
-// Check that we recreated the original result
-assert_checkequal(invShift, y);