如何使用快速FFT卷积来实现低通滤波器,如果快速卷积需要一个低通滤波器?

5

我是一名有经验的软件工程师,拥有一些大学数码信号处理的知识。我正在开发一个智能手机应用程序来处理信号数据,例如从麦克风(以44100 Hz采样)和加速度计(以32-50 Hz采样)中获取的数据。我的应用程序将用于实现音高检测等功能。

我想在手机上实现低通滤波器(LPF),以消除混叠频率,特别是对于采样率较低的加速度计。 然而,当尝试应用基于快速FFT的卷积方法时,我遇到了矛盾之处。 如果有任何帮助,将不胜感激。

以下是我的推理过程:

  1. 我正在读取一个信号,希望使用低通滤波器进行抗混叠(去除混叠频率)。

  2. 为了在我的智能手机上实现低通滤波器,我选择将FIR滤波器(即窗函数sinc函数)应用于时域信号。让x[n]是我的信号,f[n]是我的滤波器核系数。因此,我想在x[n]和f[n]之间执行卷积,其中x[n]的长度为N(通常为512),而f[n]的长度为M(通常为256)。

  3. 我在我的智能手机(Android和iPhone)上实现了简单的一维卷积。该算法是典型的嵌套循环版本,运行时间为O(N M)。对于N=512和M=256,它在智能手机上运行得太慢了。

  4. 然后,我查看了快速卷积算法,它使用FFT并以O(N lgN)的速度运行。具体来说,过滤信号为:filtered x[n] = IFFT(FFT(x) .* FFT(f)),其中FFT是fft,IFFT是逆fft,.*是两个数组的逐元素乘法。

  5. 然而,我在该过程中发现了一个矛盾:IFFT(FFT(x) .* FFT(f))。这要求我对x[n]进行FFT,但是x[n]可能具有混叠频率。这正是我在第1步中遇到的初始问题!

那么,我该如何解决这个矛盾呢?如果快速卷积在内部需要低通滤波器,我如何使用快速卷积来实现一个低通滤波器呢?
注意:一些电子工程师告诉我,一些麦克风内置了硬件低通滤波器,但我不能确定我的智能手机麦克风或加速度计是否有。

顺便提一下,如果您正在尝试加速音频应用的卷积过程,请考虑使用分区卷积 - Speedy
5个回答

4
简单来说:计算FFT(x)不会引入混叠。
每次对信号进行采样时都会引入混叠。我认为你困惑的根源在于音频信号有两个采样过程:一次是将连续声音转换为44.1 kHz信号,然后再进行下采样时再次采样。
比如说,如果在30 kHz处有一个杂散的频率:它必须被智能手机的硬件拒绝。一旦你拥有了这些44.1 kHz的样本,你就会被卡住,无法消除采样器通过的任何混叠产物。你不能在采样后消除混叠(这并不是严格意义上的真相,但对于基带信号而言是正确的,这就是你所处理的内容)。你应该继续假设手机设计人员已经做到了这一点,你就不必担心来自高于20 kHz的信号内容的混叠产物。
这就带我们来到第二个采样步骤。你非常正确地指出,在下采样之前需要应用另一个抗混叠滤波器。任何低于20 kHz但高于2倍下采样率的信号内容都会混叠到输出中,除非你先进行衰减。关键在于你在下采样之前计算FFT(x),然后应用滤波器,再进行下采样。这就允许你获得混叠保护的输出。
最可能的是智能手机拥有Δ-Σ ADC,它使用相对温和的模拟抗混叠滤波器,1或2极,然后以极高的速率采样(64 * 44.1 kHz或更高),然后在其下采样过程中应用数字滤波器。MEMS加速度计同样具有内在的抗混叠保护。如果你想测试这一点,请使用连接到电动振荡器(或强大的低音炮锥)的正弦波源来摇晃你的手机,在几千赫兹处观察加速度计信号是否有输出。然后在30 kHz处驱动高音喇叭,看麦克风是否显示任何内容。

你说:“关键是在下采样之前计算FFT(x),然后应用滤波器,再进行下采样。” 这正是我的观点。由于我是通过快速卷积来应用滤波器的,而快速卷积在内部使用FFT(x),因此可能会捕获到混叠频率,导致数据不准确,因此快速卷积的最终输出可能是错误的。 - stackoverflowuser2010
2
ADC后的x将是44.1 kHz和无混叠,对吗?我不确定您为什么认为FFT(x)会引入混叠。只有(重新)采样会引入混叠。在快速卷积中使用带零填充的FFT(x)只是常规卷积的加速,结果是相同的。 - mtrw

3
智能手机上的麦克风在采样之前总是有模拟低通滤波器。如果信号已经出现了混叠,通常情况下将无法去除。因此,每个麦克风的A/D转换器都在模拟域中实现了低通滤波--甚至在离散化之前就已经完成。除非您自己正在以某种方式对信号进行下采样或重采样,否则不必担心混叠。快速卷积和时域离散循环卷积在数学上是等效的,因此如果其中一种没有混叠,则没有理由另一种会出现混叠。

我怎样才能检查我的智能手机上的麦克风和加速度计是否具有模拟低通滤波器?这个信息会不会在各个组件(麦克风和加速度计)的规格说明中提到? - stackoverflowuser2010
3
他们总是使用低通滤波器进行采样,没有任何例外。 - Phonon

1

低通滤波器必须放置在ADC之前,即它必须是某种模拟电路。您无法从采样信号中删除伪影,因为您不知道采样信号的哪个部分是由于混叠引起的,这就是混叠成为问题的全部原因。


0

基于FFT的卷积是一种优化方法,适用于需要低通截止频率低于采样前所需的抗混叠低通滤波器的情况。例如,硬件中有两个低通滤波器和一个软件中的低通滤波器。当这两个低通滤波器可以比一个硬件滤波器更好或更便宜地创建给定的滤波器质量(通带平坦度等)时,通常会这样做。或者如果采样器本身在所需信号以上的频谱中引入噪声(主要是),也会这样做。


0

没有矛盾。X具有高频率。Y = X*F不再具有高频率,因为F过滤(即乘以)它们。


我认为你误解了问题,或者也许是我错了。我正在使用快速FFT卷积实现x*f,而在这个卷积中需要fft(x)。我的担忧是fft(x)似乎捕捉到了混叠频率。 - stackoverflowuser2010

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接