def fft(fx,gamma=0,delta=0,scale=1): from numpy import sqrt, roll, arange, exp, sign from numpy.fft import fft as ft from scipy import pi from spyctral.common.indexing import integer_range try: from pymbolic.algorithm import fft except: from numpy.fft import fft from connection import int_connection N = fx.size if fx.dtype==object: import pymbolic.algorithm as pyalg modes = pyalg.sym_fft(fx)*float(sqrt(2*pi)/N) else: modes = fft(fx)*sqrt(2*pi)/N ks = integer_range(N) modes = roll(modes,N/2) flags = ks!=0 flags2 = ((ks%2)==1) modes[flags] *= exp(-1j*ks[flags]*pi/N) modes[flags2] *= -1 return int_connection(modes,0,0,gamma,delta)
def test_fft_with_floats(): numpy = pytest.importorskip("numpy") import numpy.linalg as la from pymbolic.algorithm import fft, ifft for n in [2**i for i in range(4, 10)] + [17, 12, 948]: a = numpy.random.rand(n) + 1j * numpy.random.rand(n) f_a = fft(a) a2 = ifft(f_a) assert la.norm(a - a2) < 1e-10 f_a_numpy = numpy.fft.fft(a) assert la.norm(f_a - f_a_numpy) < 1e-10
def test_fft_with_floats(): numpy = pytest.importorskip("numpy") import numpy.linalg as la from pymbolic.algorithm import fft, ifft for n in [2**i for i in range(4, 10)]+[17, 12, 948]: a = numpy.random.rand(n) + 1j*numpy.random.rand(n) f_a = fft(a) a2 = ifft(f_a) assert la.norm(a-a2) < 1e-10 f_a_numpy = numpy.fft.fft(a) assert la.norm(f_a-f_a_numpy) < 1e-10
def test_fft(): import py.test numpy = py.test.importorskip("numpy") from pymbolic import var from pymbolic.algorithm import fft, sym_fft vars = numpy.array([var(chr(97 + i)) for i in range(16)], dtype=object) print vars print fft(vars) traced_fft = sym_fft(vars) from pymbolic.mapper.stringifier import PREC_NONE from pymbolic.mapper.c_code import CCodeMapper ccm = CCodeMapper() code = [ccm(tfi, PREC_NONE) for tfi in traced_fft] for cse_name, cse_str in enumerate(ccm.cse_name_list): print "%s = %s" % (cse_name, cse_str) for i, line in enumerate(code): print "result[%d] = %s" % (i, line)
def fft_online(fx,overhead): from numpy.fft import fft as ft from numpy import roll from connection import int_connection_online as int_connection try: from pymbolic.algorithm import fft except: from numpy.fft import fft if fx.dtype==object: modes = fft(fx) else: modes = ft(fx) N = fx.size modes = roll(modes,N/2) modes *= overhead[0] return int_connection(modes,overhead[1])
def test_fft(): numpy = pytest.importorskip("numpy") from pymbolic import var from pymbolic.algorithm import fft, sym_fft vars = numpy.array([var(chr(97+i)) for i in range(16)], dtype=object) print(vars) print(fft(vars)) traced_fft = sym_fft(vars) from pymbolic.mapper.stringifier import PREC_NONE from pymbolic.mapper.c_code import CCodeMapper ccm = CCodeMapper() code = [ccm(tfi, PREC_NONE) for tfi in traced_fft] for cse_name, cse_str in enumerate(ccm.cse_name_list): print("%s = %s" % (cse_name, cse_str)) for i, line in enumerate(code): print("result[%d] = %s" % (i, line))