【问题标题】:How to 'smooth' data and calculate line gradient?如何“平滑”数据并计算线梯度?
【发布时间】:2010-09-17 06:42:26
【问题描述】:

我正在从测量距离的设备中读取数据。我的采样率很高,因此我可以测量距离的大变化(即速度),但这意味着,当速度较低时,设备会提供许多相同的测量值(由于设备的粒度)。这会导致“阶梯式”曲线。

我需要做的是平滑曲线以计算速度。然后我需要计算加速度。

如何最好地解决这个问题?

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

【问题讨论】:

    标签: algorithm curvesmoothing


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您能解释一下为什么要为 10Hz 使用 100 个值吗?谢谢。
    • @Guido - 根据我对他所说的话的解释,他每秒有 1000 个值,但实际上只需要每秒获取 10 次数据。因此,一种简单的方法是将 100 个值视为一个(取平均值)。
    • 我认为这里的措辞可以改进......从你上次的评论我认为你得到的想法是你得到 100 个值,平均它们,再得到 100 个值,平均它们,广告无限从 1000hz 输入中获取 10hz 平均样本。
    【解决方案2】:

    您可以使用moving average 来平滑数据。

    【讨论】:

      【解决方案3】:

      moogs 的维基百科条目是平滑数据的良好起点。但这并不能帮助您做出决定。

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

      移动平均线 将压平最高值。如果您对最小值和最大值感兴趣,请不要使用它。此外,我认为使用移动平均值会影响您对加速度的测量,因为它会使您的数据变平(有点),因此加速度会显得更小。这一切都归结为所需的准确性。

      萨维茨基-戈莱 快速算法。与移动平均线一样快。这将保留峰的高度。实施起来有些困难。你需要正确的系数。我会选这个。

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

      以上将减少您的信号噪音。

      接下来你要做的是检测“加速度”的起点和终点。您可以通过创建原始信号的Derivative 来做到这一点。导数与 Y 轴交叉的点(零)可能是信号中的峰值,并且可能指示加速度的开始和结束。

      然后您可以创建二阶导数来获得最小和最大加速度本身。

      【讨论】:

      • 如果您以正确的方式建模,卡尔曼滤波器将直接为您提供速度和加速度。
      • 可以在procoders.net/?p=11找到一个很好的 Savitzky-Golay 代码示例
      • 一旦有了系数,SG 就很容易实现。只需使用 R 的 sgolay 即可找到它们。
      • 此链接提供了一个 JavaApplet 以实际查看 Moving、Savitzky-Golay 和 Ensemble Average Work chem.uoa.gr/applets/appletsmooth/appl_smooth2.html
      • #Wouter 链接已过时
      【解决方案4】:

      除了以上文章,看看Catmull-Rom Splines

      【讨论】:

      • Catmull-Rom 是规则间隔数据的绝佳曲线,但往往会突出而不是平滑噪声。我更倾向于使用三次或二次样条,即使它们没有通过所有数据点。
      【解决方案5】:

      除了上述 GvS 的出色答案之外,您还可以考虑使用一些通用曲线拟合(例如三次或二次样条曲线)来平滑/减少平均结果的步进效应。

      【讨论】:

        【解决方案6】:

        移动平均线通常很糟糕 - 但适用于白噪声。移动平均线和 Savitzky-Golay 都归结为相关性 - 因此非常快并且可以实时实施。如果您需要更高阶的信息,例如一阶和二阶导数 - SG 是一个不错的选择。 SG 的魔力在于过滤器所需的恒定相关系数 - 一旦您确定多项式的长度和次数以适合本地,只需找到一次系数。您可以使用 R (sgolay) 或 Matlab 计算它们。

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

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

        保罗
        中心空间软件

        【讨论】:

          猜你喜欢
          • 2015-01-12
          • 2019-11-01
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 2017-06-06
          • 1970-01-01
          • 2015-10-17
          • 2021-10-14
          相关资源
          最近更新 更多