× Initiating database migration review
× Database migration started

Using a damping-filter


About filters

The filter implemented in Blippar's tracking system is a first order low-pass filter that dampens the high frequencies of the rotation and the translation of the marker respective to the device.
Current parameters include the cut-off frequency for the rotation on the three axis X, Y, and Z and the cut-off frequency for the translation relative to the three axis X, Y and Z. The axis convention reflects classical OpenGL ones, with X going toward the right with the device in portrait mode, Y going up and Z going out of the screen towards the user.

As expected for a low-pass filter, the lower is the cut-off frequency, the stronger is the effect of the dampening of the filter. As a drawback, common to every low-pass filter, the lower the cut-off frequency, the less responsive the rotation and translation of the marker are, relative to the device. If a value is not specified, the filter assumes a default of 15 for the relative cut-off frequency, that experimentally shows no effect.

Common general-purpose values for the cut off frequencies for rotation are Rx=1, Ry=1, Rz=5. Very strong values, like Rx=0.1, Ry=0.1, Rz=0.5 show an effective damping and stabilization with a noticeable delay in response. The values for translation, set with parameters Tx, Ty, Tz show usually no particular benefit, but could be used in particular situations.



The code goes in at blipp level as is universal to the whole blipp.
blipp.getMarker().setRotationCutoffFrequency([2, 2, 4.1]);




A minimum filter , just to avoid small bumps or changes in the marker shape from flat (like a soft surface - magazine, newspaper):
  .setRotationCutoffFrequency([2, 2, 4.1]);

A medium filter for tricky surfaces but with a decent amount of tracking points:
  .setRotationCutoffFrequency([2, 1, 0.1])
  .setTranslationCutoffFrequency([5, 5, 1]);

A very strong filter on surfaces that are hard to track on (like a shiny drinks can):
  .setRotationCutoffFrequency([0.5, 0.5, 2.5])
  .setTranslationCutoffFrequency([5, 5, 5]);