2014-01-11 2 views
1

Я пишу приложение Android, которое измеряет высоту при изменении местоположения.Алгоритм сглаживания, который не пропускает кривую колокола

Я хочу, чтобы пользователь поднялся на холм или на холм (на лифте или на горном велосипеде). естественно, когда вы спускаетесь, у вас будут небольшие подъемы, и когда вы поднимаетесь на холм, вы можете немного спуститься.

У меня есть алгоритм сглаживания, который принимает среднее значение из предыдущих десяти значений высоты и среднее значение следующей десяти, а затем сравнивает два для увеличения или уменьшения.

Этот грубоватый эффект, который я ищу, кроме него пропускает кривую колокола, и есть еще некоторые области, где есть провал в общем подъёме, который я не хочу видеть.

статистика не моя сильная сторона, но есть ли лучший способ сгладить эти данные?

вот мой код

qu="SELECT ID,SPEED,ALTITUDE,ISCLIMB from trip_data where tripid="+Tripid+" order by gmttimestamp;"; 
    c= db.rawQuery(qu, null); 
    if(c!=null && c.moveToFirst()) 
    { 
     int av=10; 
     for(int i=av;i<c.getCount()-av;i++) 
     { 

      double prevAlt=0; 
      double nxtAlt=0; 
      for(int b=0;b<av;b++) 
      { 
       c.moveToPosition(i-b); 
       prevAlt+=c.getDouble(2); 
      } 
      prevAlt/=av; 
      lastAlt=curAlt; 
      c.moveToPosition(i); 
      int id=c.getInt(0); 
      curSpeed=c.getDouble(1); 
      curAlt=c.getDouble(2); 
      for(int b=1;b<av+1;b++) 
      { 
       c.moveToPosition(i+b); 
       nxtAlt+=c.getDouble(2); 
      } 
      nxtAlt/=av; 
      int isC=0; 
      Log.i("corrections", "preivous ="+prevAlt+" and the next is "+nxtAlt); 
      db.execSQL("UPDATE TRIP_DATA set PREVALT ="+prevAlt+", NEXTALT="+nxtAlt+", DALT="+(curAlt-lastAlt)+" where id="+id+""); 
      if(nxtAlt>prevAlt) 
      { 
       isC=1; 
      }else 
      { 
       isC=0; 
      } 

      String ins="UPDATE trip_data set ISCLIMB="+isC+" where ID="+id+";"; 
      db.execSQL(ins); 
      Log.i("corrections", ins); 
     } 

ответ

2

Посмотрите на Savitsky-Golay фильтры. Они дают вес каждой точке.

Вы даже можете использовать их для расчета сглаженного 1-го оснований напрямую.

Например, чтобы получить derative с точки i с использованием 5 точки квадратного фильтра (все точки в массиве):

// coefficients for 5 point 1ste derative 
// -2, -1, 0, 1, 2 
// factor = 10 
double derative = (point[x - 2] * -2 + point[x - 1] * -1 + point[x] * 0 + point[x + 1] * 1 + point[x + 2] * 2)/10; 
+0

Есть ли преимущество у меня делает последнее десять ALT (п-1 * 10) + (n-2 * 9)/10! (где! означает факториал, а не не оператор), чтобы дать средневзвешенное значение? пожалуйста, дайте мне знать, если это не то, о чем вы говорите –

Смежные вопросы