使用iPhone加速度计计算步数时过滤错误数据

时间:2012-10-27 18:57:17

标签: iphone objective-c ios

我发现此代码用于计算用户的足迹,但它无法正常工作。它没有显示确切的结果。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    const float violence = 1.2;
    static BOOL beenhere;
    BOOL shake = FALSE;
    if (beenhere) return;
    beenhere = TRUE;
    if (acceleration.x > violence || acceleration.x < (-1* violence))
       shake = TRUE;
    if (acceleration.y > violence || acceleration.y < (-1* violence))
       shake = TRUE;
    if (acceleration.z > violence || acceleration.z < (-1* violence))
       shake = TRUE;
    if (shake) {
       steps=steps+1;
     }
  beenhere = false;
}

它也在检测错误的步骤。如何通过appliyng过滤器删除错误的步骤?

我一直在寻找信息好几天,在这里找到了一些信息:http://www.analog.com/library/analogDialogue/archives/41-03/pedometer.html,但我在应用它时遇到了麻烦。

1 个答案:

答案 0 :(得分:0)

可能有助于获得加速度矢量的大小而不是测试x,或y或z。你为什么不绘制数据并查看它出错的地方?例如,保持一系列加速度矢量幅度,并标记它们触发步骤的位置。像这样:

typedef struct accelData {
    float mag;
    BOOL causedStep;
} accelData;
accelData gAcceleration[kMaxDataPoints];
int i = 0;
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    const float violence = 1.2;
    float magnitudeOfAcceleration = sqrt (acceleration.x*acceleration.x + acceleration.y * acceleration.y + acceleration.z * acceleration.z);
    BOOL shake = magnitudeOfAcceleration > violence;
    gAcceleration[i].mag = magnitudeOfAcceleration;
    if (shake)
    {
        steps++;
        gAcceleration[i].causedStep = YES;
    }
    else
    {
        gAcceleration[i].causedStep = NO;
    }
}

获得此数据后,您可以对其进行分析,并查看导致错误录制步骤的原因。也许您需要对数据进行低通滤波以降低噪声或类似的效果。

相关问题