Как определить ALPHA, постоянную сглаживания фильтра нижних частот

Есть несколько сообщений о том, что данные датчика Android очень шумные, и предложения по реализации алгоритма сглаживания, такого как фильтр нижних частот. Я читаю фильтр нижних частот и обнаружил, что мне нужно рассчитать параметр сглаживания ALPHA. Каждый приходит с разной АЛЬФОЙ. Однако я так сбит с толку, потому что между вики и веб-сайтом разработчика Android нет согласованности.

  • Согласно Wiki http://en.wikipedia.org/wiki/Low-pass_filter

    ALPHA = dT / (dT + RC): dT — скорость доставки события, а RC — постоянная времени фильтра нижних частот.

  • Согласно веб-сайту разработчиков Android http://developer.android.com/guide/topics/sensors/sensors_motion.html

    ALPHA = RC / (RC + dT): dT — скорость доставки события, а RC — постоянная времени фильтра нижних частот.

Две формулы дадут две разные АЛЬФА. Это меня так смущает. Какая формула правильная? Все могли бы дать мне объяснение?

Заранее спасибо.


person Richard Le    schedule 13.05.2014    source источник


Ответы (3)


Предполагается, что фильтр нижних частот пропускает низкие частоты и устраняет высокие частоты. Так что версия из Википедии мне кажется правильной — для низкой частоты dT должно быть большим, для высокой частоты — маленьким.

Тем не менее, я бы посоветовал либо нанять кого-то, кто разбирается в DSP, либо провести дополнительные исследования, прежде чем вслепую внедрять фильтр. Эти вещи довольно сложны, и простой фильтр часто будет иметь негативные побочные эффекты. Вы потратите год или около того на их изучение, если станете инженером-электриком. Шансы сделать это правильно с первого раза довольно низки, если только вы не используете библиотеку. И тогда риск меняется на использование неправильного типа фильтра или неправильную настройку констант.

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

person Gabe Sechan    schedule 13.05.2014

Давайте сравним две версии!

Здесь я использую постоянную времени «тау».

Alpha_A = dt / (dt + tau)
Alpha_B = tau / (tau + dt)

Давайте поместим в него некоторые значения. Давай попробуем:

dt = 0.5, tau = 1;
Alpha_A = 0.5 / (0.5 + 1.0) = 1/3
Alpha_B = 1.0 / (1.0 + 0.5) = 2/3

И поэтому:

Alpha_A = 1 - Alpha_B

Это сводится к тому, как вы определили фильтр нижних частот. Это:

New_Filtered = New_Raw * Alpha + Prev_Filtered * (1-Alpha)

or

New_Filtered = New_Raw * (1-Alpha) + Prev_Filtered * Alpha

IE Alpha работает с необработанными данными напрямую или с предыдущими отфильтрованными данными?

Фактически они делают то же самое!

person ZephDavies    schedule 02.11.2015

Тот, который размещен на сайте Википедии, является правильным, при условии, что конечный пользователь хочет, чтобы альфа (константа сглаживания) была равна 1, когда фильтрация не требуется. Это из классического определения альфа, так что выходные данные итеративного фильтра остаются нефильтрованными, когда альфа = 1.

if ( first_pass ) {
    Vn-1 = 0;
    first_pass = false;
} else {
    Vn+1 = Vn-1 + alpha * (Vn - Vn-1);
    Vn-1 = Vn+1;
    Vn = Vn+1;
}

Обратите внимание, что в приведенном выше итеративном алгоритме Vn+1 всегда остается равным Vn, когда альфа = 1.

Я подозреваю, что альфа, используемая на сайте разработчиков Android, была разработана для обнуления, когда постоянная времени равна нулю. Это может быть задумано, если разработчику Android нужно 0 для константы сглаживания, когда фильтрация не требуется.

person Richard Givis    schedule 11.06.2014