파이썬으로 시끄러운 심박수 신호를 필터링하려고합니다. 심박수는 분당 약 220 회 이상이어서는 안되므로 220bpm 이상의 모든 소음을 걸러 내고 싶습니다. 220 / 분을 3.66666666 헤르츠로 변환 한 다음 그 헤르츠를 rad / s로 변환하여 23.0383461 rad / sec를 얻었습니다.
데이터를받는 칩의 샘플링 주파수는 30Hz이므로 rad / s로 변환하여 188.495559 rad / s를 얻었습니다.
온라인에서 몇 가지 항목을 검색 한 후 저역 통과로 만들고 싶은 대역 통과 필터의 일부 기능을 발견했습니다. 다음은 bandpass 코드 링크 이므로 다음과 같이 변환했습니다.
from scipy.signal import butter, lfilter
from scipy.signal import freqs
def butter_lowpass(cutOff, fs, order=5):
nyq = 0.5 * fs
normalCutoff = cutOff / nyq
b, a = butter(order, normalCutoff, btype='low', analog = True)
return b, a
def butter_lowpass_filter(data, cutOff, fs, order=4):
b, a = butter_lowpass(cutOff, fs, order=order)
y = lfilter(b, a, data)
return y
cutOff = 23.1 #cutoff frequency in rad/s
fs = 188.495559 #sampling frequency in rad/s
order = 20 #order of filter
#print sticker_data.ps1_dxdt2
y = butter_lowpass_filter(data, cutOff, fs, order)
plt.plot(y)
버터 함수가 rad / s의 컷오프 및 샘플링 주파수를 받아들이지 만 이상한 출력을 얻는 것 같기 때문에 나는 이것에 대해 매우 혼란 스럽습니다. 실제로 Hz 단위입니까?
둘째,이 두 줄의 목적은 무엇입니까?
nyq = 0.5 * fs
normalCutoff = cutOff / nyq
나는 그것이 정규화에 관한 것이라는 것을 알고 있지만 nyquist는 샘플링 빈도의 절반이 아니라 2 배라고 생각했습니다. 그리고 왜 니퀴 스트를 노멀 라이저로 사용하고 있습니까?
누군가 이러한 기능으로 필터를 만드는 방법에 대해 자세히 설명 할 수 있습니까?
다음을 사용하여 필터를 플로팅했습니다.
w, h = signal.freqs(b, a)
plt.plot(w, 20 * np.log10(abs(h)))
plt.xscale('log')
plt.title('Butterworth filter frequency response')
plt.xlabel('Frequency [radians / second]')
plt.ylabel('Amplitude [dB]')
plt.margins(0, 0.1)
plt.grid(which='both', axis='both')
plt.axvline(100, color='green') # cutoff frequency
plt.show()
23 rad / s에서 명확하게 차단되지 않는 다음을 얻었습니다.