代码之家  ›  专栏  ›  技术社区  ›  psihodelia

用FFT代替卷积实现低通滤波器

  •  6
  • psihodelia  · 技术社区  · 15 年前

    实现一个低通FIR滤波器,什么时候应该使用FFT和IFFT而不是时域卷积?

    目标是实现实时计算所需的最低CPU时间。据我所知,FFT的复杂度约为O(n logn),而时域卷积的复杂度为O(n)。要在频域实现低通滤波器,首先要使用FFT,然后将每个值乘以滤波系数(这些系数被转换成频域),然后进行IFFT。

    试图优化现有的源代码(卷积基FIR滤波器),我完全困惑,要么我应该使用FFT或只是优化它使用或不使用SSE。

    2 回复  |  直到 15 年前
        1
  •  10
  •   Peter Tillemans    15 年前

    卷积实际上是O(m*n),其中m是有限冲激响应的宽度,n是采样窗。

    因此,m的临界点(在这里可以改为FFT+IFFT)与采样窗口的log(N)有关。

    现在在这个领域已经做了大量的开发,并且有大量的代码可用,所以尝试一些解决方案和基准测试是这里的关键。

        2
  •  6
  •   Paul R    15 年前

    这取决于您使用的体系结构和其他各种因素,但1D DSP的一般“经验法则”是,如果滤波器的大小很小,比如小于100项,则使用直接卷积可能会更好,但对于较大的滤波器大小,可能值得在频域中进行快速卷积。

    当然,您首先需要确定过滤是一个性能瓶颈,因为如果您的时域实现已经足够快,那么做快速卷积就没有任何意义。

    底线:从简单的直接卷积开始,然后切换到快速卷积 如果 你需要它(您需要保留第一个实现来验证第二个实现,这样无论如何都不会浪费精力。)