Акселерометр низкочастотной фильтрации - PullRequest
8 голосов
/ 04 августа 2011

Все еще в книге разработчиков BigNerdRanch для iOS.

В главе «Акселерометр» сначала реализовано отслеживание акселерометра, но оно довольно нервное. Затем они предлагают применить к нему фильтр нижних частот, изменив исходный код:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    HypnosisView *hv = (HypnosisView *)[self view];

    [hv setXShift:10.0 * [acceleration x]];
    [hv setYShift:10.0 * [acceleration y]];

    [hv setNeedsDisplay];
}

к этому:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    HypnosisView *hv = (HypnosisView *)[self view];

    float xShift = [hv xShift] * 0.8 + [accel x] * 2.0;
    float yShift = [hv yShift] * 0.8 + [accel y] * 2.0;

    [hv setXShift:xShift];
    [hv setYShift:yShift];

    [hv setNeedsDisplay];
}

Довольно простой вопрос: откуда они берут эти значения? Я просматривал документацию и нашел кое-что о фильтрах нижних частот, которые предлагают следующий код:

   #define kFilteringFactor 0.1

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    // Use a basic low-pass filter to keep only the gravity component of each axis.
    accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
    accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
    accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));

   // Use the acceleration data.
}

Тем не менее, я сначала попытался с этим кодом, и я получил ошибку (анализируя мое приложение), говоря, что «левое значение« * »является мусорным значением». Мое отслеживание акселерометра также не работало

Я не совсем понимаю, что означают эти значения. Например, в первой части кода, почему они умножают значения ускорения на 10? Чтобы получить «большее» движение? Я мог бы в этом разобраться, но второй код с фильтром нижних частот не имеет для меня никакого смысла.

Ответы [ 2 ]

14 голосов
/ 10 февраля 2012
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));

Что происходит в этом коде, вы умножаете ускорение в данный момент на коэффициент фильтрации 0,1 и затем добавляете его к отфильтрованному ускорению в последний раз, когда обновление вызывалось на 0,9.

Этоэто в значительной степени получение нового значения и добавление его как 10% от общего значения AcceX, остальные 90% составляют предыдущее значение, которое зависит от значения до этого, которое зависит от значения до этого и так далее.Это исключает высокочастотные значения, поскольку позволяет только 10% любого изменения перейти на новое значение accelX.

KFilteringFactor, равный 0,1, заставляет этот фильтр отключать все высокие частоты.Вы обязательно захотите поэкспериментировать, изменив это значение в соответствии с вашим конкретным приложением.

2 голосов
/ 04 августа 2011

Поскольку вы работаете с Книгой ранчо Большого ботаника, хорошей идеей будет перейти на дискуссионный форум Книги .

Для получения дополнительной информации ознакомьтесь с Статья в Wikepedia о фильтрах нижних частот.

А еще один пример фильтрации смотрите в Apple AccelerometerGraph пример

Также - подумайте, если вы возьмете kFilteringFactorравным 0,2, что дает множители для текущего значения, равного 0,8, что составляет 1 - 0,2, а множитель для нового значения - 2,0, поскольку он равен 0,2 x 10

. Полагаю, 10 - это коэффициент масштабирования, чтобы получить разумное значениезначения.

...