【问题标题】:Implementing a digital filter - via convolution or difference equation?实现数字滤波器 - 通过卷积或差分方程?
【发布时间】:2012-01-15 06:38:44
【问题描述】:

我是一位经验丰富的软件工程师,我在大学里参加过一些 EE 课程。我在 iPhone 和 Android 上编程,我想为实时麦克风和加速度计数据实现数字滤波器(例如低通、带通、带阻等)。

我知道有多种等效方法可以在时域样本窗口上实现数字滤波器。我正在研究的两种方法是:

  1. 直接在 C/Java 代码中实现 差分方程(例如 y[i] = y[i-1] + 2 * x[i])。我相信这可以在 O(N) 时间内运行, 其中 N 是样本窗口的长度,例如N=512。

  2. 实现样本窗口和样本窗口之间的卷积 FIR 滤波器的时域表示,通常是某种形式的 sinc 功能。不久前我问过this question。这可以在 O(N lg N) 如果您使用涉及 FFT 和 IFFT 的快速卷积。

现在,通过阅读各种在线资源,我发现 C/Java 编程的首选传统智慧方法是上面的 (1),实现差分方程。这是一个正确的结论吗?

这是我发现的:

总之,我的问题是:

  1. 实现差分方程(而不是通过快速卷积)是在 C/Java 中编写过滤器的方法吗?

  2. 以上参考资料均未说明如何在给定特定截止频率或带阻频率的情况下设计差分方程。我知道我不久前研究过这个。有这种信息的程序员有过滤器参考吗?

【问题讨论】:

  • 三个问题: 1. 如果你实现你的过滤器为 y[n] = x[n] + 2*x[n-1] + 3*x[n-2] + 1*x [n-3],你会称之为差分方程还是卷积? 2. 你想做 IIR 还是 FIR 滤波器? 3.定点还是浮点实现?
  • 1.我认为这是一个差分方程,对吧?卷积运算使用信号和 FFT 值之间的典型乘加运算,而快速卷积使用 FFT 和 IFFT。 2. IIR 或 FIR 无所谓,只要它快,但如果我没记错的话,FIR 总是稳定的,但需要更多的系数。 3. 我猜是浮点数,因为麦克风和加速度计数据可以是浮点数?

标签: android iphone audio signal-processing fft


【解决方案1】:

时域差分方程卷积。您使用基于 FFT 的方法想到的是 频域卷积 又名 快速卷积,这实际上只是一种性能优化 - 它在数学上等同于时域卷积。通常,对于较小的滤波器长度,直接时域卷积更快,而当滤波器长度较大时,频域方法获胜。根据经验,对于一维过滤,“大”意味着 N > 50。

在上面的段落中,我们只讨论了 FIR 滤波器。对于 IIR 滤波器,频域卷积不是一种选择(除非您在某个任意点截断脉冲响应),但通常 IIR 滤波器与 FIR 滤波器相比往往相对较短。

为了生成滤波器系数(即设计滤波器),您通常从滤波器规范开始,然后使用许多现有软件包之一来生成系数。如果你真的想要,你可以实现你自己的过滤器设计例程——看看算法,比如Remez exchange

【讨论】:

  • 我认为差分方程,例如 y[i] = 2 * x[i-1],只对时域信号起作用,其中 x[] 是输入,y[]是输出,如下所示:ccrma.stanford.edu/~jos/fp/Difference_Equation_I.html。另一方面,卷积涉及时域信号和滤波器的系数,运算涉及乘加,即:sum_over_k(x[k] * h[nk]),其中x[]为输入信号和 h[] 包含滤波器系数,如下所示:songho.ca/dsp/convolution/convolution.html。这些不一样,对吧?
  • 当您在右侧只有 x 项和系数而在左侧只有 y 时,它们 是相同的,如上面的示例所示。这只是时域中的 FIR 滤波器。
  • 你是说 (i) 差分方程和 (ii) 带有求和的卷积公式在数学上是等价的吗?我知道它们产生相同的输出,但据我所知,它们是替代途径,实施方式不同。例如,差分方程为 O(n),而卷积为 O(n^2)(或快速卷积为 O(n lg n))。
  • 如果滤波器长度为m,数据长度为n,则每个输出点的复杂度为O(m),n的整个卷积的复杂度- m + 1 个输出点为 O(m*n)。
  • 对于上面的 y[i] = 2 * x[i - 1] 示例,这相当于 2*z^-1 或 h[] = { 0, 2 } 的 Z 变换.
【解决方案2】:

如果满足您的滤波器规范,低阶 IIR 滤波器(使用短差分方程)的计算速度可能比 FIR 卷积或使用 FFT 的快速卷积快得多。它们也类似于电路设计人员可能熟悉的低元件数模拟滤波器。

如果您没有复杂的滤波器规范或要求(在少数极点和零点中无法足够接近地近似),为什么要在 FIR 或 FFT 上消耗更多 CPU 周期?但是,如果您确实需要更专业的过滤器,那么您就需要。

这里有一个非常常用的方法来确定IIR coefficients for biquads。双二阶 IIR 滤波器也可以级联以进行更高阶的滤波。

【讨论】:

    【解决方案3】:

    我将支持使用传统时域数字滤波器的建议,即使用延迟、加法器和乘法器。对于简单的实时过滤,这种方法可能更快且更简单。

    根据目标,在实时应用程序中使用 FFT 可以。例如,如果您想进行实时频谱分析(例如,对于涉及音频的机器学习任务),那么 FFT 可以很好地工作,因为它们快速、简单并且可以提供高频谱分辨率。

    您对 FIR 与 IIR 的评论是正确的。如果您给出一些(示例)滤波器规范,那么我们可能会在选择哪种滤波器类型以及如何定义滤波器抽头(即系数)方面提供更多帮助。例如,如果您可以使用 Matlab 或 Python-Scipy,则可以使用它们来设计您的过滤器。

    (查看dsp.stackexchange 了解有关信号处理的更多信息。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多