title: Accelerometer Low Pass Filtering
body: <p>Still on the BigNerdRanch iOS Development book.</p>
  
  <p>In the Accelerometer chapter, they first implement accelerometer tracking but it's fairly jumpy. They then suggest to apply a low pass filter to it by changing the original code:</p>
  
  <pre><code>- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
  {
      HypnosisView *hv = (HypnosisView *)[self view];
  
      [hv setXShift:10.0 * [acceleration x]];
      [hv setYShift:10.0 * [acceleration y]];
  
      [hv setNeedsDisplay];
  }
  </code></pre>
  
  <p>to this:</p>
  
  <pre><code>- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
  {
      HypnosisView *hv = (HypnosisView *)[self view];
  
      float xShift = [hv xShift] * 0.8 + [accel x] * 2.0;
      float yShift = [hv yShift] * 0.8 + [accel y] * 2.0;
  
      [hv setXShift:xShift];
      [hv setYShift:yShift];
  
      [hv setNeedsDisplay];
  }
  </code></pre>
  
  <p>Fairly simple question: where do they get these values from? I've been looking through the documentation and I found something about low pass filters, which suggests the following code:</p>
  
  <pre><code>   #define kFilteringFactor 0.1
  
  - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
      // Use a basic low-pass filter to keep only the gravity component of each axis.
      accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
      accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
      accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
  
     // Use the acceleration data.
  }
  </code></pre>
  
  <p>However, I first tried with that code and I got an error (by analyzing my app) saying 'the left value of '*' is a garbage value'. My accelerometer tracking didn't work either.</p>
  
  <p>I'm fairly confused as to what these values mean. For example, in the first part of the code, why do they multiply the acceleration values by 10? To get a 'bigger' movement? I could make some sense out of that, but the second code with the low pass filter makes absolutely no sense to me.</p>