DTW类: public class DTW { List<float> newglist = new ArrayList<float>();// 存放修改过的角速度 float n; int whichMin;//判断abc哪个才是最小的 public float getDistance(List <sensordata> mlist, List <sensordata> slist) { int a=mlist.size(); //获取list的长度 int b=slist.size(); float[][] c = new float[a][b]; //判断是否满足长度限制 if(b>0){ //if(b>0.77*l&&b<1.23*l) //R=30 : x-30 < y < x+30 //i>j-30&&i<j+30 不要长度限制!!!!! for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { float temp = 6*Math.abs((mlist.get(i)).getAcc1()-(slist.get(j)).getAcc1()) + 6*Math.abs((mlist.get(i)).getAcc2()-(slist.get(j)).getAcc2()) + 6*Math.abs((mlist.get(i)).getAcc3()-(slist.get(j)).getAcc3()) + Math.abs((mlist.get(i)).getGyro1()-(slist.get(j)).getGyro1()) + Math.abs((mlist.get(i)).getGyro2()-(slist.get(j)).getGyro2()) + Math.abs((mlist.get(i)).getGyro3()-(slist.get(j)).getGyro3()) ;//temp 即d(i,j) 取绝对值:Math.abs(-123); if (j == 0 && i == 0) c[i][j] = temp*2; else if (i == 0 && j > 0){ if(j<=30) c[i][j] = c[i][j - 1] +temp+5; else c[i][j]=Float.MAX_VALUE; } else if (i > 0) { if (j == 0){ if(i<=30) c[i][j] = temp + c[i - 1][j]+5; else c[i][j]=Float.MAX_VALUE; } else{ if(i>j+30||i<j-30) c[i][j]=Float.MAX_VALUE; else c[i][j] =getMin(c[i][j - 1]+temp+5, c[i - 1][j - 1]+temp*2, c[i - 1][j]+temp+5); } } } } n = c[a-1][b-1]/(a+b);//N(I,J) } else{ n=-1; //因手势时间过长或过短无法验证成功 !!和临界值比较时判断一下小于0就是认证失败!! } return n; } public float getMin(float a, float b, float c) {//定义一个变量存放0,1,2;以此判断abc哪个才是最小的 float min = a; if(b<min if="" c="">b){ min=b; whichMin=1; } else{ min=c; whichMin=2; } } else if(c>min){ min=a; whichMin=0; } else{ min=c; whichMin=2; } return min; } //线性插值方法 public List<float> linearInsert(List<long> acctime,List<long> gyrotime,List<float> alist,List<float> glist){ //如果两个if条件同时存在 if(acctime.get(acctime.size()-1)>gyrotime.get(gyrotime.size()-1)){ for(int q=0;q<acctime.size();q++){ if(gyrotime.get(gyrotime.size()-1)<acctime.get(q)){ for(int w=q;w<alist.size();w&