我是一名有经验的软件工程师,拥有一些大学数码信号处理的知识。我正在开发一个智能手机应用程序来处理信号数据,例如从麦克风(以44100 Hz采样)和加速度计(以32-50 Hz采样)中获取的数据。我的应用程序将用于实现音高检测等功能。
我想在手机上实现低通滤波器(LPF),以消除混叠频率,特别是对于采样率较低的加速度计。 然而,当尝试应用基于快速FFT的卷积方法时,我遇到了矛盾之处。 如果有任何帮助,将不胜感激。
以下是我的推理过程:
我正在读取一个信号,希望使用低通滤波器进行抗混叠(去除混叠频率)。
为了在我的智能手机上实现低通滤波器,我选择将FIR滤波器(即窗函数sinc函数)应用于时域信号。让x[n]是我的信号,f[n]是我的滤波器核系数。因此,我想在x[n]和f[n]之间执行卷积,其中x[n]的长度为N(通常为512),而f[n]的长度为M(通常为256)。
我在我的智能手机(Android和iPhone)上实现了简单的一维卷积。该算法是典型的嵌套循环版本,运行时间为O(N M)。对于N=512和M=256,它在智能手机上运行得太慢了。
然后,我查看了快速卷积算法,它使用FFT并以O(N lgN)的速度运行。具体来说,过滤信号为:filtered x[n] = IFFT(FFT(x) .* FFT(f)),其中FFT是fft,IFFT是逆fft,.*是两个数组的逐元素乘法。
然而,我在该过程中发现了一个矛盾:IFFT(FFT(x) .* FFT(f))。这要求我对x[n]进行FFT,但是x[n]可能具有混叠频率。这正是我在第1步中遇到的初始问题!
注意:一些电子工程师告诉我,一些麦克风内置了硬件低通滤波器,但我不能确定我的智能手机麦克风或加速度计是否有。