目前,我正在从硬件指南针获取大量值的过程中编写代码。这个指南针非常准确,并且经常更新,结果是,如果它略微抖动,我最终会得到一个奇异的值,它与它的邻居完全不一致。我想消除这些价值观。
读完一些书后,看来我想要的是高通滤波器,低通滤波器或移动平均值。我可以使用移动平均线,仅保留最近5个值或任何其他值的历史记录,并在我曾经仅使用最新值的代码下游使用这些值的平均值。
我认为应该很好地消除这些抖动,但是让我感到惊讶的是它的效率可能很低,这可能是适合程序员的已知问题之一,在该问题上确实有一个巧妙的巧数学解决方案。
但是,我是那些糟糕透顶的自学成才的程序员之一,即使没有与CompSci或Math相关的任何内容,也没有丝毫正规教育的经验。稍微读一读表明这可能是高通滤波器或低通滤波器,但我找不到任何可以解释像我这样的黑客的术语,这些算法对值数组的影响是什么,更不用说如何数学有效。例如,这里给出的答案从技术上来说确实回答了我的问题,但仅是对于那些可能已经知道如何解决问题的人来说可以理解的术语。
确实,这将是一个非常可爱而机灵的人,可以用文科毕业生可以理解的方式解释这是什么问题,以及解决方案是如何工作的。
如果您的移动平均线必须很长才能达到所需的平滑度,并且您实际上并不需要任何特定形状的内核,那么使用指数衰减的移动平均线会更好:
a(i+1) = tiny*data(i+1) + (1.0-tiny)*a(i)
在此处选择tiny一个适当的常数(例如,如果选择tiny = 1-1 / N,则其平均数量将与大小为N的窗口相同,但在较旧的点上分布不同)。
tiny
无论如何,由于移动平均值的下一个值仅取决于上一个和您的数据,因此您不必排队或等待任何事情。您可以这样想:“嗯,我有一个新观点,但我并不十分相信,所以我将保留80%的旧估算值,仅相信这个新数据点20%”。这与说“嗯,我只相信这个新点数20%,我会使用我信任相同数量的其他4个点”几乎一样,只是您没有明确地获得其他4个点,而是假设您上次进行的平均很合理,因此您可以使用以前的工作。