我有两个带有double
数据的ArrayList。我已经在使用移动平均平滑。每200-500ms收集一次数据。这就是典型的图形(在Android中使用GraphView
)的样子:
由于数据收集率受我使用的硬件限制,因此结果看起来参差不齐。很容易看到个别要点。
我如何使函数看起来平滑且连续(通过数学方式更改ArrayList或更改GraphView
中的某些设置?
多项式是否适合该方法,还是应该结合使用滤波和移动平均值?
我很感激!
答案 0 :(得分:0)
这取决于您要如何平滑功能。您的问题是,由于graphview在两个数据点之间绘制了一条直线,因此您没有足够的数据点来使其显得平滑。我认为不使用自定义视图就无法在GraphView中的两个点之间绘制曲线。自定义视图是另一种野兽,因此我不希望您这样做。现在有两种方法可以解决此问题。
第一种方式,如果您事先知道您的数据不包含高噪声,那么您可以对数组列表中的所有点执行多项式插值。由此,您将获得一个函数,可用于创建新的数组列表并以比数据更小的x步计算y值。这样,您可以模拟一条曲线。但是请注意,插值非常昂贵,尤其是当您使用多项式的高阶时。
现在,如果您知道自己的数据有噪声,则插值将插值(拟合)所有噪声,而这并不是您想要的。然后,您要使用最小二乘法。您可以求多项式的任何阶数。使用最有意义的一种。最小二乘法比插值法耗费的时间更少,并且具有以下优点:如果您的噪声是无偏差的(意味着噪声之和总计为0),则可以为您提供更好的真实值近似值。另请注意,如果数据中的x值均匀地彼此分开,则至少在平方中,您的计算变得更加容易。在您的情况下,这可能是正确的,因为您提到每200-500ms收集一次数据。如果可以固定速率轮询,请执行此操作。互联网上有各种方程式,它们提供给定固定间隔的简单最小二乘法计算。