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

C 用FFT代替卷积实现低通滤波器,c,math,audio,signal-processing,fft,C,Math,Audio,Signal Processing,Fft,在实现低通FIR滤波器时,什么时候应该使用FFT和IFFT而不是时域卷积 目标是实现实时计算所需的最低CPU时间。据我所知,FFT的复杂度约为O(n logn),但时域卷积的复杂度为O(n²)。要在频域中实现低通滤波器,应使用FFT,然后将每个值乘以滤波系数(将其转换为频域),然后进行IFFT 因此,问题是何时使用基于频率的(FFT+IFFT)滤波而不是使用基于直接卷积的FIR滤波器是合理的?比如说,如果一个人有32个定点系数,是否应该使用FFT+IFFT?128个系数怎么样?等等 试图优化现有

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

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

因此,问题是何时使用基于频率的(FFT+IFFT)滤波而不是使用基于直接卷积的FIR滤波器是合理的?比如说,如果一个人有32个定点系数,是否应该使用FFT+IFFT?128个系数怎么样?等等

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

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

因此,m的转折点(在这里,有必要更改为FFT+IFFT)与样本窗口的对数(N)有关

在实时操作中,FFT是面向批处理的这一事实可能比时钟周期的相对数量更重要,因为在滤波之前等待1024个采样点可能是不可接受的,例如,如果应用程序处于调节环路中


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

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

当然,您首先需要确定过滤是一个性能瓶颈,因为如果您的时域实现已经足够快,那么进行快速卷积的所有额外工作都没有意义

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