有很多关于Android传感器数据的帖子非常噪音,并建议实施平滑算法,如低通滤波器。我正在读低通滤波器,我发现我必须计算平滑参数ALPHA。每个人都有不同的ALPHA。但是,我很困惑,因为wiki和Android开发者网站之间并不一致。
根据Wiki http://en.wikipedia.org/wiki/Low-pass_filter
ALPHA = dT /(dT + RC):dT是事件传递速率,RC是低通滤波器的时间常数
根据Android开发者网站http://developer.android.com/guide/topics/sensors/sensors_motion.html
ALPHA = RC /(RC + dT):dT是事件传递速率,RC是低通滤波器的时间常数
两个公式将产生两种不同的ALPHA。这让我很困惑。 哪个公式是正确的?每个人都可以给我解释一下吗?
提前感谢。
答案 0 :(得分:3)
这里我使用时间常数'tau'
Alpha_A = dt / (dt + tau)
Alpha_B = tau / (tau + dt)
我们试试这个:
dt = 0.5, tau = 1;
Alpha_A = 1/3
Alpha_B = 2/3
因此
Alpha_A = 1 - Alpha_B
我认为这取决于他们如何定义等式。是吗:
New_Filtered = New_Raw * Alpha + Prev_Filtered * (1-Alpha)
或
New_Filtered = New_Raw * (1-Alpha) + Prev_Filtered * Alpha
IE是否直接处理原始数据,或以前过滤的数据?
他们有效地做同样的事情。
答案 1 :(得分:0)
低通滤波器应该允许低频并消除高频。所以维基百科版看起来对我来说 - 对于低频率,dT应该很大,对于高频率它应该很小。
但是,我真的建议在盲目实施过滤器之前聘请知道DSP的人或进行更多研究。这些东西非常复杂,简单的过滤器通常会产生负面影响。如果你成为一名电气工程师,你会花一年左右的时间学习这些。除非你使用图书馆,否则第一次自己做正确的几率非常低。然后风险变为使用错误类型的过滤器或将常量配置错误。
维基百科显示的过滤器是最简单的,并且副作用最多,仅供参考。
答案 2 :(得分:0)
维基百科网站上发布的内容是正确的,前提是最终用户希望在不需要过滤时将alpha(平滑常量)等于1。这是来自alpha的经典定义,这样当alpha = 1时,迭代过滤器的输出仍然是未过滤的。
if ( first_pass ) {
Vn-1 = 0;
first_pass = false;
} else {
Vn+1 = Vn-1 + alpha * (Vn - Vn-1);
Vn-1 = Vn+1;
Vn = Vn+1;
}
注意,在上面的迭代算法中,当alpha = 1时,Vn + 1总是等于Vn。
我怀疑Android开发者网站上使用的alpha设计为在时间常数等于零时变为零。如果Android开发人员在没有需要过滤的情况下需要0来获得平滑常数,那么这可能是设计的。