Savitzky-Golay滤波在1D中给出不正确的导数

时间:2019-06-07 01:44:44

标签: python scipy filtering signal-processing smoothing

我有一个x和y数据集,其中x是自变量,y是因变量。

  

y = 2x


我为“ y”添加了一些噪音,并应用了时髦的Savitzky Golay滤波器。当我尝试获得y的一阶导数时,我得到的导数为零。 我了解这是因为过滤器仅将“ y”作为输入。我希望有一个同时考虑x和y的过滤器,并同时为我提供一个导数。

在这里,我用表示错误数据的图来展示我的实现。

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# create some sample twoD data
x = np.linspace(-3,3,100)
y = 2*x
y = y + np.random.normal(0, 0.2, y.shape)

# filter it
Zn = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=0)
Zf = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=1)
# do some plotting
plt.plot(x,y, label = 'Input')
plt.plot(x,Zn, label= 'Savitzky-Golay filtered')
plt.plot(x,Zf, label= 'Savitzky-Golay filtered - 1st derivative')
plt.legend()
plt.show()

结果:enter image description here

导数结果: dy / dx = 2。
我需要Savitzky-Golay滤波器才能为我提供此结果。请为我提供一个考虑了两个变量的python实现。

2 个答案:

答案 0 :(得分:2)

您的情况不是 dy / dx = 2 ,而是 dy / 1.0 = 0.06 ,因为您拥有x = np.linspace(-3,3,100)

您尚未将 dx 定义为delta,并使用了默认值delta=1.0

因此,使用等于 dx delta可以解决您的问题。

dx = x[0] - x[1]
Zf = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=1, delta=dx)

答案 1 :(得分:1)

要在savgol_filter中使用deriv> 0,还必须给出x坐标的间距。解决方法很简单:在通话的delta=x[1] - x[0]之后添加deriv=1

Zf = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=1, delta=x[1] - x[0])