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
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)
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)
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)
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)