【问题标题】:Implementing a low-pass filter in Android application - how to determine the value of alpha?在 Android 应用程序中实现低通滤波器 - 如何确定 alpha 的值?
【发布时间】:2012-11-06 02:14:40
【问题描述】:

实现低通滤波器的算法如下(来自维基百科):

for i from 1 to n
   y[i] := y[i-1] + α * (x[i] - y[i-1])

在哪里

α = T/(tau + T)

T, 是周期,换句话说,是接收数据的时间间隔。并且,tau,是时间常数,定义为:

tau = RC.

好的,一切都清楚了。每个人似乎都对 α 提出了不同的值,但它打败了我——如何才能为这个值做出合乎逻辑的决定?

当然,R 和 C 的值不能使用 - 或者是吗?

有人知道如何确定 tau 的值,进而确定 α 的值吗?

谢谢大家!

【问题讨论】:

  • Alpha 将确定滤波器的截止频率,从而确定通过的频率。您需要确定您对特定应用程序的需求,然后您应该能够找到将频率插入 alpha 函数的示例。
  • 场景是Android应用开发。例如实现指南针。如何确定变量“R”和“C”的值?
  • 正如@user1801819 所说,您需要T 和fc。 T 来自 int getMinDelay() 转换为 Hz,fc 将根据您的应用程序进行调整,也将是 Hz。我确定您已经看过 sensor overview,它包含有关使用传感器数据的信息。
  • T是什么我很清楚,因为我自己设置的。对不起,@Jason,user1801819 错了。您不能仅仅假设时间常数的倒数等于截止频率;我确实对信号和系统有所了解。如果我想调整,那么我就不会在这里提问。我提出这个问题是因为我想得到一个更清晰的定义,以帮助理解如何充分利用这些参数。我还想知道是否有一些公认的标准——我注意到很多人设置 tau = 0.2。我想知道他们为什么这样做。

标签: java android filter signal-processing android-sensors


【解决方案1】:

T:采样周期。

tau:时间常数。

fc:滤波器的截止频率。 fc = 1 / tau

然后

alpha = T / ( T + 1/fc )

最好的问候!

【讨论】:

  • 我知道每个变量代表什么。问题是这样的,你如何确定fc?例如在Android中实现指南针时,你确定fc是谁?
  • 同样感谢@user1801819。但恐怕您的评论根本无法回答我的问题。
【解决方案2】:

我在使用低通滤波器计算罗盘传感器数据的平滑参数 (ALPHA) 时遇到了同样的问题。

我已经弄清楚了,计算出的 ALPHA 值对我的应用很有效。

更多理解和讨论请参考以下帖子

How to calculate the value of the smoothing parameter for lowpass filter (in case of smoothing of compass sensor data)

【讨论】:

    【解决方案3】:

    对于不同的低通滤波器,您可能需要考虑 RBJ 双二阶:

    http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt

    这里详细描述其实现:

    http://blog.bjornroche.com/2012/08/basic-audio-eqs.html

    【讨论】:

      【解决方案4】:

      来自wikipedia's RC time constant entry截止频率 - 时间常数与截止频率 fc 有关,RC 电路的另一个参数

      tau = 1 / (2π * f)
      

      为什么是 2π?来自wikipedia's time constant entry

      ω = 2π * f is the frequency in radians per second.
      

      same entry,Tau 相当于 RC,是系统的上升时间。低上升时间意味着较高频率的输入不会激励系统。很容易想象它与低通滤波器的截止频率相连。最终,它控制有多少反馈信号与新输入信号混合。

      在我的二阶低通滤波器中,我将以下内容用于 alpha。

      α = 1 / (T * tau)
      

      在我的音频应用程序中,二阶滤波器是两个链接的单阶滤波器,我这样计算滤波器输出。 filter1Outfilter2out 是过滤器的当前值,这是收到 input 后的更新。

      filter1Out = filter1Out + (alpha * (input - filter1Out));
      filter2Out = filter2Out + (alpha * (filter1Out - filter2Out));
      

      为了确定您希望 Android 罗盘的截止频率是多少,我首先不会实施任何过滤并尝试使用提供的数据。截止实际上取决于您对信号所做的工作。您是否为屏幕动画平滑它?您是否对其进行平滑以进行路径跟踪?您要拒绝的信号中是否有噪声?每个都可能需要不同的设置。如果未过滤的信号变化太频繁,请计算出您希望它多久改变一次,并将其用作滤波器截止的起点。

      我希望这会有所帮助。 DSP 数学的推导超出了我的技能,但我已经为音频应用实现了几次低通滤波器。

      【讨论】:

      • 为@Jason 的努力干杯。您的意见暂时可以接受。但是,与其过快得出一个简单的结论,我会做更多的思考......因为我会留下这个问题,希望其他人可以提供一个像你一样有趣的论点。
      • 也许你会更幸运地将问题迁移到signal processing,或者通过添加更多关于你正在尝试做的事情的描述以及你使用 0.2 tau 值引用的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2015-05-18
      • 2014-07-29
      • 2016-02-26
      相关资源
      最近更新 更多