Nei*_*end 9 android lowpass-filter android-sensors
我有一个应用程序使用方向数据,使用pre API-8方法使用a Sensor.TYPE_ORIENTAITON.平滑该数据相对容易.
我正在尝试更新代码以避免使用这种已弃用的方法.新的标准方法是Sensor.TYPE_ORIENTATION用a Sensor.TYPE_ACCELEROMETER和Sensor.TYPE_MAGENTIC_FIELD组合替换单个.收到该数据后,将其发送(通过SensorManager.getRotationMatrix())到SensorManager.getOrientation().这(理论上)返回与之相同的信息Sensor.TYPE_ORIENTATION(除了不同的单位和轴方向).
然而,这种方法似乎产生的数据比不推荐的方法(仍然有效)更加紧张(即噪声).因此,如果您在同一设备上比较相同的信息,则不推荐使用的方法提供的噪声数据比当前方法少得多.
如何获得已弃用的方法提供的实际相同(噪声较小)的数据?
让我的问题更清楚一点:我已经阅读了关于这个主题的各种答案,我尝试了各种过滤器:简单的KF/IIR低通,如你所说; 中值滤波器在5到19点之间,但到目前为止,我还没有达到接近手机通过TYPE_ORIENTATION提供的数据平滑度的任何地方.
对传感器输出应用低通滤波器.
这是我的低通滤波器方法:
private static final float ALPHA = 0.5f;
//lower alpha should equal smoother movement
...
private float[] applyLowPassFilter(float[] input, float[] output) {
if ( output == null ) return input;
for ( int i=0; i<input.length; i++ ) {
output[i] = output[i] + ALPHA * (input[i] - output[i]);
}
return output;
}
Run Code Online (Sandbox Code Playgroud)
像这样应用:
float[] mGravity;
float[] mGeomagnetic;
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = applyLowPassFilter(event.values.clone(), mGravity);
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = applyLowPassFilter(event.values.clone(), mGeomagnetic);
if (mGravity != null && mGeomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
azimuth = -orientation[0];
invalidate();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这显然是指南针的代码,删除你不需要的东西.
另外,看看这个SE问题如何使用java实现低通滤波器
| 归档时间: |
|
| 查看次数: |
3783 次 |
| 最近记录: |