首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现数字滤波器-通过卷积还是差分方程?

实现数字滤波器-通过卷积还是差分方程?
EN

Stack Overflow用户
提问于 2011-12-07 18:36:17
回答 3查看 5.8K关注 0票数 3

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

我知道,在时域样本窗口上实现数字滤波器的方法有多种,这是相当的。我正在研究的两种方法是:

  1. 在C/Java代码中直接实现差分方程(例如yi = yi-1 +2* xi)。我相信这可以在O(N)时间内运行,其中N是样本窗口的长度,例如N=512。
  2. 在样本窗口和FIR滤波器的时域表示之间实现卷积,通常是某种形式的正弦函数。不久前我问过这个问题。如果使用涉及FFT和IFFT的快速卷积,这可以在O(N,lg,N)中完成.

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

以下是我的发现:

  • 苹果的加速度计过滤器代码实现了一个差分方程。
  • 如何实现LowPass过滤器?的堆栈溢出问题建议使用差分方程。
  • 低通滤波器上的维基百科文章提供了一种利用差分方程的算法.

总之,我的问题是:

  1. 用C/Java编写过滤器的方法是实现差分方程(而不是通过快速卷积)吗?
  2. 上述参考文献中没有提到如何设计给定特定截止频率或带阻频率的差分方程。我知道我以前学过这个。对于有这类信息的程序员,是否有任何过滤器参考?
EN

回答 3

Stack Overflow用户

发布于 2011-12-07 19:22:42

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

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

以便生成滤波器系数(即。通常从筛选器规范开始,然后使用许多现有软件包中的一个生成系数。您可以实现您自己的过滤器设计例程,如果您真的想-查看算法,如雷米兹交换

票数 3
EN

Stack Overflow用户

发布于 2011-12-07 20:19:23

低阶IIR滤波器(使用短差分方程)可以比FIR卷积或FFT快速卷积更快地计算,如果它们符合您的滤波器规格。它们也类似于电路设计者可能熟悉的低分量模拟滤波器。

如果您没有复杂的过滤器规范或要求(不能在极和零中足够接近),那么为什么在FIR或FFT上消耗更多的CPU周期?但是如果你确实需要一个更专门的过滤器,那么你就需要。

下面是一个非常常用的确定双四角的IIR系数的方法。双四进制IIR滤波器也可以级联进行高阶滤波。

票数 3
EN

Stack Overflow用户

发布于 2011-12-07 19:09:37

我将再次建议使用传统的时域数字滤波器,即使用延迟、加法器和乘法器.对于简单的实时过滤,这种方法可能更快,更不复杂.

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

你对FIR和IIR的评论是正确的。如果您给出了一些(例如)过滤器规范,那么我们可能能够提供更多的帮助来选择哪种过滤器类型,以及如何定义过滤器龙头(即系数)。例如,如果您可以访问Matlab或Python,您可以使用这些工具来设计过滤器。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8420611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档