예제 #1
0
파일: fft.py 프로젝트: cygnine/spyctral
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))
예제 #2
0
파일: fft.py 프로젝트: cygnine/spyctral
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)
예제 #3
0
파일: fft.py 프로젝트: cygnine/spyctral
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)
예제 #4
0
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))
예제 #5
0
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))