Android 低通滤波器和高通滤波器

标签 android accelerometer lowpass-filter

我有一个非常基本的问题。 Android加速度计的低通滤波器和高通滤波器是什么?

当我看到加速度计传感器的输出时,我看到如果我不使用任何过滤器,(案例:我的手机在 table 上闲置)我得到 z 轴 +ve 值。现在,如果我认为使用基本物理学,它会为我提供小 g 的精确值(9.8 近似值),即重力加速度。

为了获得线性加速度,如果我对手机施加任何力,它会改变加速度计的值,但我应用的是 g + a。那么要获得 a 为什么我不能直接从我从 Accelerometer 获得的值中减去?

有什么用?
我理解的低通的基本定义:允许低值,高通:允许高值。

最佳答案

如果您查看文档,您将看到 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

手机上的总加速度TT = 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 种不同的力。如果我们只能在一个孤立的时间点查看力,我们将无法提取信息。但是,我们确实会在一段时间内获得样本,并且通过观察力如何随时间变化,我们可以提取信息。

这意味着我们需要根据这些力量变化的速度来过滤掉来自那个来源的结果。重力加速度的大小不会很快改变,因为它根本不会改变。重力是一种恒定的力。然而,其他力量会随着时间而改变。如果我们通过使用高通滤波器过滤掉缓慢变化的力(如重力),那么剩余的力就是快速变化的力,如施加在手机上的力。这就是使用高通滤波器的原因。

关于Android 低通滤波器和高通滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24119672/

相关文章:

android - Volley 在没有 ProgressDialog 的情况下工作,但似乎永远需要它

android - 加速度计传感器速率可以信任吗?

ios - 如何在 iOS 中计算加速度的速度和距离

python - GNU Radio Companion - 如何计算信号的平均功率

matlab - 在 matlab 中实现低通 Daubechies 小波滤波器

android - Theme.MaterialComponents 不会更改对话框标题的字体

java - NullPointerException 为 "getSupportActionBar().setDisplayHomeAsUpEnabled( true )"?

android - Nexus 5 不会在 Eclipse 中显示

ios - 如何在 Delphi XE2 中访问 iOS 加速度计?

matlab - MATLAB 中的低通/带通滤波器设计