Smoothing data from a sensor

前端 未结 5 540
抹茶落季
抹茶落季 2020-11-29 17:06

I have a 3D sensor which measures v(x,y,z) data. I\'m only using the x and y data. Smoothing only x and y would be enough.

If I use a log to show the data, it shows

5条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-29 17:36

    Well there are many ways to smooth sensor data depends what kind of sensor it is and what analogy will suit. I have used these algorithms in my projects:

    1. High Pass Filter[HPF] and Low Pass Filters[LPF]- as expressed in the selected answer.
    2. Moving Average Algorithm -MAA
    3. Gaely's Algorithmm[Better version for MAA]
    4. Fast Fourier Transform -FFT

    Code:

    HPF-High Pass Filter

    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-Low Pass Filter

    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-Moving Average

         private final int SMOOTH_FACTOR_MAA = 2;//increase for better results   but hits cpu bad
    
         public ArrayList processWithMovingAverageGravity(ArrayList list, ArrayList 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;
            }
    

提交回复
热议问题