복붙노트

[PYTHON] 파이썬에서 fft bandpass 필터

PYTHON

파이썬에서 fft bandpass 필터

내가 시도하는 것은 fft로 데이터를 필터링하는 것입니다. 나는 1d- 배열로서 500Hz로 녹음 된 잡음있는 신호를 가지고있다. 고주파수는 20Hz로, 저주파는 10Hz로 차단되어야합니다. 내가 시도한 것은 :

fft=scipy.fft(signal) 
bp=fft[:]  
for i in range(len(bp)): 
    if not 10<i<20:
        bp[i]=0

ibp=scipy.ifft(bp)

내가 얻는 것은 복소수입니다. 그래서 무언가가 틀려야합니다. 뭐? 코드를 수정하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.bp 단위의 크기가 반드시 Hz 일 필요는 없지만 신호의 샘플링 빈도에 따라 다르기 때문에 scipy.fftpack.fftfreq를 사용하여 변환해야합니다. 또한 신호가 진짜라면 scipy.fftpack.rfft를 사용해야합니다. 다음은 지정된 양보다 적은 모든 주파수를 걸러내는 최소한의 작업 예제입니다.

    bp 단위의 크기가 반드시 Hz 일 필요는 없지만 신호의 샘플링 빈도에 따라 다르기 때문에 scipy.fftpack.fftfreq를 사용하여 변환해야합니다. 또한 신호가 진짜라면 scipy.fftpack.rfft를 사용해야합니다. 다음은 지정된 양보다 적은 모든 주파수를 걸러내는 최소한의 작업 예제입니다.

    import numpy as np
    from scipy.fftpack import rfft, irfft, fftfreq
    
    time   = np.linspace(0,10,2000)
    signal = np.cos(5*np.pi*time) + np.cos(7*np.pi*time)
    
    W = fftfreq(signal.size, d=time[1]-time[0])
    f_signal = rfft(signal)
    
    # If our original signal time was in seconds, this is now in Hz    
    cut_f_signal = f_signal.copy()
    cut_f_signal[(W<6)] = 0
    
    cut_signal = irfft(cut_f_signal)
    

    우리는 실수와 푸리에 공간에서 신호의 진화를 플로팅 할 수 있습니다 :

    import pylab as plt
    plt.subplot(221)
    plt.plot(time,signal)
    plt.subplot(222)
    plt.plot(W,f_signal)
    plt.xlim(0,10)
    plt.subplot(223)
    plt.plot(W,cut_f_signal)
    plt.xlim(0,10)
    plt.subplot(224)
    plt.plot(time,cut_signal)
    plt.show()
    

  2. ==============================

    2.여기서 뭘 하려는지 근본적인 결함이 있습니다. 주파수 영역에서 직사각형 창을 적용하면 sinc 함수로 컨벌루션 된 시간 영역 신호가 생성됩니다. 즉, 주파수 영역에서 도입 된 단계 변경으로 인해 시간 영역 신호에서 많은 양의 "링잉"이 발생합니다. 이러한 종류의 주파수 영역 필터링을 수행하는 적절한 방법은 주파수 영역에서 적절한 창 함수를 적용하는 것입니다. 좋은 입문 DSP 책은 이것을 다루어야합니다.

    여기서 뭘 하려는지 근본적인 결함이 있습니다. 주파수 영역에서 직사각형 창을 적용하면 sinc 함수로 컨벌루션 된 시간 영역 신호가 생성됩니다. 즉, 주파수 영역에서 도입 된 단계 변경으로 인해 시간 영역 신호에서 많은 양의 "링잉"이 발생합니다. 이러한 종류의 주파수 영역 필터링을 수행하는 적절한 방법은 주파수 영역에서 적절한 창 함수를 적용하는 것입니다. 좋은 입문 DSP 책은 이것을 다루어야합니다.

  3. from https://stackoverflow.com/questions/19122157/fft-bandpass-filter-in-python by cc-by-sa and MIT license