[python-arrayfire] 138/250: FEAT: Adding new functions: inplace, r2c and c2r ffts.

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Mon Mar 28 22:59:41 UTC 2016


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch debian/master
in repository python-arrayfire.

commit 6234d53b1a985832efc1dd1f0abcda55d05ec972
Author: Pavan Yalamanchili <pavan at arrayfire.com>
Date:   Wed Nov 11 09:36:24 2015 -0500

    FEAT: Adding new functions: inplace, r2c and c2r ffts.
---
 arrayfire/signal.py    | 377 ++++++++++++++++++++++++++++++++++++++++++++++++-
 tests/simple/signal.py |  33 +++++
 2 files changed, 404 insertions(+), 6 deletions(-)

diff --git a/arrayfire/signal.py b/arrayfire/signal.py
index 308fd0b..fa50385 100644
--- a/arrayfire/signal.py
+++ b/arrayfire/signal.py
@@ -301,9 +301,6 @@ def ifft2(signal, dim0 = None, dim1 = None , scale = None):
 
     dims = signal.dims()
 
-    if (len(dims) < 2):
-        return ifft(signal)
-
     if dim0 is None:
         dim0 = dims[0]
 
@@ -359,9 +356,6 @@ def ifft3(signal, dim0 = None, dim1 = None , dim2 = None, scale = None):
 
     dims = signal.dims()
 
-    if (len(dims) < 3):
-        return ifft2(signal)
-
     if dim0 is None:
         dim0 = dims[0]
 
@@ -379,6 +373,377 @@ def ifft3(signal, dim0 = None, dim1 = None , dim2 = None, scale = None):
                                      ct.c_longlong(dim0), ct.c_longlong(dim1), ct.c_longlong(dim2)))
     return output
 
+def fft_inplace(signal, scale = None):
+    """
+    In-place Fast Fourier Transform: 1D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 1 dimensional signal or a batch of 1 dimensional signals.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.
+
+    """
+
+    if scale is None:
+        scale = 1.0
+
+    safe_call(backend.get().af_fft_inplace(signal.arr, ct.c_double(scale)))
+
+def fft2_inplace(signal, scale = None):
+    """
+    In-place Fast Fourier Transform: 2D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 2 dimensional signal or a batch of 2 dimensional signals.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.
+
+    """
+
+    if scale is None:
+        scale = 1.0
+
+    safe_call(backend.get().af_fft2_inplace(signal.arr, ct.c_double(scale)))
+
+def fft3_inplace(signal, scale = None):
+    """
+    In-place Fast Fourier Transform: 3D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 3 dimensional signal or a batch of 3 dimensional signals.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.
+    """
+
+    if scale is None:
+        scale = 1.0
+
+    output = Array()
+    safe_call(backend.get().af_fft3_inplace(signal.arr, ct.c_double(scale)))
+
+def ifft_inplace(signal, scale = None):
+    """
+    Inverse In-place Fast Fourier Transform: 1D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 1 dimensional signal or a batch of 1 dimensional signals.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.0 / (signal.dims()[0])
+    """
+
+    if scale is None:
+        dim0 = signal.dims()[0]
+        scale = 1.0/float(dim0)
+
+    safe_call(backend.get().af_ifft_inplace(signal.arr, ct.c_double(scale)))
+
+def ifft2_inplace(signal, scale = None):
+    """
+    Inverse In-place Fast Fourier Transform: 2D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 2 dimensional signal or a batch of 2 dimensional signals.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.0 / (signal.dims()[0] * signal.dims()[1])
+    """
+
+    dims = signal.dims()
+
+    if scale is None:
+        dim0 = dims[0]
+        dim1 = dims[1]
+        scale = 1.0/float(dim0 * dim1)
+
+    safe_call(backend.get().af_ifft2_inplace(signal.arr, ct.c_double(scale)))
+
+def ifft3_inplace(signal, scale = None):
+    """
+    Inverse In-place Fast Fourier Transform: 3D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 3 dimensional signal or a batch of 3 dimensional signals.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.0 / (signal.dims()[0] * signal.dims()[1] * signal.dims()[2]).
+    """
+
+    dims = signal.dims()
+
+    if scale is None:
+        dim0 = dims[0]
+        dim1 = dims[1]
+        dim2 = dims[2]
+        scale = 1.0 / float(dim0 * dim1 * dim2)
+
+    safe_call(backend.get().af_ifft3_inplace(signal.arr, ct.c_double(scale)))
+
+def fft_r2c(signal, dim0 = None , scale = None):
+    """
+    Real to Complex Fast Fourier Transform: 1D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 1 dimensional signal or a batch of 1 dimensional signals.
+
+    dim0: optional: int. default: None.
+          - Specifies the size of the output.
+          - If None, dim0 is calculated to be the first dimension of `signal`.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.
+
+    Returns
+    -------
+
+    output: af.Array
+            A complex af.Array containing the non-redundant parts of the full FFT.
+
+    """
+
+    if dim0 is None:
+        dim0 = 0
+
+    if scale is None:
+        scale = 1.0
+
+    output = Array()
+    safe_call(backend.get().af_fft_r2c(ct.pointer(output.arr), signal.arr, ct.c_double(scale), ct.c_longlong(dim0)))
+    return output
+
+def fft2_r2c(signal, dim0 = None, dim1 = None , scale = None):
+    """
+    Real to Complex Fast Fourier Transform: 2D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 2 dimensional signal or a batch of 2 dimensional signals.
+
+    dim0: optional: int. default: None.
+          - Specifies the size of the output.
+          - If None, dim0 is calculated to be the first dimension of `signal`.
+
+    dim1: optional: int. default: None.
+          - Specifies the size of the output.
+          - If None, dim1 is calculated to be the second dimension of `signal`.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.
+
+    Returns
+    -------
+
+    output: af.Array
+            A complex af.Array containing the non-redundant parts of the full FFT.
+
+    """
+    if dim0 is None:
+        dim0 = 0
+
+    if dim1 is None:
+        dim1 = 0
+
+    if scale is None:
+        scale = 1.0
+
+    output = Array()
+    safe_call(backend.get().af_fft2_r2c(ct.pointer(output.arr), signal.arr, ct.c_double(scale),
+                                        ct.c_longlong(dim0), ct.c_longlong(dim1)))
+    return output
+
+def fft3_r2c(signal, dim0 = None, dim1 = None , dim2 = None, scale = None):
+    """
+    Real to Complex Fast Fourier Transform: 3D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 3 dimensional signal or a batch of 3 dimensional signals.
+
+    dim0: optional: int. default: None.
+          - Specifies the size of the output.
+          - If None, dim0 is calculated to be the first dimension of `signal`.
+
+    dim1: optional: int. default: None.
+          - Specifies the size of the output.
+          - If None, dim1 is calculated to be the second dimension of `signal`.
+
+    dim2: optional: int. default: None.
+          - Specifies the size of the output.
+          - If None, dim2 is calculated to be the third dimension of `signal`.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1.
+
+    Returns
+    -------
+
+    output: af.Array
+            A complex af.Array containing the non-redundant parts of the full FFT.
+
+    """
+    if dim0 is None:
+        dim0 = 0
+
+    if dim1 is None:
+        dim1 = 0
+
+    if dim2 is None:
+        dim2 = 0
+
+    if scale is None:
+        scale = 1.0
+
+    output = Array()
+    safe_call(backend.get().af_fft3_r2c(ct.pointer(output.arr), signal.arr, ct.c_double(scale),
+                                        ct.c_longlong(dim0), ct.c_longlong(dim1), ct.c_longlong(dim2)))
+    return output
+
+def _get_c2r_dim(dim, is_odd):
+    return 2 *(dim - 1) + int(is_odd)
+
+def fft_c2r(signal, is_odd = False, scale = None):
+    """
+    Real to Complex Fast Fourier Transform: 1D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 1 dimensional signal or a batch of 1 dimensional signals.
+
+    is_odd: optional: Boolean. default: False.
+          - Specifies if the first dimension of output should be even or odd.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1 / (signal.dims()[0]).
+
+    Returns
+    -------
+
+    output: af.Array
+            A real af.Array containing the full output of the fft.
+
+    """
+
+
+    if scale is None:
+        dim0 = _get_c2r_dim(signal.dims()[0], is_odd)
+        scale = 1.0/float(dim0)
+
+    output = Array()
+    safe_call(backend.get().af_fft_c2r(ct.pointer(output.arr), signal.arr, ct.c_double(scale), is_odd))
+    return output
+
+def fft2_c2r(signal, is_odd = False, scale = None):
+    """
+    Real to Complex Fast Fourier Transform: 2D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 2 dimensional signal or a batch of 2 dimensional signals.
+
+    is_odd: optional: Boolean. default: False.
+          - Specifies if the first dimension of output should be even or odd.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1 / (signal.dims()[0] * signal.dims()[1]).
+
+    Returns
+    -------
+
+    output: af.Array
+            A real af.Array containing the full output of the fft.
+
+    """
+    dims = signal.dims()
+
+    if scale is None:
+        dim0 = _get_c2r_dim(dims[0], is_odd)
+        dim1 = dims[1]
+        scale = 1.0/float(dim0 * dim1)
+
+    output = Array()
+    safe_call(backend.get().af_fft2_c2r(ct.pointer(output.arr), signal.arr, ct.c_double(scale), is_odd))
+    return output
+
+def fft3_c2r(signal, is_odd = False, scale = None):
+    """
+    Real to Complex Fast Fourier Transform: 3D
+
+    Parameters
+    ----------
+
+    signal: af.Array
+           A 3 dimensional signal or a batch of 3 dimensional signals.
+
+    is_odd: optional: Boolean. default: False.
+          - Specifies if the first dimension of output should be even or odd.
+
+    scale: optional: scalar. default: None.
+          - Specifies the scaling factor.
+          - If None, scale is set to 1 / (signal.dims()[0] * signal.dims()[1] * signal.dims()[2]).
+
+    Returns
+    -------
+
+    output: af.Array
+            A real af.Array containing the full output of the fft.
+
+    """
+    dims = signal.dims()
+
+    if scale is None:
+        dim0 = _get_c2r_dim(dims[0], is_odd)
+        dim1 = dims[1]
+        dim2 = dims[2]
+        scale = 1.0/float(dim0 * dim1 * dim2)
+
+    output = Array()
+    safe_call(backend.get().af_fft3_c2r(ct.pointer(output.arr), signal.arr, ct.c_double(scale), is_odd))
+    return output
+
+
 def dft(signal, odims=(None, None, None, None), scale = None):
 
     """
diff --git a/tests/simple/signal.py b/tests/simple/signal.py
index b1d9970..03d89b4 100644
--- a/tests/simple/signal.py
+++ b/tests/simple/signal.py
@@ -33,6 +33,17 @@ def simple_signal(verbose=False):
     display_func(af.real(af.ifft(af.fft(a))))
     display_func(af.real(af.idft(af.dft(a))))
 
+    b = af.fft(a)
+    af.ifft_inplace(b)
+    display_func(b)
+    af.fft_inplace(b)
+    display_func(b)
+
+    b = af.fft_r2c(a)
+    c = af.fft_c2r(b)
+    display_func(b)
+    display_func(c)
+
     a = af.randu(4, 4)
     display_func(a)
 
@@ -41,6 +52,17 @@ def simple_signal(verbose=False):
     display_func(af.real(af.ifft2(af.fft2(a))))
     display_func(af.real(af.idft(af.dft(a))))
 
+    b = af.fft2(a)
+    af.ifft2_inplace(b)
+    display_func(b)
+    af.fft2_inplace(b)
+    display_func(b)
+
+    b = af.fft2_r2c(a)
+    c = af.fft2_c2r(b)
+    display_func(b)
+    display_func(c)
+
     a = af.randu(4, 4, 2)
     display_func(a)
 
@@ -49,6 +71,17 @@ def simple_signal(verbose=False):
     display_func(af.real(af.ifft3(af.fft3(a))))
     display_func(af.real(af.idft(af.dft(a))))
 
+    b = af.fft3(a)
+    af.ifft3_inplace(b)
+    display_func(b)
+    af.fft3_inplace(b)
+    display_func(b)
+
+    b = af.fft3_r2c(a)
+    c = af.fft3_c2r(b)
+    display_func(b)
+    display_func(c)
+
     a = af.randu(10, 1)
     b = af.randu(3, 1)
     display_func(af.convolve1(a, b))

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/python-arrayfire.git



More information about the debian-science-commits mailing list