示例#1
0
def oversamplingFilter(n, M, p = 2):
    '''
    Produce the nxn oversampling filter that is needed to exactly filter dyadic DRT etc.
    This version returns values as multiplicative inverses (mod M) for use with the NTT
    '''
    gcd_table = np.zeros(n)
    gcdInv_table = np.zeros(n)

    gcd_table[0] = n + int(n)/p
    gcdInv_table[0] = nt.minverse(gcd_table[0], M)
    gcd_table[1] = 1
    gcdInv_table[1] = nt.minverse(gcd_table[1], M)
    for j in range(2,n):
        u, v, gcd_table[j] = nt.extended_gcd( int(j), int(n) )
        gcdInv_table[j] = nt.minverse(gcd_table[j], M)

    filter = nt.zeros((n,n))
    for j in range(0,n):
        for k in range(0,n):
            if gcd_table[j] < gcd_table[k]:
                filter[j,k] = nt.integer(gcdInv_table[j])
            else:
                filter[j,k] = nt.integer(gcdInv_table[k])

    return filter
示例#2
0
def oversampling_1D(n, p = 2, norm = False):
    '''
    The 1D oversampling. All values are GCDs.
    Use the filter versions to remove the oversampling.
    '''
    gcd_table = np.zeros(n)

    gcd_table[0] = n + int(n)/p
    gcd_table[1] = 1
    for j in range(2,n):
        u, v, gcd_table[j] = nt.extended_gcd( int(j), int(n) )

    return gcd_table
示例#3
0
def oversampling_1D_filter_Integer(n, M, p = 2, norm = False):
    '''
    The 1D filter for removing oversampling. All values are multiplicative inverses.
    To apply this filter multiply with 1D NTT slice
    '''
    gcd_table = np.zeros(n)
    gcdInv_table = nt.zeros(n)
    inv = nt.integer(1)
    if norm:
        inv = nt.integer(nt.minverse(int(n), M))

    gcd_table[0] = n + int(n)/p
    gcdInv_table[0] = nt.integer(nt.minverse(gcd_table[0], M))
    gcd_table[1] = 1
    gcdInv_table[1] = nt.integer(nt.minverse(gcd_table[1], M))
    for j in range(2,n):
        u, v, gcd_table[j] = nt.extended_gcd( int(j), int(n) )
        gcdInv_table[j] = (nt.integer(nt.minverse(gcd_table[j], M))*inv)%M

    return gcdInv_table
示例#4
0
def oversampling(n, p = 2):
    '''
    Produce the nxn oversampling filter that is needed to exactly filter dyadic DRT etc.
    '''
    gcd_table = np.zeros(n)

    gcd_table[0] = n + n/p
    gcd_table[1] = 1
    for j in range(2,n):
        u, v, gcd_table[j] = nt.extended_gcd( int(j), int(n) )

    filter = np.zeros((n,n))
    for j in range(0,n):
        for k in range(0,n):
            if gcd_table[j] < gcd_table[k]:
                filter[j,k] = gcd_table[j]
            else:
                filter[j,k] = gcd_table[k]

    return filter
示例#5
0
def oversampling_1D_filter(n, p = 2, norm = False):
    '''
    The 1D filter for removing oversampling. All values are multiplicative inverses.
    To apply this filter multiply with 1D FFT slice
    '''
    normValue = 1
    if norm:
        normValue = n
        
    gcd_table = np.zeros(n)
    gcdInv_table = np.zeros(n)

    gcd_table[0] = n + int(n)/p
    gcdInv_table[0] = 1.0/gcd_table[0]
    gcd_table[1] = 1
    gcdInv_table[1] = 1.0/gcd_table[1]
    for j in range(2,n):
        u, v, gcd_table[j] = nt.extended_gcd( int(j), int(n) )
        gcdInv_table[j] = 1.0/(gcd_table[j]*normValue)

    return gcdInv_table