【问题标题】:Savitzky-Golay filtering giving incorrect derivative in 1DSavitzky-Golay 滤波在一维中给出不正确的导数
【发布时间】:2019-10-22 12:41:43
【问题描述】:

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

y=2x


我为“y”添加了一些噪音并应用了 scipy 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()

结果:

导数结果: dy/dx = 2。
我需要 Savitzky-Golay 过滤器来为我提供这个结果。请帮助我实现一个考虑两个变量的 python 实现。

【问题讨论】:

  • 你可以fit a line into your results获取坡度。
  • 这只是一个演示。我需要 Savitzky-Golay 滤波器来处理噪声信号的算法。这些信号过于复杂,无法使用多项式拟合进行建模。
  • 那么请举一个更现实的例子。你只能得到你想要的。
  • @Ankit Bansal 提供的示例很好,因为您可以立即读取预期导数的值(即 2)并查看实现是否真的为您提供了该数字。他提供了一个有效的“最小示例”:为他的问题 +1。

标签: python scipy filtering signal-processing smoothing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2017-01-29
      • 2016-08-27
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多