Мне это тоже показалось немного разочаровывающим, потому что этот фильтр, который вы используете (который довольно распространен), похоже, не работает так хорошо, как вы ожидаете.В конце я решил вычислить средневзвешенное значение для последних 8 образцов акселерометра и использовать его в качестве конечного значения.
проблема заключается в том, что чем больше я взвешиваю старые образцы, тем более плавным будет конечное движение, но задержка будет ощущаться яснее.С другой стороны - чем больше я взвешиваю новые сэмплы - последние движения будут более грязными, но более точными (задержка будет ощущаться все меньше и меньше).
Мое решение состояло в том, чтобы значительно взвесить средние образцыбольше, чем новый или старый, и создать весовую пирамиду.Я обнаружил (не знаю почему, кто-то может объяснить?), Что биномиальный вес Ньютона - лучший.
Проще говоря, в любой момент я добавляю коэффициент дублирования к каждой из последних 8 выборок в соответствии с этим массивом: 1;7;21;35;35;21;7; 1 (значения легко найти с помощью треугольника Паскаля: http://www.mathsisfun.com/pascals-triangle.html).
код выглядит следующим образом:
if ([d count]<8) {
[d addObject:[NSNumber numberWithFloat:acceleration.x]];
}
else{
[d removeObjectAtIndex:0];
[d addObject:[NSNumber numberWithFloat:acceleration.x]];
}
NSMutableArray*binom=[[NSMutableArray alloc] init];
[binom addObject:[NSNumber numberWithInt:1]];
[binom addObject:[NSNumber numberWithInt:7]];
[binom addObject:[NSNumber numberWithInt:21]];
[binom addObject:[NSNumber numberWithInt:35]];
[binom addObject:[NSNumber numberWithInt:35]];
[binom addObject:[NSNumber numberWithInt:21]];
[binom addObject:[NSNumber numberWithInt:7]];
[binom addObject:[NSNumber numberWithInt:1]];
float s=0;
int j=0;
for (NSNumber* n in d){
s+=[n floatValue]*[[binom objectAtIndex:j] intValue];
j++;
}
s=s/128;
s даст вам значение, которое вы должны установить в newX.
сделать то же самое для y и z, чтобы получить полное значение движения.
Надеюсь, это поможет