Мне нужно отфильтровать сигнал.Я хочу сохранить частоты от 0 до 51 Гц.Ниже приведен код, который я использую, часть которого взята из этих двух вопросов ( Python: Разработка фильтра временных рядов после анализа Фурье , Создание фильтра нижних частот в SciPy - методы понимания иединицы ):
def butter_lowpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
def butter_lowpass_filter(data, cutoff, fs, order=5):
b, a = butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
# y is the original signal
# getting the unbiased signal
y = list(np.array(y)-sts.mean(y))
# saving the original signal
y_before = y
# x is the time vector
# for the spectrum of the original signal
yps_before = np.abs(np.fft.fft(y_before))**2
yfreqs_before = np.fft.fftfreq(6000, d = 0.001)
y_idx_before = np.argsort(yfreqs_before)
#Filtering
order = 8
fs = 1000.0
cutoff = 50.0
y = butter_lowpass_filter(y, cutoff, fs, order)
# for the spectrum of the filtered signal
yps = np.abs(np.fft.fft(y))**2
yfreqs = np.fft.fftfreq(6000, d = 0.001)
y_idx = np.argsort(yfreqs)
fig = plt.figure(figsize=(14,10))
fig.suptitle(file_name, fontsize=20)
plt.plot(yfreqs_before[y_idx_before], yps_before[y_idx_before], 'k-', label='original spectrum',linewidth=0.5)
plt.plot(yfreqs[y_idx], yps[y_idx], 'r-', linewidth=2, label='filtered spectrum')
plt.xlabel('Frequency [Hz]')
plt.yscale('log')
plt.grid()
plt.legend()
plt.show()
Результатом этого кода является фильтрованный сигнал, однако это сравнение спектра:
Как выМожно видеть, что спектр выглядит хорошо после 100 Гц, однако, между 50 Гц и примерно 100 Гц все еще есть компонент.Таким образом, я попытался использовать фильтр более высокого порядка (20), но в качестве вывода я получил действительно странный спектр:
Итак, я знаючто фильтр не может и никогда не будет идеальным, но мне кажется, это слишком много.По моему опыту, я всегда мог получить довольно хороший фильтрованный сигнал на моей частоте среза.Любой совет?