代码之家  ›  专栏  ›  技术社区  ›  paul

如何“平滑”数据并计算线梯度?

  •  9
  • paul  · 技术社区  · 18 年前

    我需要做的是平滑曲线以计算速度。接下来我需要计算加速度。

    最好怎么做?

    (采样率高达1000Hz,10Hz的计算率就可以了。在VS2005中使用C#)

    6 回复  |  直到 18 年前
        1
  •  27
  •   GvS    18 年前

    来自moogs的wikipedia条目是平滑数据的良好起点。但这无助于你做出决定。

    这完全取决于您的数据和所需的处理速度。

    移动平均线 将使顶部值变平。如果在最小值和最大值之间存在冲突,请不要使用此选项。另外,我认为使用移动平均线会影响你们对加速度的测量,因为它会使你们的数据变得平坦(有点),所以加速度看起来会更小。这一切都取决于所需的准确性。

    萨维茨基戈雷

    卡尔曼滤波器 如果您知道分布,这可以给您带来良好的结果(它用于GPS导航系统)。也许实施起来有点困难。我提到这一点是因为我在过去使用过它们。但对于这类产品的初学者来说,它们可能不是一个好的选择。

    上述措施将减少信号中的噪音。

    接下来你要做的是检测“加速度”的起点和终点。您可以通过创建 Derivative

        2
  •  9
  •   moogs    18 年前

    你需要一个平滑滤波器,最简单的是“移动平均”:只需计算最后n个点的平均值。

    这里的问题是,如何确定n,你能告诉我们更多关于你的应用吗?

    (还有其他更复杂的过滤器。它们在保存输入数据的方式上有所不同。下面是一个很好的列表。) Wikipedia )

    编辑!: 对于10Hz,取最后100个值的平均值。

        3
  •  3
  •   Paul    16 年前

    移动平均线通常很糟糕,但对于白噪声来说效果很好。移动平均线和;Savitzky-Golay两者都可以归结为一种相关性,因此速度非常快,可以实时实现。如果你需要像一阶和二阶导数这样的高阶信息,SG是一个不错的选择。SG的神奇之处在于滤波器所需的恒定相关系数——一旦确定了多项式的长度和次数以进行局部拟合,则只需找到一次系数。您可以使用R(sgolay)或Matlab计算它们。

    您还可以通过Savitzky-Golay最佳拟合多项式(有时称为Savitzky-Golay导数)来估计噪声信号的一阶导数,通常可以很好地估计一阶导数。

    卡尔曼滤波可能非常有效,但它的计算量更大——很难在速度上击败短卷积!


    CenterSpace软件

        4
  •  1
  •   James Fassett    18 年前

    除上述文章外,请看 Catmull-Rom Splines .

        5
  •  0
  •   Lee    18 年前

    你可以用一个 moving average

        6
  •  0
  •   SmacL    18 年前

    除了GVSS优秀答案之外,您还可以考虑使用一些一般的曲线拟合(如三次曲线或二次样条曲线)平滑/减小平均结果的阶跃效应。

    推荐文章