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

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

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

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

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

Solutions Collecting From Web of "Фильтр нижних частот Android и фильтр высоких частот"

Если вы посмотрите на документацию, вы увидите, что 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 потому что в телефоне есть только один акселерометр, который одновременно измеряет гравитацию и другие силы. У нас есть две разные силы, которые мы хотим найти у одного датчика. Если бы мы могли только смотреть на силы в отдельный момент времени, мы не смогли бы извлечь эту информацию. Однако мы получаем образцы в течение нескольких раз и, глядя на то, как силы меняются со временем, мы можем извлечь информацию.

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

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

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

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

Вы можете ознакомиться с этим руководством по фильтрации нижних частот: 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 

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

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

 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; }