Подтвердить что ты не робот

Фильтр нижних частот Android и фильтр высоких частот

У меня есть очень простой вопрос. Что такое фильтр низких частот и фильтр высоких частот в случае Android Accelerometer?

Когда я вижу выходной сигнал от датчика акселерометра, я вижу, если я не использую фильтр, (случай: я держал свой мобильный телефон в режиме ожидания на столе). Я получаю значение z Axis + ve. Теперь, если я думаю, используя базовую физику, это дает мне точное значение (9.8approx) для малых g i.e Ускорение из-за силы тяжести.

Чтобы получить линейное ускорение, если я добавлю какое-либо усилие к телефону, оно изменит значение Accelerometer, но оно будет g + a, которое я применил. Итак, чтобы получить a, почему я не могу просто вычесть из значения, которое я получаю от Accelerometer?

Какая польза?
Базовое определение, которое я понимаю для низкого прохода: Чтобы разрешить низкое значение, High Pass: разрешить высокое значение. Пожалуйста, помогите мне понять это. Я смущен этим.

4b9b3361

Ответ 1

Если вы посмотрите на документацию, вы увидите, что SensorEvent возвращает массив, представляющий вектор всех сил. http://developer.android.com/reference/android/hardware/SensorEvent.html#values Вот как компоненты ускорения разбиваются на каждую ось:

 values[0] //acceleration on x axis
 values[1] //acceleration on y axis
 values[2] //acceleration on z axis

Вам нужно найти, какое направление гравитации работает, а затем разложить его на его составные части. Величина силы тяжести всегда будет 9,8, но направление и, следовательно, то, как оно разбивается на составные части, изменится. Предполагая, что мы можем получить значение силы тяжести и сохранить этот вектор в массиве вроде gravity[3]:

 gravity[0] //gravity x axis
 gravity[1] //gravity y axis
 gravity[2] //gravity z axis

Общее ускорение, T, на телефоне T = g + a. Чтобы получить просто a нам понадобится a = T - g:

 linear_acceleration[0] = event.values[0] - gravity[0];
 linear_acceleration[1] = event.values[1] - gravity[1];
 linear_acceleration[2] = event.values[2] - gravity[2];

Обратите внимание, как это вычисляет все элемент за элементом, потому что это векторная операция.

Сложная часть находится в поиске gravity, потому что в телефоне есть только один акселерометр, который одновременно измеряет гравитацию и другие силы. У нас есть две разные силы, которые мы хотим найти от одного датчика. Если бы мы могли только смотреть на силы в отдельный момент времени, мы не смогли бы извлечь информацию. Однако мы получаем образцы в течение нескольких раз и, глядя на то, как силы меняются со временем, мы можем извлечь информацию.

Это означает, что нам нужно отфильтровать результаты из одного источника, исходя из того, насколько быстро эти силы меняются. Величина ускорения из-за силы тяжести не изменяется быстро, потому что она вообще не изменяется. Гравитация - постоянная сила. Однако со временем другие силы будут меняться. Если мы отфильтровываем медленно меняющиеся силы, такие как гравитация, используя фильтр верхних частот, то остальные силы являются быстроменяющимися, такими как силы, применяемые к телефону. Вот почему используется фильтр верхних частот.

Ответ 2

Фильтр нижних частот: пропускает низкочастотные сигналы и уменьшает амплитуду сигналов с частотами выше пороговой частоты

Фильтр высоких частот: пропускает высокочастотные сигналы и уменьшает амплитуду сигналов с частотами ниже пороговой частоты

Если вы посмотрите на документацию, в нем говорится:" чтобы измерить реальное ускорение устройства, вклад силы гравитация должна быть устранена, это может быть достигнуто применением высокопрочного фильтра . И наоборот, для выделения силы тяжести можно использовать фильтр нижних частот.

Вы можете проверить этот урок по фильтрации нижних частот: http://www.raweng.com/blog/2013/05/28/applying-low-pass-filter-to-android-sensors-readings/

Чтение документов в http://developer.android.com/reference/android/hardware/SensorEvent.html#values, вы можете видеть, что вы можете получить доступ к значениям a для всех x, y, z, делая:

values[0] - a on x axis
values[1] - a on y axis
values[2] - a on z axis

Ответ 3

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

Ответ 4

Я обычно использую эту формулу. Для фильтрации данных из данных датчика акселерометра, поступающих на данные линейного датчика (например, гироскопа). Используйте его, если вы не уверены, что есть встроенный гироскопический датчик.

private float[] values;
private float[] valuesN;
private float[] prev;
private float[] prevHF;
private boolean doHPF = false;

// ind - index of three dimensions (x, y, z)
private void makeHPFf() {
    for (int ind = 0; ind < 3; ind++) {
        valuesN[ind] = values[ind] * 0.002f * 9.8f;
        if (doHPF)
            values[ind] = valuesN[ind] - prev[ind] + (prevHF[ind] * 0.8f);
        prev[ind] = valuesN[ind];
        prevHF[ind] = values[ind];
    }

    if (!doHPF)
        doHPF = true;
}