def ifft(f,gamma=0.,delta=0.,scale=1.): from numpy import sqrt, roll, arange, exp, sign from numpy.fft import ifft as ift from scipy import pi from spyctral.common.indexing import integer_range from connection import int_connection_backward try: from pymbolic.algorithm import ifft except: from numpy.fft import ifft N = f.size ks = integer_range(N) fx = int_connection_backward(f,0,0,gamma,delta) flags = ks!=0 flags2 = ((ks%2)==1) fx[flags2] *= -1 fx[flags] /= exp(-1j*ks[flags]*pi/N) fx = roll(fx,-(N-1)/2) if fx.dtype==object: import pymbolic.algorithm as pyalg return 1/sqrt(2*pi)*pyalg.sym_fft(fx,sign=-1) else: return N/float(sqrt(2*pi)*ift(fx))
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 ifft_online(f,overhead): from numpy.fft import ifft as ift from numpy import roll from connection import int_connection_backward_online try: from pymbolic.algorithm import fft except: from numpy.fft import fft fx = int_connection_backward_online(f,overhead[1]) fx /= overhead[0] N = fx.size fx = roll(fx,-(N/2)) if fx.dtype==object: import pymbolic.algorithm as pyalg return pyalg.sym_fft(fx,sign=-1)/float(N) else: return ift(fx)
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))
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))