给传感器数据来个大变身,三步轻松搞定。为啥要先洗个澡?因为传感器就是面镜子,虽然真实,却也藏着不少抖动和干扰。如果直接拿来用,算法再聪明也得被带跑偏。这“三件套”组合拳就能把大部分毛刺一下子抹平。你可以把最近的数据当成焦点,旧的让它慢慢安静下来,这就叫加权平滑。要想看看哪些地方突然跳了一下,那就反其道而行之,给背景定个固定的权重大约分就行。还有种方法叫移动平均线,给数据配上条记忆项链,把“最近K个”的数据算个平均数就行了。 以Android Sensor API为例,在SensorChanged回调里实现这个过程特别简单。首先你得把最新的X、Y、Z三轴读数拿出来。给个叫ALPHA的系数,范围在0到1之间,这个系数决定了平滑的力度。把这个系数分别套进LowPassX、LowPassY和LowPassZ里跑一遍公式就行。 如果你想抽取突变点,做法也差不多,不过这次要把ALPHA压得特别低。老数据几乎不参与运算了,这样最新的读数就会像探照灯一样亮起来。每次回调时都要先算gravity的值,再拿当前的读数去和上一次的gravity比较。如果差太大超过了阈值,那就是突变发生了。 最后是移动平均线的实现方式。开一个长度为K的小窗口就行了。窗口里面的数据求个平均就是新的平均值。随着窗口滑动旧数据被踢出去,新数据滚进来。最后得到的就是一条“颤抖的直线”。直线抖得厉害说明波动大;直线拉长后噪声就被稀释成一条安静的趋势线。 总结下来就是三步口诀:先平滑让噪声走柔顺的路;再抽取把真正的信号挑出来;后平均把趋势串成项链。把这些写进传感器回调里,不管做什么应用数据质量都能立竿见影地提升。别让那些毛刺毁掉算法了,从今天开始赶紧给数据洗个澡吧!