如何平滑离散数据点以使其看起来连续?

时间:2019-06-30 03:09:05

标签: android smoothing android-graphview

我有两个带有double数据的ArrayList。我已经在使用移动平均平滑。每200-500ms收集一次数据。这就是典型的图形(在Android中使用GraphView)的样子:

Sample Graph

由于数据收集率受我使用的硬件限制,因此结果看起来参差不齐。很容易看到个别要点。

我如何使函数看起来平滑且连续(通过数学方式更改ArrayList或更改GraphView中的某些设置?

多项式是否适合该方法,还是应该结合使用滤波和移动平均值?

我很感激!

1 个答案:

答案 0 :(得分:0)

这取决于您要如何平滑功能。您的问题是,由于graphview在两个数据点之间绘制了一条直线,因此您没有足够的数据点来使其显得平滑。我认为不使用自定义视图就无法在GraphView中的两个点之间绘制曲线。自定义视图是另一种野兽,因此我不希望您这样做。现在有两种方法可以解决此问题。

第一种方式,如果您事先知道您的数据不包含高噪声,那么您可以对数组列表中的所有点执行多项式插值。由此,您将获得一个函数,可用于创建新的数组列表并以比数据更小的x步计算y值。这样,您可以模拟一条曲线。但是请注意,插值非常昂贵,尤其是当您使用多项式的高阶时。

现在,如果您知道自己的数据有噪声,则插值将插值(拟合)所有噪声,而这并不是您想要的。然后,您要使用最小二乘法。您可以求多项式的任何阶数。使用最有意义的一种。最小二乘法比插值法耗费的时间更少,并且具有以下优点:如果您的噪声是无偏差的(意味着噪声之和总计为0),则可以为您提供更好的真实值近似值。另请注意,如果数据中的x值均匀地彼此分开,则至少在平方中,您的计算变得更加容易。在您的情况下,这可能是正确的,因为您提到每200-500ms收集一次数据。如果可以固定速率轮询,请执行此操作。互联网上有各种方程式,它们提供给定固定间隔的简单最小二乘法计算。