2013-12-24 69 views
1

我想用來自加速度計的加速度數據計算Jerk(http://en.wikipedia.org/wiki/Jerk_(physics))和顛簸(http://en.wikipedia.org/wiki/Jounce)。我想我已經搞清楚了,但我不確定自己爲顛簸而做的事是否正確。任何人都可以證實或否認什麼,我做的是給了我正確的價值觀(我需要考慮的時間?)從iPhone加速度計數據計算Jerk和Jounce

#define kFilteringFactor 0.4 
float prevAccelerationX; 
float prevAccelerationY; 
float prevAccelerationZ; 

float prevJerkX; 
float prevJerkY; 
float prevJerkZ; 



- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

prevAccelerationX = 0; 
prevAccelerationY = 0; 
prevAccelerationZ = 0; 

prevJerkX = 0; 
prevJerkY = 0; 
prevJerkZ = 0; 

[self changeFilter:[LowpassFilter class]]; 
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0/kUpdateFrequency]; 
[[UIAccelerometer sharedAccelerometer] setDelegate:self]; 
} 

// UIAccelerometerDelegate method, called when the device accelerates. 
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{ 
float pax = prevAccelerationX; 
float pay = prevAccelerationY; 
float paz = prevAccelerationZ; 

float pjx = prevJerkX; 
float pjy = prevJerkY; 
float pjz = prevJerkZ; 

prevAccelerationX = acceleration.x - ((acceleration.x * kFilteringFactor) + 
            (prevAccelerationX * (1.0 - kFilteringFactor))); 
prevAccelerationY = acceleration.y - ((acceleration.y * kFilteringFactor) + 
            (prevAccelerationY * (1.0 - kFilteringFactor))); 
prevAccelerationZ = acceleration.z - ((acceleration.z * kFilteringFactor) + 
            (prevAccelerationZ * (1.0 - kFilteringFactor))); 

// Compute the derivative (which represents change in acceleration). 
float jerkX = ABS((prevAccelerationX - pax)); 
float jerkY = ABS((prevAccelerationY - pay)); 
float jerkZ = ABS((prevAccelerationZ - paz)); 


prevJerkX = jerkX - ((jerkX * kFilteringFactor) + 
        (prevJerkX * (1.0 - kFilteringFactor))); 
prevJerkY = jerkY- ((jerkY * kFilteringFactor) + 
             (prevJerkY* (1.0 - kFilteringFactor))); 
prevJerkZ = jerkZ - ((jerkZ * kFilteringFactor) + 
             (prevJerkZ * (1.0 - kFilteringFactor))); 

// Compute the derivative (which represents change in acceleration). 
float jounceX = ABS((prevJerkX - pjx)); 
float jounceY = ABS((prevJerkY - pjy)); 
float jounceZ = ABS((prevJerkZ - pjz)); 
} 
+0

您可以使用矢量爲自己節省很多工作。 – Beta

回答

2

爲了計算的衍生物,是的,你需要花時間考慮。基本上你可以用(a2-a1)/採樣時間來估計混亂。它的時間導數是相似的。您使用kFilteringFactor的方式對我來說似乎很奇怪,但可能適用於您的特定採樣時間。你不應該採用ABS(),因爲它對於導數是負數是完全有效的。

但是,一個大問題可能是採樣頻率較低。手機中的採樣頻率通常在60 Hz左右。這意味着加速的實際帶寬爲30 Hz(奈奎斯特頻率)。減半,那就是你的挺舉帶寬。把這個和你的帶寬減半,即7.5赫茲。大致說來。超過15赫茲的所有混亂(仍然是一個有趣的詞),超過7.5赫茲的顛簸不會消失,而是會在結果之上產生別名。所以不僅你錯過了一些信息,你錯過的信息實際上會對你的結果造成更多的損害。正確完成後,您需要在每次派生前進行低通濾波。