Я намагаюся фільтрувати шумний сигнал серцевого ритму за допомогою python. Оскільки частота серцевих скорочень ніколи не повинна бути вище приблизно 220 ударів на хвилину, я хочу відфільтрувати весь шум вище 220 ударів на хвилину. Я перетворив 220 / хвилину в 3.66666666 Герц, а потім перетворив цей Герц в рад / с, щоб отримати 23.0383461 рад / с.
Частота дискретизації мікросхеми, яка приймає дані, становить 30 Гц, тому я перетворив її на рад / с, щоб отримати 188,495559 рад / с.
Після пошуку деяких речей в Інтернеті я знайшов деякі функції смугового фільтра, які я хотів перетворити на низькі частоти. Ось посилання на смуговий код , тому я перетворив його таким:
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)
Мене це дуже бентежить, бо я майже впевнений, що функція масла приймає частоту відсікання та вибірки в рад / с, але, здається, я отримую дивний результат. Це насправді в Гц?
По-друге, яка мета цих двох рядків:
nyq = 0.5 * fs
normalCutoff = cutOff / nyq
Я знаю, що це стосується нормалізації, але я думав, що найквіст вдвічі перевищує частоту вибірки, а не вдвічі. І чому ви використовуєте найквіст як нормалізатор?
Хтось може пояснити більше про те, як створювати фільтри з цими функціями?
Я побудував фільтр за допомогою:
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 рад / с: