コード例 #1
0
def _create_split_complex_pointer(array_real, array_imag, double = False):
    """Creates a split-complex data pointer from two real numpy arrays"""
    _array_real = ffi.from_buffer(array_real)
    _array_imag = ffi.from_buffer(array_imag)
         
    if double:
        split_complex_pointer = ffi.new("DSPDoubleSplitComplex*") 
        split_complex_pointer.realp = ffi.cast("double*",_array_real)
        split_complex_pointer.imagp = ffi.cast("double*",_array_imag)
    else:
        split_complex_pointer = ffi.new("DSPSplitComplex*") 
        split_complex_pointer.realp = ffi.cast("float*",_array_real)
        split_complex_pointer.imagp = ffi.cast("float*",_array_imag)
    return split_complex_pointer
コード例 #2
0
def _fft(setup, a, out, n = 1, dim = 1, direction = +1, real_transform = False):
    """1D or 2D fft transform, real or complex"""

    #initialize
    _a = ffi.from_buffer(a)
    _pa = ffi.cast(setup.cast_name,_a) 
    _ps = setup.split_complex_pointer 
    _out = ffi.from_buffer(out) 
    _pout = ffi.cast(setup.cast_name,_out) 
    
    #define functions
    _ctoz, _ztoc = (lib.vDSP_ctozD, lib.vDSP_ztocD) if setup.double else (lib.vDSP_ctoz, lib.vDSP_ztoc)
    _func = _get_vDSP_fft_inplace(double = setup.double, dim = dim, real_transform = real_transform)
   
    #perform calculations
    _ctoz(_pa,2,_ps,1, setup.count)
  
    if dim == 1:
        _func(setup.pointer, _ps, 1, setup.count//n, setup.size[0], n , direction)
    else:
        _func(setup.pointer, _ps, 1, 0, setup.size[0], setup.size[1], direction)
    _ztoc(_ps,1,_pout,2, setup.count)
コード例 #3
0
def _sffto(setup, ar, ai, out, n = 1, dim = 1, direction = +1, real_transform = False):
    """1D or 2D fft transform, real or complex for split-complex input data - out of place"""

    _ps = _create_split_complex_pointer(ar, ai, double = setup.double)
    _out = ffi.from_buffer(out) 
    _pout = ffi.cast(setup.cast_name,_out)   
    _pouts  = setup.split_complex_pointer 
    _func = _get_vDSP_fft_outplace(double = setup.double, dim = dim, real_transform = real_transform)
    if dim == 1:
        _func(setup.pointer, _ps, 1, setup.count//n,_pouts, 1, setup.count//n, setup.size[0], n, direction)
    else:
        _func(setup.pointer, _ps, 1,0, _pouts, 1,0,setup.size[0], setup.size[1],direction)

    _ztoc = lib.vDSP_ztocD if setup.double else lib.vDSP_ztoc
    _ztoc(_pouts,1,_pout,2, setup.count)     
コード例 #4
0
def _sffti(setup, ar, ai, out, n = 1, dim = 1, direction = +1, real_transform = False):
    """1D or 2D fft transform, real or complex for split-complex input data - inplace"""

    #initialize
    _ps = _create_split_complex_pointer(ar, ai, double = setup.double)
    _out = ffi.from_buffer(out) 
    _pout = ffi.cast(setup.cast_name,_out) 
    
    #define functions
    _ztoc = lib.vDSP_ztocD if setup.double else lib.vDSP_ztoc
    _func = _get_vDSP_fft_inplace(double = setup.double, dim = dim, real_transform = real_transform)
   
    #perform calculations  
    if dim == 1:
        _func(setup.pointer, _ps, 1, setup.count//n, setup.size[0], n , direction)
    else:
        _func(setup.pointer, _ps, 1, 0, setup.size[0], setup.size[1], direction)
    _ztoc(_ps,1,_pout,2, setup.count)        
コード例 #5
0
def _ffts(setup, a, outr, outi, n = 1, dim = 1, direction = +1, real_transform = False):
    """Same as _fft, but it leaves the data in split-complex format"""
 
    #initialize
    _a = ffi.from_buffer(a) 
    _pa = ffi.cast(setup.cast_name,_a)
    _ps = _create_split_complex_pointer(outr, outi, double = setup.double)
    
    #define functions
    _ctoz= lib.vDSP_ctozD if setup.double else lib.vDSP_ctoz
    _func = _get_vDSP_fft_inplace(double = setup.double, dim = dim, real_transform = real_transform)

    #perform calculations
    _ctoz(_pa,2,_ps,1, setup.count)
    if dim == 1:
        _func(setup.pointer, _ps, 1, setup.count//n, setup.size[0], n, direction)
    else:
        _func(setup.pointer, _ps, 1,0, setup.size[0], setup.size[1],direction)