Начальный переходный процесс, который вы видите на графиках, представляет собой шаговый отклик фильтра, когда внезапный вход применяется к фильтру в состоянии покоя. Если вы только что подключили физический прибор, включающий такой полосовой фильтр, датчик прибора мог бы получить выборки входных данных, прыгнув от 0 (пока зонд отключен) до значения первой выборки ~ 0,126 В. Отклик фильтра прибора показал бы аналогичный переходный процесс.
Однако вас, вероятно, больше интересует установившаяся реакция прибора после того, как на него больше не влияют эти внешние факторы (например, подключаемый датчик), и у вас было время привыкнуть к свойствам сигнала интерес.
Один из способов добиться этого - использовать достаточно длинную выборку данных и отбрасывать начальный переходный процесс. Другой подход заключается в том, чтобы заставить начальное внутреннее состояние фильтра приблизиться к тому, что можно было бы ожидать, если бы сигнал аналогичной амплитуды подавался в течение некоторого времени перед вашей первой входной выборкой. Это можно сделать, например, установив начальное условие с помощью scipy.signal.lfilter_zi
.
Теперь, я полагаю, вы использовали butter_bandpass_filter
из SciPy Cookbook , который не заботится о начальных условиях фильтра. К счастью, это может быть легко изменено с этой целью:
from scipy.signal import butter, lfilter, lfilter_zi
def butter_bandpass_filter_zi(data, lowcut, highcut, fs, order=5):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
zi = lfilter_zi(b, a)
y,zo = lfilter(b, a, data, zi=zi*data[0])
return y
Еще один момент, на который следует обратить внимание, это то, что вы звоните butter_bandpass_filter
как:
yf = butter_bandpass_filter(IR, lowcut, highcut, nSamples, order=orders)
Передача nSamples
(общее количество выборок, в вашем случае 2500) в качестве 4-го аргумента, тогда как функция ожидает частоту дискретизации (в вашем случае 250). Коэффициент 10 между двумя величинами имеет эффект, эквивалентный уменьшению диапазона фильтрации с [0.5,15]
Гц до [0.05,1.5]
Гц. Чтобы получить предполагаемый диапазон частот полосы пропускания, вы должны передать sRate
в качестве четвертого аргумента:
yf = butter_bandpass_filter_zi(IR, lowcut, highcut, sRate, order=orders)
Наконец, вы можете заметить, что этот последний вывод немного менее треугольный, чем вход. Это вызвано тем, что часть низкочастотного контента около 0,5 Гц отфильтровывается. Если это то, что вы ожидали, то отлично. В противном случае вы все равно можете поиграть с частотой среза, чтобы получить то, что, по вашему мнению, дает наилучшие результаты. Например (и я не хочу сказать, что это лучший частотный диапазон), если вы установите lowcut=0.25
, вы получите более треугольный график, такой как: