2014-01-11 37 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过滤器。他们重视每一点。

你甚至可以直接使用它们来计算平滑的第一个derative。

例如使用5点二次过滤器(阵列中的所有点)从点i得到derative:

// 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(N-1 * 10) +(n-2 * 9)/ 10! (其中!表示阶乘而不是非算子)来给出加权平均值?请让我知道这不是你在说什么 –