有人可以解释一下如何通过以下公式得出加速度计值的高通滤波?我不需要数学推导,只需对它进行直观的解释即可。
#define kFilteringFactor 0.1 UIAccelerationValue rollingX, rollingY, rollingZ; - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { // Subtract the low-pass value from the current value to get a simplified high-pass filter rollingX = (acceleration.x * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor)); rollingY = (acceleration.y * kFilteringFactor) + (rollingY * (1.0 - kFilteringFactor)); rollingZ = (acceleration.z * kFilteringFactor) + (rollingZ * (1.0 - kFilteringFactor)); float accelX = acceleration.x - rollingX; float accelY = acceleration.y - rollingY; float accelZ = acceleration.z - rollingZ; // Use the acceleration data. }
答案 0 :(得分:14)
虽然其他答案都是正确的,但这是一个简单的解释。使用kFilteringFactor 0.1,您将获取当前值的10%并添加先前值的90%。因此,该值与先前值保持90%的相似性,这增加了其对突然变化的抵抗力。这样可以降低噪音,但也会降低对信号变化的响应能力。为了减少噪音并保持响应,你需要非平凡的过滤器,例如:Complementary,卡尔曼。
答案 1 :(得分:11)
对于函数的调用,rollingX,rollingY,rollingZ值是持久的。它们应在使用前的某个时刻初始化。这些“滚动”值只是输入值的低通滤波版本(也称为“移动平均值”),它们从瞬时值中减去,为您提供高通滤波输出,即您从移动平均线获得当前偏差。
其他解释
移动平均线只是一个粗略的低通滤波器。在这种情况下,它就是所谓的ARMA(自回归移动平均线),而不仅仅是简单的MA(移动平均线)。在DSP术语中,这是一个递归(IIR)滤波器而不是非递归(FIR)滤波器。不管所有术语如何,是的,您可以将其视为平滑函数“ - 它”平滑“所有高频能量并让您对信号的平均值进行缓慢变化的估计。如果您然后减去这个来自瞬时信号的平滑信号然后差异将是你滤出的内容,即高频内容,因此你得到一个高通滤波器。换句话说:high_pass_filtered_signal = signal - smoothed_signal
。
答案 2 :(得分:0)
好的,该代码正在做的是计算低通信号然后减去当前值。
square wave得到两个值5和10的东西。换句话说,它在5到10之间振荡。然后低通信号试图找到平均值(7.5)。然后将高通信号计算为电流值减去平均值,即10 - 7.5 = 2.5或5 - 7.5 = -2.5。
通过将当前值的一部分加到过去的低通值的90%来对过去的值进行积分来计算低通信号。