как реализовать полосовой фильтр с использованием БПФ в python? - PullRequest
0 голосов
/ 08 мая 2020

у меня есть сигнал the first 500 indexes

Я попытался отфильтровать его в полосе [1,5] Гц

с помощью этого кода

def BPF(x,alpha=1,beta=5):

    """
    Args:
        :alpha - cuttoff frequency of start of pass band
        :beta  - cuttoff frequency of end of pass band
        :x     - 1D vector
        :return: the filtered vector x 
    """

    y = fft(x) #fourier transform
    middle = len(x)//2 #find the middle becuase fourier transform is symetric 
    freqs = y[:middle] #get the middle
    windowL = np.zeros(middle,dtype=float)#low_freq
    windowB = np.zeros(middle,dtype=float)#band_freq
    for i in range(middle):
      #check with wondow fits
        if abs(freqs[i])<alpha:
            windowL[i] = 1
        elif abs(freqs[i])>beta:
            pass
        else:
            windowB[i]=1
    #get the proper frequencies for each group and zero if not in the group
    #create the second half by the fact of the symetry we know
    y_low = ifft(np.concatenate((freqs*windowL,np.flip(freqs*windowL))),axis=0).real
    y_band = ifft(np.concatenate((freqs*windowB,np.flip(freqs*windowB))),axis=0).real
    plt.figure()
    plt.subplot(211)
    plt.title('low frequencies')
    plt.plot(y_low)
    plt.subplot(212)
    plt.title('PPG')
    plt.plot(y_band)
    plt.subplots_adjust(hspace=1)
    plt.grid()
    plt.show()
    return y_band

, но выходной сигнал находится между -0,1 и 0,1, но мой исходный сигнал был между 1 и 3, почему это происходит?

как решить?

...