Module rpps.filters.impl.window

Window functions

Generalized properties - (NB) Noise bandwidth, / Spectral leakage - (SL) Scalloping loss / Amplitude accuracy - (FR) Frequency resolution Ratings, (Best, Good, Fair, Poor) [5,3,1,0]

Window NB SL FR
Blackman 5 3 1
Flattop 3 5 0
Gaussian 1 3 1
Rectangle 0 0 5
Hanning 3 1 3
Hamming 1 1 3
Kaiser 3 3 1

Functions

def acon_gaussian(N, sigma=0.1)
Expand source code
def acon_gaussian(N, sigma=0.1): # Approximate Confined Gaussian
    n = np.arange(0, N)
    L = N+1

    num = _gaus(-0.5,N,L,sigma)*(_gausN(n+L,L,sigma) + _gausN(n-L,L,sigma))
    den = _gaus(-0.5+L,N,L,sigma)+_gaus(-0.5-L,N,L,sigma)
    w = _gausN(n, L, sigma) - (num/den)
    return w
def bartlett(N, Lp=0)
Expand source code
def bartlett(N, Lp=0): # 2nd-order B-spline / triangular window
    # 0 <= Lp <= 2
    # L = N + Lp
    # n = np.arange(0, N)
    # w = 1 - abs( (n-N/2)/(L/2) )
    # return w
    return np.bartlett(N)
def blackman(N)
Expand source code
def blackman(N): # "not very serious proposal", alpha=0.16
    # a0 = 0.42 # (1-alpha)/2
    # a1 = 0.5  # (1/2)
    # a2 = 0.08 # alpha/2
    # return _cs_3f(N,np.arange(0, N),a0,a1,a2)
    return np.blackman(N)
def blackman_exact(N)
Expand source code
def blackman_exact(N):
    a0 = 0.426_59  # 7938/18608
    a1 = 0.496_56  # 9240/18608
    a2 = 0.076_849 # 1430/18606
    return _cs_3f(N,np.arange(0, N),a0,a1,a2)
def blackman_harris(N)
Expand source code
def blackman_harris(N): # Minimize sidelobes
    a0 = 0.358_75
    a1 = 0.488_29
    a2 = 0.141_28
    a3 = 0.011_68
    return _cs_4f(N,np.arange(0, N),a0,a1,a2,a3)
def blackman_nuttall(N)
Expand source code
def blackman_nuttall(N):
    a0 = 0.363_581_9
    a1 = 0.489_177_5
    a2 = 0.136_599_5
    a3 = 0.010_641_1
    return _cs_4f(N,np.arange(0, N),a0,a1,a2,a3)
def exponential(N, D=8.69)
Expand source code
def exponential(N, D=8.69):
    n = np.arange(0, N)
    t = (N/2) * (8.69/D)
    w = np.e**(-np.abs(n-N/2)*1/t)
    return w
def flattop(N)
Expand source code
def flattop(N): # Minimal scalloping loss
    a0 = 0.215_578_95
    a1 = 0.416_631_58
    a2 = 0.277_263_158
    a3 = 0.083_578_947
    a4 = 0.006_947_368
    return _cs_5f(N,np.arange(0, N),a0,a1,a2,a3,a4)
def gaussian(N, sigma=0.4)
Expand source code
def gaussian(N, sigma=0.4):
    n = np.arange(0, N)
    w = np.exp( -(1/2)*( (n-N/2)/(sigma*N/2) )**2)
    return w
def gen_gaussian(N, sigma=0.2, p=2)
Expand source code
def gen_gaussian(N, sigma=0.2, p=2): # Generalized Gaussian
    n = np.arange(0, N)
    w = np.exp(-( (n-N/2)/(sigma*N/2) )**p)
    return w
def get(name)
Expand source code
def get(name):
    return globals()[name]
def hamming(N)
Expand source code
def hamming(N): # Optimal hamming
    return _rc(N, 0.53836) # a1 = 0.46164
def hamming_orig(N)
Expand source code
def hamming_orig(N): # Proposed hamming
    # return _rc(N, 0.54) # a1 = 0.46
    return np.hamming(N)
def hann(N)
Expand source code
def hann(N): # eq to power-of-sine 2
    # return _rc(N, 0.5)
    return np.hanning(N)
def kaiser(N, a=2)
Expand source code
def kaiser(N, a=2):
    return np.kaiser(N, a)
def nuttall(N)
Expand source code
def nuttall(N):
    a0 = 0.355_768
    a1 = 0.487_396
    a2 = 0.144_232
    a3 = 0.012_604
    return _cs_4f(N,np.arange(0, N),a0,a1,a2,a3)
def parzen(N)
Expand source code
def parzen(N): # 4th-order B-spline
    L = N+1
    n0 = np.arange(0, N) - N/2
    n1i = (0 <= np.abs(n0)) & (np.abs(n0) <= L/4)
    n2i = (L/4 < np.abs(n0)) & (np.abs(n0) <= L/2)

    n1 = n0[n1i]
    n2 = n0[n2i]
    w = np.zeros(N)
    w[n1i] = 1-6*( n1/(L/2) )**2 * (1-np.abs(n1)/(L/2) )
    w[n2i] = 2 * ( 1-np.abs(n2)/(L/2) )**3
    return w
def planck_taper(N, e=0.25)
Expand source code
def planck_taper(N, e=0.25):
    w = np.zeros(N//2)
    n = np.arange(0, N/2)

    n1i = (1 <= n) & (n < e*N)
    n2i = (e*N <= n) & (n <= N/2)

    w1 = (1 + np.exp( (e*N)/n[n1i] - (e*N)/(e*N-n[n1i]) ))**-1
    w2 = np.repeat(1, np.count_nonzero(n2i))

    w[n1i] = w1
    w[n2i] = w2
    w = np.concat((w, w[::-1]))
    return w
def rect(n: int)
Expand source code
def rect(n: int): # 1st-order B-spline / 0th power-of-sine
    return np.ones(n)
def sine0(N)
Expand source code
def sine0(N):
    return rect(N)
def sine2(N)
Expand source code
def sine2(N): # eq. to Hann
    return _cs_2f(N, np.arange(0, N), 0.5, 0.5)
def sine4(N)
Expand source code
def sine4(N):
    return _cs_3f(N, np.arange(0, N), 0.375, 0.5, 0.125)
def sine6(N)
Expand source code
def sine6(N):
    return _cs_4f(N, np.arange(0, N), 0.3125, 0.46875, 0.1875, 0.03125)
def sine8(N)
Expand source code
def sine8(N):
    return _cs_5f(N, np.arange(0, N), 0.2734375, 0.4375, 0.21875, 0.0625, 7.8125e-3)
def tukey(N, a=0.5)
Expand source code
def tukey(N, a=0.5):
    w = np.zeros(N//2)
    n = np.arange(0, N/2)

    n1i = (0 <= n) & (n < (a*N)/2)
    n2i = ((a*N)/2 <= n) & (n <= N/2)

    w1 = 0.5*(1-np.cos( (2*np.pi*n[n1i])/(a*N) ))
    w2 = np.repeat(1, np.count_nonzero(n2i))

    w[n1i] = w1
    w[n2i] = w2
    w = np.concat((w, w[::-1]))
    return w
def welch(N)
Expand source code
def welch(N):
    n = np.arange(0, N)
    return 1 - ( (n-(N/2)) / (N/2) )**2
def welch_2f(N)
Expand source code
def welch_2f(N):
    n = np.arange(0, N)
    w1 = 1 + ( n - (N/2) )/(N/2)
    w2 = 1 - ( n - (N/2) )/(N/2)
    return w1*w2