Orientación de Android Compass en poco confiable (filtro de paso bajo)

Estoy creando una aplicación donde necesito posicionar un ImageView dependiendo de la orientación del dispositivo. Utilizo los valores de los sensores de campo magnético y acelerómetro para calcular la orientación del dispositivo con

SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerValues, magneticFieldValues)
SensorManager.getOrientation(rotationMatrix, values);
double degrees = Math.toDegrees(values[0]);

Mi problema es que el posicionamiento de ImageView es muy sensible a los cambios en la orientación. Hacer que la vista de imagen salte constantemente por la pantalla. (porque los grados cambian)

Leí que esto puede deberse a que mi dispositivo está cerca de cosas que pueden afectar las lecturas del campo magnético. Pero esta no es la única razón por la que parece.

Intenté descargar algunas aplicaciones y descubrí que el "Brújula 3D"y"Brújula"permanece extremadamente estable en sus lecturas (al configurar el filtro de ruido), me gustaría el mismo comportamiento en mi aplicación.

Leí que puedo modificar el "ruido" de mis lecturas agregando un "Filtro de paso bajo", pero no tengo idea de cómo implementar esto (debido a mi falta de matemáticas).

Espero que alguien pueda ayudarme a crear una lectura más estable en mi dispositivo, donde un pequeño movimiento hacia el dispositivo no afectará la orientación actual. Ahora mismo hago un pequeño

if (Math.abs(lastReadingDegrees - newReadingDegrees) > 1) { updatePosition() }

Para filtrar un poco del ruido. Pero no funciona muy bien :)

Respuestas a la pregunta(5)

Su respuesta a la pregunta