Я пытаюсь написать простой фильтр нижних частот, используя scipy, но мне нужна помощь в определении параметров.
У меня есть 3,5 миллиона записей в данных временных рядов, которые необходимо отфильтровать, и данные отбираются с частотой 1000 Гц.
Я использую signal.firwin и signal.lfilter из библиотеки scipy.
Параметры, которые я выбираю в приведенном ниже коде, вообще не фильтруют мои данные. Вместо этого приведенный ниже код просто создает нечто, графически похожее на те же точные данные, за исключением искажения временной фазы, которое сдвигает график вправо на чуть менее 1000 точек данных (1 секунда).
В другой программе запуск фильтра нижних частот с помощью команд графического интерфейса пользователя приводит к выводу, который имеет аналогичные средние значения для каждого 10-секундного сегмента (10000 точек данных), но который имеет значительно более низкие стандартные отклонения, так что мы практически теряем шум в этом конкретном файле данных и замените его чем-то, что сохраняет среднее значение, показывая более долгосрочные тренды, которые не загрязнены высокочастотным шумом. Диалоговое окно параметров другого программного обеспечения содержит флажок, который позволяет вам выбрать количество коэффициентов, чтобы оно «оптимизировалось на основе размера выборки и частоты выборки». (У меня 3,5 миллиона выборок, собранных с частотой 1000 Гц, но мне бы хотелось, чтобы функция использовала эти входные данные в качестве переменных.)
* Может кто-нибудь показать мне, как настроить приведенный ниже код, чтобы он убрал все частоты выше 0,05 Гц? * Я хотел бы видеть плавные волны на графике, а не просто искажение во времени того же идентичного графика, который я сейчас получаю из кода ниже.
class FilterTheZ0():
def __init__(self,ZSmoothedPylab):
#------------------------------------------------------
# Set the order and cutoff of the filter
#------------------------------------------------------
self.n = 1000
self.ZSmoothedPylab=ZSmoothedPylab
self.l = len(ZSmoothedPylab)
self.x = arange(0,self.l)
self.cutoffFreq = 0.05
#------------------------------------------------------
# Run the filter
#------------------------------------------------------
self.RunLowPassFIR_Filter(self.ZSmoothedPylab, self.n, self.l
, self.x, self.cutoffFreq)
def RunLowPassFIR_Filter(self,data, order, l, x, cutoffFreq):
#------------------------------------------------------
# Set a to be the denominator coefficient vector
#------------------------------------------------------
a = 1
#----------------------------------------------------
# Create the low pass FIR filter
#----------------------------------------------------
b = signal.firwin(self.n, cutoff = self.cutoffFreq, window = "hamming")
#---------------------------------------------------
# Run the same data set through each of the various
# filters that were created above.
#---------------------------------------------------
response = signal.lfilter(b,a,data)
responsePylab=p.array(response)
#--------------------------------------------------
# Plot the input and the various outputs that are
# produced by running each of the various filters
# on the same inputs.
#--------------------------------------------------
plot(x[10000:20000],data[10000:20000])
plot(x[10000:20000],responsePylab[10000:20000])
show()
return