有什么经验法则可以平滑 FFT 频谱以防止手动调整时出现伪影吗?
我有一个 FFT 幅度谱,我想从中创建一个滤波器,选择性地通过周期性噪声源(例如正弦波杂散),并将与随机背景噪声相关的频率仓清零。我知道一旦该滤波器 IFFT 返回到时域,频域中的急剧过渡就会产生振铃伪影...所以我想知道是否有任何经验法则如何平滑此类滤波器中的过渡以避免这种情况铃声。
例如,如果 FFT 具有 1M 个频率仓,并且有五个杂散从背景本底噪声中伸出,那么我希望将除与这五个杂散中的每一个相关的峰值仓之外的所有仓清零。问题是如何处理相邻的支线槽以防止时域中的伪影。例如,支线 bin 两侧的 bin 是否应该设置为 50% 幅度?是否应该使用支线箱两侧的两个箱(最接近的一个为 50%,下一个最接近的为 25%,等等)?任何想法都非常感激。谢谢!
I've got a FFT magnitude spectrum and I want to create a filter from it that selectively passes periodic noise sources (e.g. sinewave spurs) and zero's out the frequency bins associated with the random background noise. I understand sharp transitions in the freq domain will create ringing artifacts once this filter is IFFT back to the time domain... and so I'm wondering if there are any rules of thumb how to smooth the transitions in such a filter to avoid such ringing.
For example, if the FFT has 1M frequency bins, and there are five spurs poking out of the background noise floor, I'd like to zero all bins except the peak bin associated with each of the five spurs. The question is how to handle the neighboring spur bins to prevent artifacts in the time domain. For example, should the the bin on each side of a spur bin be set to 50% amplitude? Should two bins on either side of a spur bin be used (the closest one at 50%, and the next closest at 25%, etc.)? Any thoughts greatly appreciated. Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我喜欢以下方法:
我发现它创建了相当平滑的频域结果,尽管我'我从来没有尝试过像你建议的那样锋利的东西。您可能可以使用 Kaiser-Bessel 窗制作更清晰的滤波器,但您必须适当选择参数。通过更锐利,我猜也许您可以将旁瓣减少 6 dB 左右。
这是一些示例 Matlab/Octave 代码。为了测试结果,我使用了
freqz(h, 1, length(h)*10);
。I like the following method:
I find it creates reasonably smooth frequency domain results, although I've never tried it on something as sharp as you're suggesting. You can probably make a sharper filter by using a Kaiser-Bessel window, but you have to pick the parameters appropriately. By sharper, I'm guessing maybe you can reduce the sidelobes by 6 dB or so.
Here's some sample Matlab/Octave code. To test the results, I used
freqz(h, 1, length(h)*10);
.