센서 상용 알고리즘 처리

1. 센서 를 사용 할 때 우 리 는 센서 데 이 터 를 여러 가지 정리 하여 응용 이 더욱 좋 은 효 과 를 얻 도록 해 야 한다. 다음 에 자주 사용 하 는 간단 한 처리 방법 을 소개 한다.
   1. 가중 부 드 러 움: 부 드 러 움 과 균형 센서 데이터, 우연 한 데이터 돌변 의 영향 감소;
   2. 돌연변이 추출: 정적 과 느 린 변화의 데이터 배경 을 제거 하고 순간 변 화 를 강조 한다.
   3. 간단 한 이동 평균 선: 데이터 흐름 이 가장 가 까 운 K 개의 데 이 터 를 보존 하고 평균 값 을 취한 다.
2. 가중 평활
   사용 알고리즘 은 다음 과 같 습 니 다.
    (새 값) = (이전 값) * (1 - a) + X * a
     그 중에서 a 는 설 정 된 가중치 이 고 X 는 최신 데이터 이 며 프로그램 은 다음 과 같 습 니 다.
float ALPHA = 0.1f;
public void onSensorChanged(SensorEvent event){
    x = event.values[0];
    y = event.values[1];
    z = event.values[2];
   mLowPassX = lowPass(x,mLowPassX);
   mLowPassY = lowPass(x,mLowPassY);
   mLowPassZ = lowPass(x,mLowPassZ);
}
private float lowPass(float current,float last){
   return last * (1.0f - ALPHA) + current * ALPHA;
}

3. 돌연변이 추출
       위의 가중 부 드 러 운 역 알고리즘 을 사용 하 다.       구현 코드 는 다음 과 같 습 니 다:
public void onSensorChanged(SensorEvent event){
    final float ALPHA = 0.8;
    	
    gravity[0] = ALPHA * gravity[0] + (1-ALPHA) * event.values[0];
    gravity[1] = ALPHA * gravity[1] + (1-ALPHA) * event.values[1];
    gravity[2] = ALPHA * gravity[2] + (1-ALPHA) * event.values[2];

    filteredValues[0] = event.values[0] - gravity[0];
    filteredValues[1] = event.values[1] - gravity[1];
    filteredValues[2] = event.values[2] - gravity[2];
}

4. 단순 이동 평균 선
     센서 데이터 흐름 에서 가장 가 까 운 K 개의 데 이 터 를 보존 하고 평균 값 을 되 돌려 줍 니 다.k 는 평균 '창' 의 크기 를 표시 합 니 다.     구현 코드 는 다음 과 같 습 니 다:
public class MovingAverage{
    private float circularBuffer[];    //        K   
    private float avg;                 //         
    private float sum;                 //          
    private float circularIndex;       //           
    private int count;


    public MovingAverage(int k){
         circularBuffer = new float[k];
         count= 0;
         circularIndex = 0;
         avg = 0;
         sum = 0;
    }
    public float getValue(){
         return arg;
    }
    public long getCount(){
       return count;
    }
    private void primeBuffer(float val){
         for(int i=0;i<circularBuffer.length;++i){
               circularBuffer[i] = val;
               sum += val;
         }
    }
    private int nextIndex(int curIndex){
         if(curIndex + 1 >= circularBuffer.length){
                return 0;
          }
          return curIndex + 1;
    }
    public void pushValue(float x){
          if(0 == count++){
               primeBuffer(x);
          }
          float lastValue = circularBuffer[circularIndex];
          circularBuffer[circularIndex] = x;     //          
          sum -= lastValue;                      //           
          sum += x;
          avg = sum / circularBuffer.length;     //         
          circularIndex = nextIndex(circularIndex);
    }
}

비고
참고 자료: < 안 드 로 이 드 센서 고급 프로 그래 밍 >

좋은 웹페이지 즐겨찾기