Я пытаюсь написать простой фильтр нижних частот, используя scipy, но мне нужна помощь в определении параметров.
У меня есть 3,5 миллиона записей в данных временных рядов, которые необходимо отфильтровать, и данные отбираются с частотой 1000 Гц.
Я использую signal.firwin и signal. lfilter из библиотеки scipy.
Параметры, которые я выбираю в приведенном ниже коде, вообще не фильтруют мои данные. Вместо этого приведенный ниже код просто создает что-то, что графически выглядит как те же точные данные, за исключением искажения временной фазы, которое сдвигает график вправо чуть менее чем на 1000 точек данных (1 секунду).
В другой программе выполняется запуск Пихтовый фильтр нижних частот с помощью команд графического пользовательского интерфейса производит выходные данные, которые имеют аналогичные средства для каждого 10-секундного сегмента (10000 точек данных), но имеют значительно более низкие стандартные отклонения, так что мы по существу теряем шум в этом конкретном файле данных и заменяем его на что-то, что сохраняет среднее значение, показывая более долгосрочные тенденции, не искаженные высокочастотным шумом. Другое программное обеспечение ' В диалоговом окне параметров есть флажок, который позволяет вам выбрать количество коэффициентов, чтобы оно «оптимизировалось на основе размера выборки и частоты выборки». (У меня 3,5 миллиона выборок, собранных на частоте 1000 Гц, но мне нужна функция, которая использует эти входные данные в качестве переменных.)
* Кто-нибудь может показать мне, как настроить приведенный ниже код так, чтобы он удалял все частоты выше 0,05 hz? * Я бы хотел видеть на графике плавные волны, а не просто временные искажения того же самого графика, которые я получаю из приведенного ниже кода.
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