我正在实现(在软件中)FIR 滤波器。我已经完成了两种实现:卷积一种和基于 FFT/IFFT 的频域乘法。我正在使用标准的 FFT 实现(不是我自己的)和重叠相加处理。
FFT 参数会自动选择如下:,和。
现在我正在测试我的实现。我生成的信号为,其中,和。另外,我通过 windowed-sinc 方法设计了两组抽头:一组用于低通,过渡带为,另一组具有相同过渡带的高通。我尝试过不同的窗口——Hamming、Blackman-Harris 等。
我将这两个滤波器应用于信号,具有卷积和 FFT 实现。低通滤波器在这两种情况下都能很好地工作:当我选择时(通过教科书中的估计公式 - frederic j. harris 的“多速率信号处理”,对于 90dB 衰减,它给了我抽头)我得到了干净的 10Hz来自两种实现的信号(它们在信号的边缘上有所不同,但这是预期的,当然)
但是高通滤波器的行为很奇怪。卷积实现工作。它提供几乎不受干扰的 1000Hz 正弦波。FFT 实现返回一团糟。FFT 滤波的结果看起来像 1000Hz 信号,但它非常损坏 - 相位抖动、幅度抖动等。
看起来,我做错了什么,但我不明白是什么。每本关于使用 FFT 进行 FIR 滤波的教科书、教程和文章都没有提到这样的事情。
哦,我使用的是double,而不是定点算术,所以精度损失应该不是问题。
而且,不,它不是硬件 :)
以下是来自 gnuplot 的图片(«秒»的 1/5):
低通,顶部卷积,向下 FFT:http: //lev.serebryakov.spb.ru/dsp/dsp-low-pass-side-by-side.png
高通,顶部卷积,向下 FFT : http: //lev.serebryakov.spb.ru/dsp/dsp-high-pass-side-by-side.png