那麼有許多方法來平滑傳感器數據取決於什麼樣的傳感器是,將適合什麼樣的比喻。 我在項目中使用這些算法:
- 高通濾波器[HPF]和低通濾波器[LPF] - 在所選擇的答案表示。
- 移動平均算法-MAA
- Gaely的Algorithmm [爲MAA更好的版本]
- 快速傅立葉變換-FFT
代碼:
HPF,高通濾波器
private float[] highPass(float x, float y, float z) {
float[] filteredValues = new float[3];
gravity[0] = ALPHA * gravity[0] + (1 – ALPHA) * x;
gravity[1] = ALPHA * gravity[1] + (1 – ALPHA) * y;
gravity[2] = ALPHA * gravity[2] + (1 – ALPHA) * z;
filteredValues[0] = x – gravity[0];
filteredValues[1] = y – gravity[1];
filteredValues[2] = z – gravity[2];
return filteredValues;
}
LPF低通濾波器
private float[] lowPass(float x, float y, float z) {
float[] filteredValues = new float[3];
filteredValues[0] = x * a + filteredValues[0] * (1.0f – a);
filteredValues[1] = y * a + filteredValues[1] * (1.0f – a);
filteredValues[2] = z * a + filteredValues[2] * (1.0f – a);
return filteredValues;
}
MAA移動平均
private final int SMOOTH_FACTOR_MAA = 2;//increase for better results but hits cpu bad
public ArrayList<Float> processWithMovingAverageGravity(ArrayList<Float> list, ArrayList<Float> gList) {
int listSize = list.size();//input list
int iterations = listSize/SMOOTH_FACTOR_MAA;
if (!AppUtility.isNullOrEmpty(gList)) {
gList.clear();
}
for (int i = 0, node = 0; i < iterations; i++) {
float num = 0;
for (int k = node; k < node + SMOOTH_FACTOR_MAA; k++) {
num = num + list.get(k);
}
node = node + SMOOTH_FACTOR_MAA;
num = num/SMOOTH_FACTOR_MAA;
gList.add(num);//out put list
}
return gList;
}
非常感謝您!這真的對我有幫助,我現在正在執行代碼,從現在開始,我會幫助像你一樣的人,當然,如果我能的話。 Thax! – Mworks 2011-01-07 00:20:52
移動平均濾波器是低通濾波器的一種特殊情況,它是非常不好的濾波器(就性能而言)。一階低通濾波器通常(通常?)比頻率響應和計算負荷以及程序複雜度方面的移動平均更好。 對於很多應用程序,您可以忽略這些細節,例如可以緩慢響應的指南針顯示,移動平均值會非常好。如果你有一個需要使用噪聲傳感器進行快速響應的遊戲,那麼移動平均值將是一個不好的解決方案,因爲對於給定的濾波量,它會產生滯後。 – Hucker 2011-10-05 14:55:19